Web-Scraping: Python oder PHP?

Finden Sie heraus, welche Sprache ein effizienteres und wartungsfreundlicheres Web-Scraping-Erlebnis bietet.
4 min lesen
PHP vs Python blog image

Python ist weltweit die mit Abstand dominierende Sprache für Web-Scraping. Das war nicht immer so. In den späten 1990er und frühen 2000er Jahren wurde Web-Scraping fast ausschließlich in Perl und PHP durchgeführt.

Heute werden wir Python mit einem der Titanen der Webentwicklung aus der Vergangenheit, PHP, vergleichen. Wir werden einige Unterschiede zwischen den beiden Sprachen durchgehen und sehen, welche die bessere Erfahrung beim Web-Scraping bietet.

Voraussetzungen

Wenn Sie mitmachen möchten, müssen Sie Python und PHP installiert haben. Klicken Sie auf die jeweiligen Download-Links und folgen Sie den Anweisungen für Ihr Betriebssystem.

  • Python
  • PHP

Sie können die Installation beider Sprachen mit den folgenden Befehlen überprüfen.

Python

python --version

Sie sollten eine Ausgabe wie diese sehen.

Python 3.10.12

PHP

php --version

Hier ist die Ausgabe.

PHP 8.3.14 (cli) (built: Nov 25 2024 18:07:16) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.14, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.14, Copyright (c), by Zend Technologies

Grundlegende Kenntnisse beider Sprachen wären hilfreich, sind aber keine Voraussetzung. Tatsächlich habe ich bis jetzt noch nie PHP geschrieben!

Vergleich zwischen Python und PHP für Web-Scraping

Bevor wir unser Projekt erstellen, müssen wir uns jede dieser Sprachen etwas genauer ansehen.

  • Syntax: Python hat eine besser lesbare Syntax und ist weit verbreitet, insbesondere in der Daten-Community.
  • Standardbibliothek: Beide Sprachen bieten umfangreiche Standardbibliotheken.
  • Scraping-Frameworks: Python hat eine viel größere Auswahl an Scraping-Frameworks.
  • Leistung: PHP bietet in der Regel höhere Geschwindigkeiten, da es für die Ausführung im Web entwickelt wurde.
  • Wartung: Python ist aufgrund seiner klaren Syntax und der starken Unterstützung durch die Community in der Regel einfacher zu warten.
Funktion Python PHP
Benutzerfreundlichkeit Anfängerfreundlich und leicht zu erlernen Für neue Entwickler schwieriger
Standardbibliothek Umfangreich und voller Funktionen Umfangreich und voller Funktionen
Scraping-Tools Viele Scraping-Tools von Drittanbietern Viel kleineres Ökosystem
Datenunterstützung Auf Datenverarbeitung ausgelegt Grundlegende Bibliotheken und Tools verfügbar
Community Große Communities und Support Kleinere Communities mit eingeschränktem Support
Wartung Einfach zu warten, weit verbreitet Schwierig, Programmierer sind schwer zu finden

Was soll gescrapt werden?

Da es sich nur um eine Demonstration handelt und wir eine Website wollen, die für Benchmarking konsistent bleibt, verwenden wir quotes.toscrape.com. Diese Website bietet uns konsistente Inhalte und blockiert keine Scraper. Sie ist perfekt für Testfälle geeignet.

In der Abbildung unten sehen Sie eines der Zitat -Elemente auf der Seite. Es handelt sich um ein div-Element mit der Klasse „quote”. Zunächst müssen wir alle diese Elemente finden.

inspecting the quote on quotes to scrape

Sobald wir alle Zitat-Karten auf der Seite gefunden haben, müssen wir einzelne Elemente aus jeder Karte extrahieren.

Der Text ist in einem span -Element mit der Klasse „text” eingebettet.

inspecting the text span of the quote

Jetzt müssen wir den Autor ermitteln. Dieser befindet sich in einem kleinen Element mit der Klasse „author”.

Inspecting the author on quotes to scrape

Zuletzt extrahieren wir die Tags. Diese befinden sich in einem Element mit der Klasse „tag ”.

The tags inside the tag class

Da wir nun wissen, welche Daten wir benötigen, können wir loslegen.

Erste Schritte

Jetzt ist es an der Zeit, alles einzurichten. Wir benötigen einige Abhängigkeiten sowohl für Python als auch für PHP.

Python
Für Python müssen wir Requests und BeautifulSoup installieren.

Beide können wir mit pip installieren.

pip install requests
pip install beautifulsoup4

PHP

