Verstehen von Web Scraping
Die riesigen Datenmengen im Internet sind bedauerlicherweise auf Milliarden von Websites verteilt. Daher benötigen Entwickler eine Möglichkeit, diese Daten zu sammeln und zu verarbeiten, um den Nutzern neue, innovative Produkte anbieten zu können. Eine manuelle Datenerfassung ist jedoch definitiv keine gute Idee, da das Datenvolumen oft zu groß ist und sich die Daten ständig ändern.
Die Lösung besteht darin, die Daten automatisch zu extrahieren. Das ist, kurz gesagt, die Aufgabe des Web-Scrapings.
Warum Sie Daten scrapen sollten
Mehr Informationen bedeuten mehr Ideen, Chancen und Vorteile. Nach der Aufbereitung können diese für Sie oder Ihre Kunden von unschätzbarem Wert sein. Hier sind nur einige Beispiele dafür, wie Web Scraping eingesetzt werden kann:
- Preisvergleichstools – Das Auslesen mehrerer Websites, um einen Überblick über die Preisgestaltung eines Produkttyps zu erhalten.
- Marktforschung – Erfahren Sie, wer Ihre wichtigsten Wettbewerber sind und was diese tun.
- Maschinelles Lernen – Erfassung von Trainings- und Testdatensätzen für ein Modell des maschinellen Lernens.
- Jede Idee, die den Zugriff auf eine beträchtliche Datenmenge erfordert.
Ein möglicher Anwendungsfall wäre beispielsweise die Entwicklung einer Ernährungs-App, in der Nutzer ihre Mahlzeiten eintragen können. Im Idealfall öffnen die Nutzer einfach die App, suchen nach den Produkten, die sie gegessen haben, fügen diese in die App ein und behalten im Blick, wie viele Kalorien sie danach noch zu sich nehmen dürfen.
Das Tool muss jedoch eine umfassende Liste aller möglichen Produkte und ihrer Nährwerte bereitstellen. Diese Liste kann erstellt und automatisch aktualisiert werden, indem die Nährwertangaben von verschiedenen Websites abgerufen werden.
Die Herausforderungen des Web-Scrapings
Auch wenn Web-Scraping für den Nutzer des Bots sehr praktisch ist, sind Websites manchmal nicht bereit, ihre Inhalte freizugeben, und versuchen möglicherweise, Sie daran zu hindern. Dazu können sie unter anderem folgende Maßnahmen ergreifen:
- Captcha-Codes – Jede Seite kann Captchas verwenden, auch wenn diese nicht angezeigt werden. Wenn Sie mehrere Anfragen stellen, kann ein Captcha-Code erscheinen und Ihren Web-Scraper zum Absturz bringen.
- IP-Sperrung – Manche Websites sperren Ihre IP-Adresse, sobald sie übermäßigen Datenverkehr von Ihrer Seite feststellen.
- Geo-Blockierung – Manche Inhalte sind möglicherweise nur in bestimmten Ländern verfügbar, oder Sie erhalten möglicherweise regionenspezifische Daten, obwohl Sie Informationen über eine andere Region suchen.
- JavaScript – Die meisten heutigen Websites nutzen JavaScript in der einen oder anderen Form. Manche zeigen ihre Inhalte dynamisch an, was die Sache erschwert, da der Quellcode der Seite nicht mit dem gerenderten Seiteninhalt übereinstimmt.
Die Bewältigung dieser Herausforderungen kann viel Arbeit erfordern, aber es gibt Möglichkeiten. Um Ihnen dabei zu helfen, haben wir WebscrapingAPI entwickelt, das all diese Probleme löst und Ihnen dabei hilft, Ihre Lösung schneller und mit weniger Aufwand zu entwickeln.
Das Web verstehen
Immer wenn ein Internetnutzer eine Website aufruft, sendet der Browser eine HTTP-Anfrage (Hypertext Transfer Protocol). Eine Anfrage kann man sich als Nachricht vom Client (dem Computer des Nutzers) an den Server (den Computer, auf dem sich die Website befindet) vorstellen, in der der Client angibt, was er erhalten möchte.
Auf jede gesendete Anfrage erhalten Sie eine Antwort. Die Antwort kann erfolgreich sein oder einen Fehler enthalten, wie zum Beispiel den bekannten Fehlercode „404 – Seite nicht gefunden“. Der Inhalt einer Website befindet sich in der Regel im Hauptteil der vom Server empfangenen Antwort.

