Zurück zum Blog
Anleitungen
Raluca PenciucLast updated on Mar 31, 20266 min read

Wie man einen Webcrawler mit weniger als 100 Zeilen Code erstellt

Wie man einen Webcrawler mit weniger als 100 Zeilen Code erstellt

Wir leben im digitalen Zeitalter und haben Zugang zu einer riesigen Menge an Daten. Anhand dieser Informationen können wir besser verstehen, wie wir arbeiten, spielen, lernen und leben. Wäre es nicht schön, gezieltere Informationen zu einem bestimmten Thema zu erhalten?

In diesem Artikel zeigen wir Ihnen, wie Sie BeautifulSoup und WebScrapingAPI gemeinsam nutzen können, um eigene Crawler zu erstellen, mit denen Sie gezielte Daten von Websites sammeln können.

Eine Warnung: Das Scraping von urheberrechtlich geschützten Inhalten oder personenbezogenen Daten ist in den meisten Fällen illegal. Um auf der sicheren Seite zu bleiben, solltest du vor dem Scraping einer Website, insbesondere von Social-Media-Seiten, die ausdrückliche Zustimmung einholen.

Was sind Web-Crawler?

Es gibt zahlreiche Suchmaschinen, und wir alle nutzen sie. Ihre Dienste sind einfach zu bedienen – man stellt einfach eine Frage, und sie suchen überall im Web nach einer Antwort. Hinter den Kulissen ist es Googles Crawler „Googlebot“, der die Suchmaschine von Google so erfolgreich macht.

Indem sie das Web nach Seiten gemäß Ihren eingegebenen Suchbegriffen durchsuchen, helfen Crawler Suchmaschinen dabei, diese Seiten zu katalogisieren und sie später durch Indizierung wiederzugeben. Suchmaschinen sind auf Crawler angewiesen, um Website-Informationen zu sammeln, darunter URLs, Hyperlinks, Meta-Tags und Artikel, sowie den HTML-Text zu untersuchen.

Da der Bot in der Lage ist, zu verfolgen, worauf er bereits zugegriffen hat, müssen Sie sich keine Sorgen machen, dass er unendlich lange auf derselben Webseite hängen bleibt. Das öffentliche Internet und die Auswahl der Inhalte stellen Webcrawler vor mehrere Herausforderungen. Jeden Tag veröffentlichen bestehende Websites Dutzende neuer Informationen, und ich will gar nicht erst davon anfangen, wie viele neue Websites täglich erscheinen.

Letztendlich würde dies bedeuten, dass sie Millionen von Seiten durchsuchen und ihre Indizes ständig aktualisieren müssten. Die Systeme, die Website-Inhalte analysieren, sind auf sie angewiesen, daher sind sie unverzichtbar.

Crawler sind also wichtig, aber warum erwähnen wir sie? Weil wir unseren eigenen Bot entwickeln werden, der uns beim Datenextraktionsprozess unterstützt. Auf diese Weise können wir uns darauf verlassen, dass er URLs abruft, anstatt sie manuell in den Scraper einzugeben. Mehr Automatisierung, juhu!

Installation

Nachdem wir nun ein grundlegendes Verständnis von Web-Crawlern haben, fragst du dich vielleicht, wie das alles in der Praxis aussieht. Nun, lass uns das genauer betrachten!

Das Wichtigste zuerst: Wir müssen unsere Arbeitsumgebung einrichten. Stelle sicher, dass dein Rechner die folgenden Voraussetzungen erfüllt:

  • Python 3;
  • Eine Python-IDE. In dieser Anleitung wird Visual Studio Code verwendet, da es ressourcenschonend ist und keine zusätzliche Konfiguration erfordert. Der Code ist jedoch IDE-unabhängig, sodass du jede IDE wählen kannst, mit der du vertraut bist;

Zu guter Letzt benötigen wir einen API-Schlüssel. Sie können ein kostenloses WSA-Konto erstellen, das Ihnen in den ersten 14 Tagen 5000 API-Aufrufe gewährt. Nach der Registrierung navigieren Sie einfach zu Ihrem Dashboard, wo Sie Ihren API-Schlüssel und weitere nützliche Ressourcen finden.

Entwicklung des Crawlers

Gut, wir haben die Tools, also sind wir dem Bau unseres Crawlers einen Schritt näher gekommen. Aber wie werden wir ihn einsetzen? Die Umsetzung kann je nach unserem Endziel variieren.