Anscheinend sollten alle diese Abhängigkeiten bereits mit PHP vorinstalliert sein. Als ich sie jedoch verwenden wollte, waren sie nicht vorhanden.

sudo apt install php-curl
sudo apt install php-xml

Nachdem wir unsere Abhängigkeiten installiert haben, können wir mit dem Codieren beginnen.

Scraping der Daten

Ich begann damit, den folgenden Scraper in Python zu schreiben. Der folgende Code sendet eine Reihe von Anfragen an quotes.toscrape.com. Er extrahiert den Text, den Namen und den Autor aus jedem Zitat. Sobald alle Zitate abgerufen wurden, schreiben wir sie in eine JSON-Datei. Sie können den Code gerne kopieren und in Ihre eigene Python-Datei einfügen.

Python

import requests
from bs4 import BeautifulSoup
import json

page_number = 1
output_json = []

while page_number <= 5:

    response = requests.get(f"https://quotes.toscrape.com/page/{page_number}")
    soup = BeautifulSoup(response.text, "html.parser")    

    divs = soup.select("div[class='quote']")

    for div in divs:
        tags = []
        quote_text = div.select_one("span[class='text']").text
        author = div.select_one("small[class='author']").text
        tag_holders = div.select("a[class='tag']")
        for tag_holder in tag_holders:
            tags.append(tag_holder.text)

        quote_dict = {
            "author": author,
            "quote": quote_text.strip(),
            "tags": tags
        } 
        output_json.append(quote_dict)

    page_number+=1

with open("quotes.json", "w") as file:
    json.dump(output_json, file, indent=4)

print("Scraping complete. Quotes saved to quotes.json.")
  • Zunächst legen wir Variablen für page_number und output_json fest.
  • Während page_number <= 5 den Scraper anweist, seine Arbeit fortzusetzen, bis wir 5 Seiten gescrapt haben.
  • response = requests.get(f"https://quotes.toscrape.com/page/{page_number}") sendet eine Anfrage an die Seite, auf der wir uns befinden.
  • Wir finden alle unsere Ziel -Div- Elemente mit divs = soup.select("div[class='quote']").
  • Wir durchlaufen die divs und extrahieren ihre Daten:
    • quote_text: div.select_one("span[class='text']").text
    • author: div.select_one("small[class='author']").text
    • tags: Wir finden alle tag_holder-Elemente und extrahieren dann ihren Text einzeln.
  • Sobald wir damit fertig sind, speichern wir das output_json- Array in einer Datei und geben eine Meldung an das Terminal aus (print()).

Hier sind Screenshots von einigen unserer Durchläufe. Wir haben mehr Durchläufe durchgeführt, aber der Kürze halber verwenden wir hier eine Stichprobengröße von 3 Durchläufen.

Durchlauf 1 dauerte 11,642 Sekunden.

Python run #1 - took 11.642 seconds

Durchlauf 2 dauerte 11,413 Sekunden.

Python run #2 - took 11.413 seconds

Durchlauf 3 dauerte 10,258 Sekunden.

Python run #3 - took 10.258 seconds

Unsere durchschnittliche Laufzeit mit Python beträgt 11,104 Sekunden.

PHP

Nachdem ich den Python-Code geschrieben hatte, bat ich ChatGPT, ihn für mich in PHP umzuschreiben. Zunächst funktionierte der Code nicht, aber nach einigen kleinen Änderungen war er einsatzfähig.

<?php
$pageNumber = 1;
$outputJson = [];

