29. Oktober 2023
JavaScript-generierte Websites crawlen („Scraping“)
Das Crawlen oder Scrapen externer Websites ist ein spannendes Thema und ermöglicht viele coole Anwendungen. In der Vergangenheit habe ich zum Crawlen die PHP-Funktion „file_get_contents()“, in Kombination mit SimpleHTMLDom oder DOMXPath, eingesetzt. Das funktioniert auch wunderbar, wenn die gewünschten Daten auf dem Server generiert und als statische HTML-Dateien an den Browser des Benutzers gesendet werden.
Seit einigen Jahren gibt es jedoch den Trend, das Generieren der Inhalte Client-seitig stattfinden zu lassen. Das macht das Crawlen mit reinem PHP leider unmöglich, da die Inhalte nicht mehr im HTML zu finden sind, sondern erst im Browser generiert werden.
Um solch eine Website crawlen zu können, muss also Server-seitig ein Browser „simuliert“ werden. Hierfür wird in der Regel node.js eingesetzt und ist, zumindest aus meiner Sicht, recht kompliziert.
Aber auch, wenn du noch keine Erfahrung mit node.js hast, kannst du JavaScript-generierte Websites scrapen. Es gibt einige Dienste, die diese Funktion anbieten. Z.B. abstractapi.com
Ganz einfach erklärt funktioniert das Ganze so:
- Du hast ein PHP-Skript, in dem du Daten von einer externen Seite nutzen möchtest
- Statt die URL direkt mit „file_get_contents()“ aufzurufen, nutzt du die Web-Scraping-API von abstractapi. Hier gibt es Beispiel-Code: https://docs.abstractapi.com/scrape
- Anschließend kannst du die Inhalte, wie bei einer statischen HTML-Seite, in PHP weiterverarbeiten.
Z.B. so:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://scrape.abstractapi.com/v1/?api_key=***************************&url=https://www.*******.de&render_js=true');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$data = curl_exec($ch);
curl_close($ch);
//echo $data;
$dom = new DOMDocument;
$dom->loadHTML($data);
$h1Elements = $dom->getElementsByTagName('h1');
foreach ($h1Elements as $h1) {
echo $h1->textContent . "<br>";
}
Code-Sprache: PHP (php)
Abstractapi ist nicht kostenlos, aber die 9€ im Monat sind, zumindest bei kommerzieller Nutzung, ein fairer Preis. Um zu testen, ob die API wie erhofft funktioniert, sind die ersten 1000 Requests kostenlos.