Wähle eine Website aus und untersuche den HTML-Code

Für dieses Tutorial haben wir eine E-Commerce-Website ausgewählt, die Zero-Waste-Produkte für verschiedene Zwecke verkauft. Wir werden alle Seiten durchgehen, die Produktliste jeder Seite extrahieren und die Daten schließlich für jede Seite in einer CSV-Datei speichern.

Dazu müssen wir uns zunächst die Seitenstruktur ansehen und unsere Strategie festlegen. Klicken Sie mit der rechten Maustaste an einer beliebigen Stelle auf der Seite, dann auf „Element untersuchen“, und die „Entwicklerkonsole“ wird angezeigt. Hier sehen Sie das HTML-Dokument der Website, das alle Daten enthält, die wir benötigen.

Erstellen des Crawlers

Ok, jetzt können wir etwas Code schreiben!

Öffne zunächst ein Terminalfenster in deiner IDE und führe den folgenden Befehl aus, der BeautifulSoup installiert, eine Bibliothek, die uns hilft, die Daten aus dem HTML zu extrahieren:

> pip install beautifulsoup4

Erstellen Sie anschließend einen Ordner mit dem Namen „products“. Dieser hilft Ihnen dabei, die Scraping-Ergebnisse zu organisieren und in mehreren CSV-Dateien zu speichern.

Erstellen Sie schließlich die Datei „crawler.py“. Hier werden wir unseren gesamten Code und die Crawling-Logik schreiben. Wenn wir fertig sind, können wir die Datei mit dem folgenden Befehl ausführen:

> py crawler.py

Als Nächstes importieren wir die benötigten Bibliotheken und definieren einige globale Variablen:

import requests
from bs4 import BeautifulSoup
import csv

BASE_URL = "https://www.shopetee.com"
SECTION = "/collections/all-collections"
FULL_START_URL = BASE_URL + SECTION

ENDPOINT = "https://api.webscrapingapi.com/v1/"
API_KEY = "API_KEY"

Nun definieren wir den Einstiegspunkt für unseren Crawler:

def crawl(url, filename):
    page_body = get_page_source(url, filename)
    soup = BeautifulSoup(page_body, 'html.parser')
    start_crawling(soup, filename)

crawl(FULL_START_URL, 'etee-page1.txt')

Wir implementieren die Crawl-Funktion, die die HTML-Dokumente über unsere get_page_source-Prozedur extrahiert. Anschließend erstellt sie das BeautifulSoup-Objekt, das unser Parsing vereinfacht, und ruft die start_crawling-Funktion auf, die mit der Navigation auf der Website beginnt.

def get_page_source(url, filename):
    params = {
        "api_key": API_KEY,
        "url": url,
        "render_js": '1'
    }
    page = requests.request("GET", ENDPOINT, params=params)
    soup = BeautifulSoup(page.content, 'html.parser')
    body = soup.find('body')

    file_source = open(filename, mode='w', encoding='utf-8')
    file_source.write(str(body))
    file_source.close()

    return str(body)

Wie bereits erwähnt, nutzt die Funktion `get_page_source` die WebScrapingAPI, um den HTML-Inhalt der Website abzurufen, und schreibt ihn in eine Textdatei im Abschnitt `<body>`, da dieser alle Informationen enthält, die uns interessieren.

Lassen Sie uns nun einen Schritt zurücktreten und prüfen, wie wir unsere Ziele erreichen können. Die Produkte sind auf Seiten organisiert, daher müssen wir wiederholt auf jede Seite zugreifen, um sie alle zu extrahieren.

Das bedeutet, dass unser Crawler einige rekursive Schritte durchläuft, solange Seiten verfügbar sind. Um diese Logik in Code umzusetzen, müssen wir uns ansehen, wie der HTML-Code diese Bedingungen beschreibt.

Wenn Sie zur Entwicklerkonsole zurückkehren, sehen Sie, dass jede Seitenzahl eigentlich ein Link zu einer neuen Seite ist. Da wir uns auf der ersten Seite befinden und keine vorherige Seite vorhanden ist, ist der Pfeil nach links deaktiviert.