while ($pageNumber <= 5) {
    $url = "https://quotes.toscrape.com/page/$pageNumber";
    $ch = curl_init($url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

    $response = curl_exec($ch);
    curl_close($ch);

    if ($response === false) {
        echo "Fehler beim Abrufen der Seite $pageNumbern";
        break;
    }

    $dom = new DOMDocument();
    @$dom->loadHTML($response);
    $xpath = new DOMXPath($dom);

    $quoteDivs = $xpath->query("//div[@class='quote']");

    foreach ($quoteDivs as $div) {
        $quoteText = $xpath->query(".//span[@class='text']", $div)->item(0)->textContent ?? "";

        $author = $xpath->query(".//small[@class='author']", $div)->item(0)->textContent ?? "";

        $tagElements = $xpath->query(".//a[@class='tag']", $div);
        $tags = [];
        foreach ($tagElements as $tagElement) {
            $tags[] = $tagElement->textContent;
        }

        $outputJson[] = [
            "author" => trim($author),
            "quote" => trim($quoteText),
            "tags" => $tags
        ];
    }

    $pageNumber++;
}

$jsonData = json_encode($outputJson, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
file_put_contents("quotes.json", $jsonData);

echo "Scraping abgeschlossen. Zitate in quotes.json.n gespeichert";
  • Ähnlich wie beim Python-Code beginnen wir mit den Variablen pageNumber und outputJson.
  • Wir verwenden eine while -Schleife, um die Laufzeit des eigentlichen Scrapings festzuhalten: while ($pageNumber <= 5).
  • $ch = curl_init($url); richtet unsere HTTP-Anfrage ein. Wir verwenden curl_setopt(), um Weiterleitungen zu verfolgen.
  • $response = curl_exec($ch); führt die HTTP-Anfrage aus.
  • $dom = new DOMDocument(); richtet ein neues DOM- Objekt ein, das wir verwenden können. Dies ähnelt der früheren Verwendung von BeautifulSoup().
  • Wir erhalten unsere Divs, indem wir ihren Xpath anstelle ihres CSS-Selektors verwenden: $quoteDivs = $xpath->query("//div[@class='quote']");
  • $quoteText = $xpath->query(".//span[@class='text']", $div)->item(0)->textContent ?? ""; liefert den Text aus jedem Zitat.
  • $author = $xpath->query(".//small[@class='author']", $div)->item(0)->textContent ?? ""; gibt uns den Autor.
  • Wir erhalten unsere Tags, indem wir erneut alle Tag-Elemente suchen und sie mit einer Schleife durchlaufen, um ihren Text zu extrahieren.
  • Schließlich speichern wir unsere Ausgabe in einer JSON-Datei und geben eine Meldung auf dem Bildschirm aus.

Hier sind unsere Ausführungsergebnisse mit PHP.

Lauf 1 dauerte 11,351 Sekunden.

PHP run #1 - took 11.351 seconds

Lauf 2 dauerte 9,846 Sekunden.

PHP run #2 - took 9.846 seconds

Durchlauf 3 dauerte 9,795 Sekunden.

PHP run #3 - took 9.795 seconds

Unser PHP-Durchschnitt lag bei 10,33 Sekunden.

Bei weiteren Tests lieferte PHP weiterhin schnellere Ergebnisse … manchmal sogar nur 7 Sekunden!

Erwägen Sie die Verwendung von Bright Data

Wenn Ihnen die obigen Abschnitte gefallen haben, schreiben Sie Web-Scraper! Wenn Sie Ihren Lebensunterhalt mit dem Extrahieren von Daten verdienen, sind Dinge wie die oben genannten genau die Art von Code, die Sie ständig schreiben werden!

Wir bieten eine Vielzahl von Produkten, mit denen Sie Ihre Scraper robuster machen können.Der Scraping-Browserbietet Ihnen einen Remote-Browser mit integrierter Proxy-Integration und JavaScript-Rendering. Wenn Sie nur Proxys und CAPTCHA-Lösungen ohne Browser wünschen, verwenden SieWeb Unlocker.

Scraper sind nicht für jeden geeignet.

Wenn Sie nur Ihre Daten abrufen und mit Ihrem Tag weitermachen möchten, schauen Sie sich unsere Datensätze an.Wir übernehmen das Scraping, damit Sie es nicht tun müssen.Schauen Sie sich unseregebrauchsfertigen Datensätze an. Unsere beliebtesten Datensätze sind LinkedIn, Amazon, Crunchbase, Zillow und Glassdoor. Sie können sich kostenlos Beispieldaten ansehen und Berichte im CSV- oder JSON-Format herunterladen.

Fazit

Mit einer durchschnittlichen Geschwindigkeit von 11,104 Sekunden in Python und 10,33 Sekunden in PHP war unser PHP-Scraper durchweg schneller als der Python-Scraper. Ein Teil davon könnte auf die Latenz des Servers zurückzuführen sein, aber in weiteren Tests schlug PHP Python weiterhin bei fast jedem einzelnen Durchlauf.

Während es Python in puncto Geschwindigkeit definitiv übertrifft, gilt dies nicht unbedingt für die Syntax. Nicht viele Entwickler fühlen sich heute mit der Syntax von Sprachen wie PHP oder Perl wohl. Es handelt sich dabei um Skriptsprachen von gestern. Hinzu kommt, dass Ihr Team möglicherweise nicht mit PHP vertraut ist. Es erfordert einen besonderen Programmierer, um diese Art von Code ständig zu schreiben und Legacy-Anwendungen am Laufen zu halten.

Bringen Sie Ihre Scrape-Ops mit Bright Data auf die nächste Stufe. Melden Sie sich jetzt an und testen Sie gratis!