Die Kunst des Web Scrapings: Datenextraktion aus dem World Wide Web
Web Scraping bezeichnet den Vorgang, bei dem nützliche Informationen aus dem riesigen Datendschungel des Internets gewonnen werden. Ein Webcrawler, oft auch als Bot bezeichnet, durchforstet bei einer Suchanfrage bei Google nahezu sämtliche Inhalte des Internets und selektiert die für den Nutzer relevanten Informationen.
Die grundlegende Idee, dass Informationen und Wissen für jedermann zugänglich sein sollten, war die treibende Kraft hinter der Entstehung des World Wide Web. Allerdings ist es entscheidend zu beachten, dass die extrahierten Daten zur öffentlichen Nutzung freigegeben sein müssen.
Der Nutzen von Web Scraping
Wir leben im Informationszeitalter, in dem Rohdaten in wertvolle Erkenntnisse umgewandelt werden können. Web Scraping spielt dabei eine entscheidende Rolle, indem es uns ermöglicht, diese Daten für einen größeren Zweck zu nutzen. So lassen sich beispielsweise Nutzerdaten eines Produkts analysieren und untersuchen, um es zu optimieren, was einem kontinuierlichen Feedbackprozess entspricht.
E-Commerce-Unternehmen können Web Scraping nutzen, um die Preisstrategien ihrer Konkurrenten zu studieren und ihre eigenen Strategien darauf abzustimmen. Des Weiteren findet Web Scraping Anwendung in der Erstellung von Wetter- und Nachrichtenberichten.
Herausforderungen beim Web Scraping
#1. IP-Beschränkungen
Viele Websites begrenzen die Anzahl der Anfragen, die innerhalb eines bestimmten Zeitraums gestellt werden dürfen. Dies geschieht, indem die IP-Adresse oder Geolokalisierung des Nutzers ermittelt wird. Diese Maßnahme dient dem Schutz der Website vor potenziellen, bösartigen Angriffen.
#2. Captchas
Captchas dienen der Unterscheidung zwischen menschlichen Nutzern und automatisierten Bots, die versuchen, auf eine Website zuzugreifen. Durch den Einsatz von Captchas versuchen Webseiten, Spam zu verhindern und die Anzahl von Scraping-Aktivitäten zu kontrollieren.
#3. Clientseitiges Rendering
Dies stellt eine der größten Herausforderungen für Web Scraper dar. Moderne Websites nutzen Frontend-Frameworks, die es ermöglichen, Single-Page-Anwendungen (SPA) zu erstellen. Bei den meisten SPAs wird der Inhalt nicht serverseitig gerendert. Stattdessen wird er mithilfe von clientseitigem Javascript generiert, was es für Scraper schwierig macht, den tatsächlichen Inhalt einer Webseite zu erkennen. Um den Inhalt zu erfassen, ist die Ausführung von clientseitigem Javascript erforderlich.
Die wdzwdz-API
Eine Web-Scraping-API kann viele der typischen Herausforderungen beim Web Scraping lösen, da sie den Großteil der Arbeit übernimmt. Lassen Sie uns die wdzwdz-API genauer betrachten, um zu sehen, wie sie für Web Scraping genutzt werden kann.
Die wdzwdz-API zeichnet sich durch einen einfachen, dreistufigen Prozess aus:
- Eine URL für das Scraping wird bereitgestellt.
- Konfigurationsoptionen werden festgelegt.
- Die Daten werden abgerufen.
Die API kann Webseiten scrapen und die Rohdaten als HTML-String oder in einer HTML-Datei zurückgeben, auf die über einen Link zugegriffen werden kann. Die Wahl hängt von den jeweiligen Bedürfnissen ab.
Anwendung der API
Dieses Tutorial zeigt, wie die wdzwdz-API mit NodeJS, einer Javascript-Laufzeitumgebung, verwendet wird. Falls noch nicht geschehen, muss NodeJS vor dem Fortfahren auf dem System installiert werden.
- Im Terminal des aktuellen Ordners wird der Befehl
npm init -y
ausgeführt. Dadurch wird automatisch einepackage.json
-Datei erstellt.
- In der Datei
package.json
wird der Wert des Hauptschlüssels zuindex.mjs
geändert, falls dieser standardmäßig anders lautet. Alternativ kann ein Schlüsseltype
hinzugefügt und sein Wert aufmodule
gesetzt werden.
{ “type”: “module” }
- Eine Abhängigkeit namens
axios
wird mit dem Befehlnpm i axios
im Terminal hinzugefügt. Diese Abhängigkeit hilft beim Stellen von Anfragen an spezifische Endpunkte.
- Die
package.json
-Datei sollte nun in etwa wie folgt aussehen:
{ "name": "webscraping", "version": "1.0.0", "description": "", "main": "index.mjs", "scripts": { "test": "echo "Error: no test specified" && exit 1" }, "author": "Murtuzaali Surti", "license": "ISC", "dependencies": { "axios": "^1.1.3" } }
- In der Datei
index.mjs
wirdAxios
wie folgt importiert. Das Schlüsselwortimport
wird verwendet, da es sich um ein ES-Modul handelt. Wäre es eine CommonJS-Datei, wäre das Schlüsselwortrequire
verwendet worden.
import axios from ‘axios’
- Die Basis-URL für alle Anfragen an die wdzwdz-API ist für jeden Endpunkt identisch und kann daher in einer Konstante gespeichert werden.
const baseUrl="https://api.wdzwdz.com"
- Die URL der zu scrapenen Webseite wird definiert.
let toScrapeURL = "https://developer.mozilla.org/en-US/"
- Eine asynchrone Funktion wird erstellt und
Axios
darin initialisiert.
async function getData() { const res = await axios({}) return res }
- In den
Axios
-Konfigurationsoptionen werden Methode alspost
, die URL mit dem Endpunkt, ein Header namensx-api-key
(dessen Wert der von wdzwdz bereitgestellte API-Schlüssel ist) und ein Datenobjekt, das an die wdzwdz-API gesendet wird, festgelegt. Der API-Schlüssel kann unter dash.wdzwdz.com abgerufen werden.
const res = await axios({ method: "post", url: `${baseUrl}/webscraping`, headers: { "x-api-key": "your api key" }, data: { url: toScrapeURL, output: 'file', device: 'desktop', renderJS: true } })
- Das Datenobjekt verfügt über folgende Eigenschaften:
url
: Die URL der Webseite, die gescraped werden soll.output
: Das Format, in dem die Daten bereitgestellt werden, entweder als Inline-String oder in einer HTML-Datei. Standardmäßig ist ein Inline-String voreingestellt.device
: Der Gerätetyp, auf dem die Webseite geöffnet wird. Es sind die Werte „desktop“, „mobile“ und „tablet“ möglich, wobei „desktop“ der Standardwert ist.renderJS
: Ein boolescher Wert, der angibt, ob Javascript gerendert werden soll. Diese Option ist besonders bei clientseitigem Rendering nützlich.
- Die asynchrone Funktion wird aufgerufen und die Daten werden abgerufen. Hier wird ein IIFE (Immediately Invoked Function Expression) verwendet.
(async () => { const data = await getData() console.log(data.data) })()
- Die Antwort sieht in etwa wie folgt aus:
{ timestamp: 1669358356779, apiStatus: 'success', apiCode: 200, meta: { url: 'https://murtuzaalisurti.github.io', device: 'desktop', output: 'file', blockAds: true, renderJS: true, test: { id: 'mvan3sa30ajz5i8lu553tcckchkmqzr6' } }, data: 'https://api-assets.wdzwdz.com/tests/web-scraping/pbn0v009vksiszv1cgz8o7tu.html' }
HTML-Analyse
Für die HTML-Analyse kann ein npm-Paket namens node-html-parser
verwendet werden, um Daten aus HTML zu extrahieren. Möchte man beispielsweise den Titel einer Webseite extrahieren, kann folgendermaßen vorgegangen werden:
import { parse } from ‘node-html-parser’ const html = parse(htmlData) // htmlData ist der HTML-Rohstring der wdzwdz API.
Falls lediglich die Metadaten einer Website benötigt werden, kann alternativ der Metadaten-API-Endpunkt von wdzwdz genutzt werden, wodurch eine HTML-Analyse nicht mehr notwendig ist.
Vorteile der wdzwdz-API
Bei Single-Page-Anwendungen werden die Inhalte häufig nicht serverseitig gerendert, sondern clientseitig durch Javascript generiert. Wird die ursprüngliche URL gescraped, ohne das Javascript zum Rendern des Inhalts auszuführen, erhält man lediglich ein leeres Container-Element.
Betrachten wir ein Beispiel: Eine Demo-Website, die mit React und Vitejs erstellt wurde, wird gescraped. Dabei wird die renderJS
-Option auf false
gesetzt. Das Ergebnis ist:
<body> <div id="root"></div> <body>
Es existiert lediglich ein Root-Container ohne Inhalt. Hier kommt die renderJS
-Option ins Spiel. Wird nun die gleiche Website mit der renderJS
-Option auf true
gesetzt, erhält man folgendes Ergebnis:
<body> <div id="root"> <div class="App"> <div> <a href="https://vitejs.dev" target="_blank"> <img src="/vite.svg" class="logo" > </a> <a href="https://reactjs.org" target="_blank"> <img src="/assets/react.35ef61ed.svg" class="logo react" > </a> </div> <h1>Vite + React</h1> <div class="card"> <button>count is 0</button> <p>Edit <code>src/App.jsx</code> and save to test HMR</p> </div> <p class="read-the-docs">Click on the Vite and React logos to learn more</p> </div> </div> </body>
Ein weiterer Vorteil der wdzwdz-API ist die Möglichkeit, einen rotierenden Proxy zu verwenden, um IP-Blockierungen durch die Website zu vermeiden. Die Proxy-Funktion ist im Premium-Plan der wdzwdz-API enthalten.
Abschließende Gedanken
Durch den Einsatz einer Web-Scraping-API kann der Fokus auf die extrahierten Daten selbst gelegt werden, ohne sich mit komplexen technischen Details auseinandersetzen zu müssen. Die wdzwdz-API bietet zudem Funktionen wie das Überprüfen defekter Links, Meta-Scraping, Website-Ladezeiten, Screenshot-Erstellung, Website-Status und vieles mehr – alles innerhalb einer einzigen API. Für weitere Informationen steht die offizielle Dokumentation der wdzwdz-API zur Verfügung.