Web-Scraping verstehen
Die Datenfülle des Internets ist 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. Die manuelle Datenerfassung ist jedoch definitiv keine gute Idee, da das Volumen 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. Einmal verarbeitet, können sie für Sie oder Ihre Kunden von unschätzbarem Wert sein. Hier sind nur einige Beispiele, wie Web-Scraping genutzt werden kann:
- Preisvergleichstools – Das Scraping mehrerer Websites, um einen Überblick über die Preisgestaltung eines Produkttyps zu erhalten.
- Marktforschung – Ermitteln, wer Ihre wichtigsten Wettbewerber sind und was diese tun.
- Maschinelles Lernen – Sammeln 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 ist 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 das Tool ein und behalten im Blick, wie viele Kalorien sie danach noch zu sich nehmen dürfen.
Allerdings muss das Tool 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 gescrapt werden.
Die Herausforderungen des Web-Scrapings
Während 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 sichtbar sind. Wenn Sie mehrere Anfragen stellen, kann ein Captcha-Code erscheinen und Ihren Web-Scraper lahmlegen.
- IP-Blockierung – Manche Websites blockieren 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 du erhältst Daten, die für eine bestimmte Region gelten, obwohl du Informationen über eine andere Region suchst.
- JavaScript – Die meisten heutigen Websites verwenden auf die eine oder andere Weise JavaScript. Einige zeigen ihre Inhalte dynamisch an, was die Sache kompliziert, 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 zu helfen, haben wir WebscrapingAPI entwickelt, das all diese Probleme löst und Ihnen dabei hilft, Ihre Lösung schneller und mit weniger Kopfzerbrechen zu erstellen.
Das Web verstehen
Immer wenn ein Internetnutzer auf eine Website zugreift, erstellt der Browser eine HTTP-Anfrage (Hypertext Transfer Protocol). Man kann sich eine Anfrage als eine 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.
Für 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 Kopf (Header) und einen Hauptteil (Body), die zum Austausch von Informationen dienen. Außerdem können die Anfragen verschiedene Methoden verwenden, wobei GET die häufigste ist (diese wird beim Aufrufen einer Webseite verwendet). Diese Methoden geben die Aktion an, die der Client ausführen möchte.
Wenn Sie sich beispielsweise auf einer Website registrieren oder Ihr Passwort aktualisieren, möchten Sie, dass Ihre Daten im Browser verborgen bleiben, und Websites können für diese Art von Anfrage die Methode POST oder PUT verwenden.
Der Header einer Anfrage enthält mehrere Eigenschaften. Sehen wir uns die wichtigsten an:
- Host – Der Domainname des Servers.
- User-Agent – Details 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 gestellt, unabhängig von der Seite. Du kannst dir einen Überblick über alle Anfragen verschaffen, die dein Google Chrome-Browser beim Aufrufen einer Webseite stellt, 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, die für Anwendungs-Backends verwendet wird. Es gibt sie 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 mit installiertem PHP benötigt. Da es PHP zudem schon so lange gibt, stehen zahlreiche Ressourcen und Support zur Lösung und Fehlerbehebung von PHP-Fehlern zur Verfügung.
PHP verfügt zudem über viele beliebte Frameworks und CMS (Content Management Systeme), die auf dieser Programmiersprache basieren. Bekannte Beispiele sind WordPress, Drupal, Magento und Laravel.
Dennoch gibt es auch einige Nachteile. Zum Beispiel ist es schwieriger, dynamische Inhalte zu scrapen, als dies mit Python oder JavaScript der Fall ist. Wenn Sie jedoch nur Informationen von einfachen Seiten benötigen, ist PHP definitiv eine gute Lösung, und es kann Ihnen helfen, die gescrapten Daten viel einfacher zu speichern oder abzulegen.
Was du benötigst
Alles klar soweit? Bereit, Ihren ersten Web-Scraper zu erstellen? Bevor Sie beginnen, sollten Sie eine Möglichkeit haben, Ihren PHP-Code auszuführen. Sie können einen Apache/Nginx-Server mit installiertem PHP wählen und den Code direkt über Ihren Browser ausführen, oder Sie können den Code über die Befehlszeile ausführen.
Machen wir uns das Leben leichter, indem wir eine Bibliothek zur Verarbeitung der gescrapten Inhalte verwenden. Einige der beliebten PHP-Scraping-Bibliotheken sind Goutte, Simple HTML DOM, Panther und htmlSQL. Alternativ kannst du die Inhalte auch mit regulären Ausdrücken verarbeiten.
Für diese Anleitung verwenden wir Simple HTML DOM. Für komplexere Anfragen werden wir jedoch auch die PHP-Bibliothek namens CURL verwenden.
Verwendung von Simple HTML DOM
Simple HTML DOM ist eine Bibliothek, die für PHP-Versionen ab 5.6 entwickelt wurde und es uns ermöglicht, auf den Inhalt der Seite auf viel einfachere Weise zuzugreifen – mit Selektoren. Du kannst die Bibliothek hier herunterladen und solltest auch die Dokumentation lesen.
Aus der ZIP-Datei im Download-Link benötigen Sie nur die Datei simple_html_dom.php, die Sie in denselben Ordner legen sollten, in dem Sie den Code für den Scraper schreiben.
Um die Bibliothek in den Code einzubinden, benötigen Sie nur diese eine Zeile Code:
include 'simple_html_dom.php'; // If the library is in another folder you should do include 'path_to_library/simple_html_dom.php'Installation von PHP-CURL
Auch wenn es nicht immer notwendig ist, müssen Sie für komplexere Anfragen unterschiedliche Header senden. Die Verwendung der PHP-CURL-Bibliothek ist dabei hilfreich.
Um sie auf einem Ubuntu-Rechner zu installieren, können Sie 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.
Erstellen eines eigenen Web-Scrapers
Nun, da wir alles haben, was wir brauchen, ist es an der Zeit, Daten zu extrahieren! Zunächst sollten Sie sich für die Website und den Inhalt entscheiden, den Sie scrapen möchten. Für diesen Artikel werden wir die Inhalte aus der Liste der bestbewerteten Filme von IMDB scrapen.
1. Untersuchen 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 auch erforderlich, diesen zu verstehen. Wir müssen zunächst prüfen, wie der Quellcode der Seite aussieht, um zu wissen, welche Elemente wir von der Seite extrahieren müssen.
In Google Chrome kannst du dies tun, indem du mit der rechten Maustaste auf das Element klickst, das du extrahieren möchtest, und dann „Element untersuchen“ auswählst. Dadurch sollte sich in deinem Browser ein Fenster mit dem Quellcode der Seite und den gerenderten Stilen der Elemente öffnen. In diesem Fenster ist der einzige Reiter, den wir überprüfen müssen, „Elemente“, der uns zeigt, wie das HTML-DOM der Seite strukturiert 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 verwenden können. So können wir ausschließlich auf die benötigten Daten zugreifen.
Verwirrt? Keine Sorge, die folgenden Schritte werden Klarheit schaffen.
2. Eine Anfrage von 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.
Erstens können wir die PHP-CURL-Bibliothek verwenden, die es uns auch ermöglicht, die Header und den Body unserer Anfrage zu ändern.
<?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 Option ist ein Einzeiler mit der Methode file_get_contents($url), doch dies kann in manchen Fällen unzureichend sein. Um Header an diese Anfrage zu senden, musst du 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
?>
Sie sollten sich je nach Komplexität des Scrapers, den Sie erstellen möchten, für eine der beiden Methoden entscheiden.
Die beiden oben genannten Codezeilen zeigen den HTML-Quellcode der Seite an, die wir scrapen – denselben, der sichtbar ist, wenn Sie die Website inspizieren. Wir verwenden die erste Codezeile, um die Ergebnisse als text/plain anzuzeigen. Andernfalls wird der Code direkt als HTML gerendert.
Sollten Unterschiede in der HTML-Struktur auftreten, läuft auf der Website ein JavaScript-Code, der den Inhalt ändert, sobald ein Nutzer darauf zugreift. Wir haben weiter unten im Artikel einen Tipp vorbereitet, wie Sie damit umgehen können.
3. Extrahieren der Daten
Von der ausgewählten Seite extrahieren wir nur die Titel der Filme und die jeweils zugehörige Bewertung. Wie wir zuvor gesehen haben, wird der Inhalt in einer Tabelle angezeigt, in der jede Zelle eine eigene Klasse hat.
Damit 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
}
}
?>
Sie können sehen, dass wir den Selektor „table.chart tbody tr“ verwendet haben, um alle Zeilen der Tabelle zu extrahieren. Es ist ratsam, Selektoren zu verwenden, die so spezifisch wie möglich sind, damit Sie die benötigten Elemente von den übrigen unterscheiden können.
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 welche 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. Das liegt daran, dass diese Funktion aus der simple_html_dom-Bibliothek stammt und als Wrapper für die file_get_contents-Funktion fungiert.
4. Exportieren der Daten
In den obigen Beispielen haben wir die Website-Daten gesammelt und direkt auf dem Bildschirm angezeigt. Du kannst die Daten in PHP jedoch auch ganz einfach speichern.
Sie können die gescrapten Daten in einer .txt-Datei, als JSON, als CSV speichern oder sogar direkt an eine Datenbank senden. PHP eignet sich dafür sehr gut. 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
Beim Programmieren in PHP und beim Scrapen von Daten von Websites, die sich jederzeit ändern können, ist es normal, dass Fehler auftreten. Ein guter Code, den Sie zum Debuggen verwenden können, sind die folgenden drei Zeilen, die am Anfang eines beliebigen PHP-Skripts platziert werden:
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
Diese helfen dir, Probleme in deinem Code schneller zu identifizieren und dein Skript bei Bedarf zu aktualisieren.
2. Setzen von Headern in PHP-Anfragen
Manchmal müssen Sie bei einer Anfrage auch einige Header mitsenden. Wenn Sie beispielsweise mit einer API arbeiten, ist möglicherweise 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); // Running the request
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 IMDB extrahiert haben, haben wir die Funktion file_get_html aus simple_html_dom zum Scrapen verwendet. Dieser Ansatz funktioniert bei einfachen Anfragen, aber nicht unbedingt bei komplexeren. Wenn Sie Header senden müssen, sollten Sie besser eine der im vorherigen Tipp beschriebenen Methoden verwenden.
Um diese 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 hat (die Sie in der Datei simple_html_dom.php finden). Beispielsweise darf der Inhalt der Website maximal 600.000 Zeichen umfassen. Wenn Sie diese Grenze ändern möchten, müssen Sie sie lediglich am Anfang Ihres Codes definieren, bevor Sie die simple_html_dom-Bibliothek einbinden:
define('MAX_FILE_SIZE', 999999999);4. Dynamische Inhalte scrapen
Wenn du eine dynamische Website scrapst, musst du darauf zugreifen, wie es ein Browser tun würde. Andernfalls kannst du keine tatsächlichen Daten extrahieren und erhältst stattdessen JS-Code.
Sie müssen einen Browser-Treiber installieren, wie z. B. 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 versuchen, indem Sie die Dokumentation der Panther-Bibliothek lesen.
Eine viel einfachere Lösung ist alternativ 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 rendert gleichzeitig JavaScript. Das Ergebnis: Sie verfügen sofort über einen fortgeschrittenen Scraper, was Entwicklungs- und Wartezeiten verkürzt.
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;Fazit
Herzlichen Glückwunsch, Sie haben es bis zum Ende geschafft! Sie sollten nun alles haben, was Sie benötigen, um Ihren Web-Scraper mit PHP zu erstellen. Während wir in diesem Artikel nur die simple_html_dom-Bibliothek behandelt haben, können Sie auch andere beliebte Bibliotheken ausprobieren und selbst herausfinden, welche besser zu Ihnen passt.
Denken Sie daran, dass sich Websites ständig ändern und ihre Daten über Nacht aktualisiert werden können. Um dies zu erleichtern, können Sie spezifischere Selektoren verwenden. Natürlich gibt es keine Garantie, dass Ihr Scraper für immer funktionieren wird, aber es ist ein Anfang. Deshalb erfordern Web-Scraper kontinuierliche, zeitaufwändige Aktualisierungen.
Wenn du keine Lust hast, all diese Zeit mit Recherchen und der Anpassung deines Codes zu verbringen, kannst du jederzeit die kostenlose Testversion der WebScrapingAPI ausprobieren!