Der folgende Algorithmus muss also:

  • Auf die Seite zugreifen;
  • die Daten extrahieren (dies werden wir im nächsten Schritt implementieren);
  • den Paginierungs-Container im HTML-Dokument finden; prüfen, ob der Pfeil „Nächste Seite“ deaktiviert ist, und wenn ja, anhalten; wenn nicht, den neuen Link abrufen und die Crawl-Funktion für die neue Seite aufrufen.
def start_crawling(soup, filename):

    extract_products(soup, filename)

    pagination = soup.find('ul', {'class': 'pagination-custom'})
    next_page = pagination.find_all('li')[-1]
    
    if next_page.has_attr('class'):
        if next_page['class'] == ['disabled']:
            print("You reached the last page. Stopping the crawler...")
    else:
        next_page_link = next_page.find('a')['href']
        next_page_address = BASE_URL + next_page_link
        next_page_index = next_page_link[next_page_link.find('=') + 1]
        crawl(next_page_address, f'etee-page{next_page_index}.txt')

Daten extrahieren und in CSV exportieren

Schauen wir uns zum Schluss an, wie wir die benötigten Daten extrahieren können. Wir werfen noch einmal einen Blick auf das HTML-Dokument und sehen, dass wir anhand der Klassennamen auf die wertvollen Informationen zugreifen können.

Wir extrahieren den Produktnamen, die Bewertung, die Anzahl der Bewertungen und den Preis, aber Sie können so weit gehen, wie Sie möchten.

Erinnern Sie sich an den Ordner „products“, den wir zuvor erstellt haben? Wir erstellen nun eine CSV-Datei, um die Daten zu exportieren, die wir von jeder Seite scrapen. Der Ordner hilft uns dabei, sie zu organisieren.

def extract_products(soup, filename):
    csv_filename = filename.replace('.txt', '.csv')
    products_file = open(f'products/{csv_filename}', mode='a', encoding='utf-8', newline='')
    products_writer = csv.writer(products_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    products_writer.writerow(['Title', 'Rating', 'Reviews', 'Price on sale'])

    products = soup.find_all('div', {'class': 'product-grid-item'})
    for product in products:
        product_title = product.find('div', {'class': 'item-title'}).getText().strip()
        product_rating = product.find('span', {'class': 'jdgm-prev-badge__stars'})['data-score']
        product_reviews = product.find('span', {'class': 'jdgm-prev-badge__text'}).getText().strip()
        product_price_on_sale = product.find('span', {'class': 'money'}).getText()
        products_writer.writerow([product_title, product_rating, product_reviews, product_price_on_sale])

Nach dem Ausführen des Programms kannst du alle extrahierten Informationen in den neu erstellten Dateien sehen.

Abschließende Gedanken

Und das war’s auch schon! Wir haben gerade unseren eigenen Webcrawler mit Python’s BeautifulSoup und WebScrapingAPI in weniger als 100 Zeilen Code erstellt. Natürlich kann dies je nach Komplexität Ihrer Aufgabe variieren, aber für einen Crawler, der durch die Seiten einer Website navigiert, ist das ein ziemlich gutes Ergebnis.

Für diese Anleitung haben wir die kostenlose Testversion von WebScrapingAPI genutzt, die in den ersten 14 Tagen 5000 API-Aufrufe bietet – mehr als genug, um einen leistungsstarken Crawler zu erstellen.  

Es war hilfreich, sich nur auf die Logik des Crawlers zu konzentrieren, anstatt sich um die verschiedenen Herausforderungen beim Web-Scraping zu kümmern. Das hat uns Zeit, Energie und erhebliche andere Kosten erspart, wie zum Beispiel die Nutzung eigener Proxys – nur einige der Vorteile, die Sie durch die Verwendung einer API für das Web-Scraping erzielen können.

Über den Autor
Raluca Penciuc, Full-Stack-Entwickler @ WebScrapingAPI
Raluca PenciucFull-Stack-Entwickler

Raluca Penciuc ist Full-Stack-Entwicklerin bei WebScrapingAPI. Sie entwickelt Scraper, verbessert Umgehungsstrategien und findet zuverlässige Wege, um die Erkennung auf Zielwebsites zu verringern.

Los geht’s

Sind Sie bereit, Ihre Datenerfassung zu erweitern?

Schließen Sie sich den über 2.000 Unternehmen an, die WebScrapingAPI nutzen, um Webdaten im Unternehmensmaßstab ohne zusätzlichen Infrastrukturaufwand zu extrahieren.