So scrapen Sie eine Website mit der wdzwdz Web Scraping API

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 eine package.json-Datei erstellt.
  • In der Datei package.json wird der Wert des Hauptschlüssels zu index.mjs geändert, falls dieser standardmäßig anders lautet. Alternativ kann ein Schlüssel type hinzugefügt und sein Wert auf module gesetzt werden.
{
  “type”: “module”
}
  • Eine Abhängigkeit namens axios wird mit dem Befehl npm 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 wird Axios wie folgt importiert. Das Schlüsselwort import wird verwendet, da es sich um ein ES-Modul handelt. Wäre es eine CommonJS-Datei, wäre das Schlüsselwort require 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 als post, die URL mit dem Endpunkt, ein Header namens x-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.