Sowohl die Anfragen als auch die Antwort enthalten einen Header und einen Body, über den Informationen ausgetauscht werden. Außerdem können die Anfragen verschiedene Methoden verwenden, wobei GET die gängigste ist (diese wird beim Aufrufen einer Webseite verwendet). Diese Methoden geben an, welche Aktion der Client ausführen möchte.
Wenn Sie sich beispielsweise auf einer Website registrieren oder Ihr Passwort ändern, möchten Sie, dass Ihre Daten im Browser verborgen bleiben, und Websites können für diese Art von Anfrage die Methoden POST oder PUT verwenden.
Der Kopf einer Anfrage enthält mehrere Eigenschaften. Sehen wir uns die wichtigsten davon an:
- Host – Der Domainname des Servers.
- User-Agent – Angaben zum Client, der die Anfrage gestellt hat, wie z. B. Browser und Betriebssystem.
- Cookie – Eine Reihe von Eigenschaften, die mit dem Client verknüpft sind.
- Accept – Ein Parameter, der verwendet wird, um die Antwort vom Server in einem bestimmten Format wie text/plain oder application/json zu empfangen.
Anfragen sind jedoch nicht auf Webseiten beschränkt. Sie werden auch für Bilder, Stile und JavaScript-Code separat von der Seite selbst gestellt. Du kannst dir einen Überblick über alle Anfragen verschaffen, die dein Google Chrome-Browser beim Aufrufen einer Webseite sendet, indem du auf einer Seite die Taste F12 drückst, den Reiter „Netzwerk“ auswählst und die aktuelle Seite aktualisierst. Am Ende solltest du etwa Folgendes sehen:

PHP verstehen
PHP ist eine der ältesten und beliebtesten Web-Programmiersprachen für Anwendungs-Backends. Es gibt sie bereits seit 1995, und mittlerweile ist sie bei ihrer 8. Version angelangt.
Programmierer entscheiden sich für diese Programmiersprache aufgrund ihrer einfachen Syntax und der unkomplizierten Ausführung, da man zum Ausführen von PHP-Code lediglich einen Rechner benötigt, auf dem PHP installiert ist. Da es diese Sprache zudem schon so lange gibt, stehen zahlreiche Ressourcen und Supportmöglichkeiten zur Verfügung, um PHP-Fehler zu beheben und zu debuggen.
PHP bietet zudem zahlreiche beliebte Frameworks und CMS (Content-Management-Systeme), die auf dieser Programmiersprache basieren. Bekannte Beispiele hierfür sind WordPress, Drupal, Magento und Laravel.
Allerdings gibt es auch einige Nachteile. So ist es beispielsweise schwieriger, dynamische Inhalte zu scrapen als mit Python oder JavaScript. Wenn Sie jedoch nur Informationen von einfachen Seiten benötigen, ist PHP definitiv eine gute Lösung, und es kann Ihnen dabei helfen, die gescrapten Daten viel einfacher zu speichern.
Was Sie benötigen
Alles klar soweit? Bist du bereit, deinen ersten Web-Scraper zu erstellen? Bevor du loslegst, solltest du eine Möglichkeit haben, deinen PHP-Code auszuführen. Du kannst einen Apache-/Nginx-Server mit installiertem PHP wählen und den Code direkt in deinem Browser ausführen, oder du kannst den Code über die Befehlszeile ausführen.
Machen wir uns das Leben leichter, indem wir eine Bibliothek zur Verarbeitung der gescrapten Inhalte nutzen. Zu den beliebten PHP-Scraping-Bibliotheken zählen Goutte, Simple HTML DOM, Panther und htmlSQL. Alternativ kannst du die Inhalte auch mithilfe regulärer Ausdrücke verarbeiten.
In dieser Anleitung verwenden wir Simple HTML DOM. Für komplexere Anfragen werden wir jedoch auch die PHP-Bibliothek namens CURL nutzen.
Einfaches HTML-DOM
„Simple HTML Dom“ ist eine Bibliothek, die für PHP-Versionen ab 5.6 entwickelt wurde und es uns ermöglicht, auf viel einfachere Weise auf den Inhalt der Seite zuzugreifen – nämlich mithilfe von Selektoren. Du kannst die Bibliothek hier herunterladen und solltest dir auch die Dokumentation durchlesen.
Aus der ZIP-Datei im Download-Link benötigst du lediglich die Datei „simple_html_dom.php“, die du in denselben Ordner legen solltest, in dem du den Code für den Scraper schreiben wirst.
Um die Bibliothek in den Code einzubinden, brauchst du nur diese eine Zeile Code:
include 'simple_html_dom.php'; // Befindet sich die Bibliothek in einem anderen Ordner, sollten Sie Folgendes eingeben: include 'Pfad_zur_Bibliothek/simple_html_dom.php'PHP-CURL installieren
Auch wenn dies nicht immer erforderlich ist, müssen Sie bei komplexeren Anfragen unterschiedliche Header senden. Die PHP-CURL-Bibliothek kann Ihnen dabei helfen.
Um es auf einem Ubuntu-Rechner zu installieren, kannst du den folgenden Befehl verwenden:
sudo apt-get install php-curl
Vergessen Sie nach der Installation der Bibliothek nicht, Ihren Apache-/Nginx-Server neu zu starten.
Einen eigenen Web Scraper erstellen
Nun, da wir alles haben, was wir brauchen, ist es an der Zeit, Daten zu extrahieren! Zunächst sollten Sie sich für eine Website und die Inhalte entscheiden, die Sie scrapen möchten. In diesem Artikel werden wir die Inhalte aus der Liste der bestbewerteten Filme auf IMDB scrapen.
1. Überprüfen Sie den Inhalt der Website
Die meisten Webinhalte werden mithilfe von HTML angezeigt. Da wir bestimmte Inhalte aus dem HTML-Quellcode extrahieren müssen, ist es erforderlich, diesen zu verstehen. Wir müssen zunächst prüfen, wie der Quellcode der Seite aussieht, um zu wissen, welche Elemente wir aus der Seite extrahieren müssen.
In Google Chrome kannst du dazu mit der rechten Maustaste auf das Element klicken, das du extrahieren möchtest, und dann „Element untersuchen“ auswählen. Daraufhin sollte sich in deinem Browser ein Fenster mit dem Quellcode der Seite und den gerenderten Stilen der Elemente öffnen. In diesem Fenster müssen wir nur den Reiter „Elemente“ überprüfen, der uns zeigt, wie das HTML-DOM der Seite aufgebaut ist.

Beispielsweise enthält die Seite in der obigen Abbildung eine Tabelle mit den Klassen „chart“ und „full-width“. In dieser Tabelle hat jede Zelle ihre eigene Klasse (posterColumn, titleColumn usw.), die wir zur Erstellung eines Selektors nutzen können. So können wir dann nur auf die benötigten Daten zugreifen.
Verwirrt? Keine Sorge, die folgenden Schritte bringen Klarheit.
2. Eine Anfrage über PHP senden
Eine Anfrage zu senden bedeutet in diesem Fall im Grunde genommen, mit PHP-Code direkt auf den HTML-Code einer Seite zuzugreifen. Dafür gibt es zwei Möglichkeiten.
Zunächst können wir die PHP-CURL-Bibliothek verwenden, mit der wir auch die Header und den Textkörper unserer Anfrage anpassen können.
<?php
header("Content-Type: text/plain"); // We choose to display the content as plain text
$ch = curl_init("https://www.imdb.com/chart/top/");
curl_setopt($ch, CURLOPT_HEADER, 0);
$response = curl_exec($ch); // Running the request
if (curl_error($ch)) {
echo curl_error($ch); // Displaying possible errors from the request
} else {
echo $response; // Displaying the content of the response
}
curl_close($ch);
?>
Eine weitere Möglichkeit ist ein Einzeiler unter Verwendung der Methode `file_get_contents($url) `, doch dies kann in manchen Fällen unzureichend sein. Um Header an diese Anfrage zu senden, müssen Sie einen Kontext verwenden, der mit der Methode ` stream_context_create ` erstellt wurde.
<?php
header("Content-Type: text/plain"); // We choose to display the content as plain text
echo file_get_contents('https://www.imdb.com/chart/top/'); // We retrieve and display the contents of the response in a single line
?>
Du solltest dich je nach Komplexität des Scrapers, den du erstellen möchtest, für eine Methode entscheiden.
Die beiden oben genannten Codeausschnitte zeigen den HTML-Quellcode der Seite an, die wir auslesen – denselben, der sichtbar ist, wenn man die Website inspiziert. Wir verwenden die erste Zeile des Codes, um die Ergebnisse als „text/plain“ anzuzeigen. Andernfalls würden sie direkt als HTML dargestellt werden.
Sollten sich Unterschiede in der HTML-Struktur ergeben, wird auf der Website ein JavaScript-Code ausgeführt, der den Inhalt ändert, sobald ein Nutzer die Seite aufruft. Weiter unten im Artikel finden Sie einen Tipp, wie Sie damit umgehen können.
3. Die Daten extrahieren
Von der ausgewählten Seite extrahieren wir lediglich die Titel der Filme und die jeweiligen Bewertungen. Wie wir bereits gesehen haben, werden die Inhalte in einer Tabelle angezeigt, in der jede Zelle eine eigene Klasse hat.
Auf diese Weise können wir alle Zeilen der Tabelle extrahieren. Anschließend durchsuchen wir jede einzelne Zeile nach den Zellen, die uns interessieren.
Der folgende Code sollte genau das bewirken:
<?php
header("Content-Type: text/plain"); // We choose to display the content as plain text
include 'simple_html_dom.php';
$html_dom = file_get_html('https://www.imdb.com/chart/top/'); // We retrieve the contents using file_get_html from simple_html_dom
$table_rows = $html_dom->find('table.chart tbody tr'); // Getting all of the table rows
foreach($table_rows as $table_row) {
$title_element = $table_row->find('.titleColumn a', 0);
$rating_element = $table_row->find('.ratingColumn strong', 0);
if (!is_null($title_element) && !is_null($rating_element)) { // Checking if the row has a title and a rating column
echo $title_element->innertext . ' has rating ' . $rating_element->innertext . PHP_EOL; // If it does then we print it
}
}
?>
Wie du sehen kannst, haben wir den Selektor„table.chart tbody tr“verwendet, um alle Zeilen der Tabelle zu extrahieren. Es empfiehlt sich, möglichst spezifische Selektoren zu verwenden, damit du die benötigten Elemente von den übrigen unterscheiden kannst.
Nachdem wir die Zeilen abgerufen hatten, durchliefen wir sie in einer Schleife und suchten nach Elementen mit der Klasse „titleColumn“ oder „ratingColumn“. Wenn der Code solche Elemente fand, zeigte er deren „innerText“-Eigenschaft an.
Es ist wichtig zu beachten, dass wir in diesem Beispiel „file_get_html“ anstelle von „file_get_contents“ verwendet haben. Der Grund dafür ist, dass diese Funktion aus der Bibliothek „simple_html_dom“ stammt und als Wrapper für die Funktion „file_get_contents“ fungiert.
4. Die Daten exportieren
In den obigen Beispielen haben wir die Standortdaten erfasst und direkt auf dem Bildschirm angezeigt. Sie können die Daten jedoch auch ganz einfach in PHP speichern.
Du kannst die gesammelten Daten in einer TXT-Datei, als JSON oder als CSV speichern oder sie sogar direkt an eine Datenbank senden. PHP eignet sich dafür hervorragend. Wir müssen sie lediglich in einem Array speichern und den Inhalt des Arrays in eine neue Datei schreiben.
<?php
include 'simple_html_dom.php';
$scraped_data = [];
$html_dom = file_get_html('https://www.imdb.com/chart/top/'); // We retrieve the contents using file_get_html from simple_html_dom
$table_rows = $html_dom->find('table.chart tbody tr'); // Getting all of the table rows
foreach($table_rows as $table_row) {
$title_element = $table_row->find('.titleColumn a', 0);
$rating_element = $table_row->find('.ratingColumn strong', 0);
if (!is_null($title_element) && !is_null($rating_element)) { // Checking if the row has a title and a rating column
$scraped_data[] = [
'title' => $title_element->innertext,
'rating' => $rating_element->innertext,
];
}
}
file_put_contents('file.json', json_encode($scraped_data)); // Saving the scraped data in a .json file
// Saving the scraped data as a csv
$csv_file = fopen('file.csv', 'w');
fputcsv($csv_file, array_keys($scraped_data[0]));
foreach ($scraped_data as $row) {
fputcsv($csv_file, array_values($row));
}
fclose($csv_file);
?>
Der obige Code verwendet denselben Inhalt, den wir zuvor extrahiert haben, und erstellt zwei Dateien – eine CSV- und eine JSON-Datei – mit allen bestbewerteten Filmen und ihren Bewertungen.
Tipps und Tricks
1. Fehlerbehandlung
Wenn man in PHP programmiert und Daten von Websites ausliest, die sich jederzeit ändern können, kommt es häufig zu Fehlern. Ein nützlicher Codeabschnitt, den man zum Debuggen verwenden kann, sind die folgenden drei Zeilen, die man am Anfang eines beliebigen PHP-Skripts einfügt:
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
Damit können Sie Probleme in Ihrem Code schneller erkennen und Ihr Skript bei Bedarf anpassen.
2. Setzen von Headern in PHP-Anfragen
Manchmal müssen Sie bei einer Anfrage möglicherweise auch einige Header mitsenden. Wenn Sie beispielsweise mit einer API arbeiten, ist unter Umständen ein Autorisierungstoken erforderlich, oder Sie möchten, dass der Inhalt als JSON statt als Klartext zurückgegeben wird. Sie können Header sowohl mit curl als auch mit file_get_contents hinzufügen. So geht das mit curl:
$ch = curl_init("http://httpbin.org/ip");
curl_setopt($ch, CURLOPT_HEADER, [
'accept: application/json'
]);
$response = curl_exec($ch); // Anfrage ausführen
Und für `file_get_contents`:
$opts = [
"http" => [
"method" => "GET",
"header" => "accept: application/json\r\n"
]
];
$context = stream_context_create($opts);
$result = file_get_contents("http://httpbin.org/ip", false, $context);3. Verwendung von curl oder file_get_contents mit simple_html_dom
Als wir Inhalte aus der IMDB extrahierten, haben wir zum Scraping die Funktion `file_get_html` aus `simple_html_dom` verwendet. Dieser Ansatz funktioniert bei einfachen Anfragen, jedoch nicht unbedingt bei komplexeren. Wenn Sie Header senden müssen, sollten Sie besser eine der im vorherigen Tipp beschriebenen Methoden verwenden.
Um sie anstelle von `file_get_html` zu verwenden, extrahieren Sie einfach den Inhalt und wandeln Sie ihn dann mit `str_get_html` in ein DOM-Objekt um, etwa so:
$opts = [
"http" => [
"method" => "GET",
"header" => "accept: text/html\r\n"
]
];
$context = stream_context_create($opts);
$result = file_get_contents("https://www.imdb.com/chart/top/", false, $context);
$html_dom = str_get_html($result);
Beachten Sie außerdem, dass „simple_html_dom“ standardmäßig einige Einschränkungen aufweist (diese finden Sie in der Datei „simple_html_dom.php“). So darf der Inhalt der Website beispielsweise maximal 600.000 Zeichen umfassen. Wenn Sie diese Begrenzung ändern möchten, müssen Sie sie lediglich am Anfang Ihres Codes festlegen, bevor Sie die „simple_html_dom“-Bibliothek einbinden:
define('MAX_FILE_SIZE', 999999999);4. Auslesen dynamischer Inhalte
Wenn du eine dynamische Website ausliest, musst du wie ein Browser darauf zugreifen. Andernfalls kannst du keine tatsächlichen Daten extrahieren und erhältst stattdessen JavaScript-Code.
Sie müssen einen Browser-Treiber installieren, beispielsweise „chromium-chromedriver“ oder „firefox-geckodriver“. Das Extrahieren dynamischer Inhalte in PHP ist ein fortgeschritteneres Thema, aber wenn Sie daran interessiert sind, können Sie es anhand der Dokumentation der Panther-Bibliothek ausprobieren.
Eine wesentlich einfachere Lösung ist hingegen die Verwendung der WebScrapingAPI, die die meisten Probleme aus dem Weg räumt. Die API umgeht IP-Sperren und Captchas durch die Nutzung unseres Proxy-Netzwerks und führt gleichzeitig JavaScript aus. Das Ergebnis: Sie verfügen sofort über einen leistungsstarken Scraper, wodurch sich Entwicklungs- und Wartezeiten verkürzen.
Hier ist ein Code-Beispiel, das den Inhalt von https://httpbin.org/ip direkt in PHP über unsere API anzeigt:
$content =
file_get_contents("https://api.webscrapingapi.com/v1?pi_key=YOUR_API_KEY&url=". urlencode('https://httpbin.org/ip'));
echo $content;Schlussfolgerung
Herzlichen Glückwunsch, du hast es bis zum Ende geschafft! Du solltest nun alles haben, was du brauchst, um deinen Web-Scraper mit PHP zu erstellen. Auch wenn wir in diesem Artikel nur die Bibliothek „simple_html_dom“ behandelt haben, kannst du andere beliebte Bibliotheken ausprobieren und selbst herausfinden, welche am besten zu dir passt.
Denken Sie daran, dass sich Websites ständig ändern und ihre Daten über Nacht aktualisiert werden können. Um dem entgegenzuwirken, können Sie spezifischere Selektoren verwenden. Das ist natürlich keine Garantie dafür, dass Ihr Web-Scraper für immer funktioniert, aber es ist ein Anfang. Aus diesem Grund erfordern Web-Scraper kontinuierliche, zeitaufwändige Aktualisierungen.
Wenn du keine Lust hast, so viel Zeit mit der Recherche und der Anpassung deines Codes zu verbringen, kannst du jederzeit die kostenlose Testversion der WebScrapingAPI ausprobieren!




