5.2. 🚀 Web-Scraping als Methode der Korpuserstellung#

Hinweise zur AusfĂĽhrung des Notebooks

Dieses Notebook kann auf unterschiedlichen Levels erarbeitet werden (siehe Abschnitt “Technische Voraussetzungen”):

  1. Book-Only Mode: Sie lesen das Notebook hier im “Jupyter Book”, ohne den Code selbst auszuführen.

  2. Cloud Mode: Klicken Sie oben rechts in der Menüleiste auf das Raketen-Symbol 🚀 und wählen Sie “Colab”, um das Notebook auszuführen.

  3. Local Mode: Klicken Sie oben rechts in der Menüleiste auf das Download-Symbol ↓ und wählen Sie “.ipynb”, um das Notebook lokal auszuführen.

Informationen zum Ausführen des Notebooks – Zum Ausklappen klicken ⬇️

Voraussetzungen zur AusfĂĽhrung des Jupyter Notebooks:

  • Installieren der Bibliotheken
Zum Testen: AusfĂĽhren der Zelle "load libraries".
Alle Zellen, die mit 🚀 gekennzeichnet sind, werden nur bei der Ausführung des Noteboos in Colab / JupyterHub bzw. lokal ausgeführt.
#  🚀 Install libraries 
! pip install requests beautifulsoup4 scrapy selenium

5.2.1. EinfĂĽhrung#

Im vorherigen Kapitel „Webkommunikation mittels HTTP“ haben wir bereits ein Beispiel zur automatisierten Abfrage einer Website kennengelernt. Um mehr als eine Website abzufragen, gibt es verschiedene Methoden. Welche Methode sich am besten zur Extraktion eignet, hängt davon ab, wie die abzufragenden Websites aufgebaut sind und ob sie rein statische oder auch dynamische Inhalte beinhalten.

Statische vs. dynamische Websites#

Websites können grundsätzlich in zwei Kategorien eingeteilt werden: statische und dynamische Websites. Abhängig davon, welche Inhalte extrahiert werden sollen und wie die Website beschaffen ist, muss die Scraping-Methode angepasst werden.

  • Statische Websites: Diese Websites sind fertige Dokumente, die auf einem Server bereitliegen. Wenn Sie eine solche Website anfordern, wird Ihnen exakt dieser vorbereitete Inhalt geschickt. Das ist vergleichbar mit dem Anfordern eines bestimmten Buches aus einer Bibliothek – der Inhalt liegt fertig vor und ändert sich nicht. Diese Art von Websites kann leicht mit einfachen Scraping-Methoden extrahiert werden, da alle Informationen direkt im HTML-Code enthalten sind.

  • Dynamische Websites: Diese Websites werden erst im Moment der Anfrage zusammengestellt. Sie enthalten oft JavaScript-Code, der nach dem Laden der Seite ausgefĂĽhrt wird und weitere Inhalte nachladen oder verändern kann. Das ist vergleichbar mit einem Koch, der das Gericht erst auf Bestellung zubereitet. FĂĽr die automatisierte Abfrage dieser Art von Websites benötigt man fortgeschrittenere Scraping-Methoden wie Selenium, die einen Browser simulieren können.

5.2.2. Drei Ebenen des Web Scrapings#

1. Einfache Anfragen mit requests#

Die grundlegendste Form des Web Scrapings ist das Abrufen einzelner Webseiten, z.B. mit Hilfe des Python-Pakets requests. Diese Methode eignet sich fĂĽr statische Webseiten, deren Inhalt direkt im HTML-Code enthalten ist.

# import library to perform HTTP requests
import requests

# Set URL 
url = "https://www.berlin.de/rbmskzl/"

# perform get request
response = requests.get(url)

# check if request was successful (code: 200)
if response.status_code == 200:
    print(f"Status-Code: {response.status_code}")

    # display the first lines of the response body (the content of the website)
    print("\nBeginn des HTML-Dokuments:")
    print(response.text[:100])
else:
    print(f"Fehler beim Abrufen der Seite: {response.status_code}")
Status-Code: 200

Beginn des HTML-Dokuments:
<!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de" data-lang="de" cl

Vorteile:

  • Einfach zu implementieren

  • Geringer Ressourcenverbrauch

  • Ausreichend fĂĽr einfache Scraping-Aufgaben

Nachteile:

  • Nur einzelne Seiten werden abgerufen

  • Keine automatische Navigation zu anderen Seiten

  • Nicht geeignet fĂĽr dynamisch generierte Inhalte (JavaScript)

3. Simulation von Benutzerinteraktionen mit Selenium#

Für Websites, die dynamische Inhalte mittels JavaScript laden oder Benutzerinteraktionen erfordern, ist Selenium die geeignete Wahl. Diese Bibliothek steuert einen echten Webbrowser und kann somit mit allen Elementen der Seite interagieren – auch mit Inhalten, die erst nach dem Laden per JavaScript erzeugt werden.

Als Beispiel dient die Übungsseite quotes.toscrape.com/js, die eigens zum Testen von Web-Scraping bereitgestellt wird. Dort werden die Zitate erst im Browser per JavaScript erzeugt. Der folgende Vergleich macht den Unterschied deutlich: Zunächst versuchen wir, die Zitate mit requests auszulesen – anschließend mit Selenium.

# For comparison: fetch the same page with requests + BeautifulSoup.
# The quotes on https://quotes.toscrape.com/js/ are generated by JavaScript,
# so they are not present in the served HTML.
import requests
from bs4 import BeautifulSoup

url = "https://quotes.toscrape.com/js/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")

quotes = soup.select("div.quote")
print(f"Mit requests gefundene Zitate: {len(quotes)}")   # -> 0
Mit requests gefundene Zitate: 0

Mit requests werden 0 Zitate gefunden – die Inhalte entstehen erst durch die Ausführung von JavaScript im Browser. Selenium steuert dagegen einen echten Browser, der dieses JavaScript ausführt, und kann die Zitate deshalb auslesen:

⚠️ Warnung
Dieses Beispiel benötigt einen lokal installierten Chrome-Browser und läuft daher nur im Local Mode, nicht in Google Colab (Cloud Mode). Wird die Zelle in Colab ausgeführt, gibt sie lediglich einen Hinweis aus und wird übersprungen.
import sys

# Selenium drives a locally installed Chrome browser and therefore does not run in Google Colab.
if "google.colab" in sys.modules:
    print("Dieses Selenium-Beispiel läuft nicht in Google Colab (Cloud Mode).")
    print("Bitte führen Sie das Notebook im Local Mode aus (Download-Symbol ↓ → .ipynb).")
else:
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC

    # Configure Chrome in headless mode (no visible browser window)
    options = Options()
    options.add_argument("--headless=new")
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-dev-shm-usage")

    # Since Selenium 4.6 the built-in "Selenium Manager" automatically downloads
    # the matching ChromeDriver, so no manual driver management is needed.
    driver = webdriver.Chrome(options=options)

    try:
        # Same page as above, but here the quotes are rendered via JavaScript
        driver.get("https://quotes.toscrape.com/js/")

        # Wait until the JavaScript-generated elements are present
        # (more robust than a fixed time.sleep()).
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CLASS_NAME, "quote"))
        )

        quotes = driver.find_elements(By.CLASS_NAME, "quote")
        print(f"Mit Selenium gefundene Zitate: {len(quotes)}\n")
        for quote in quotes:
            text = quote.find_element(By.CLASS_NAME, "text").text
            author = quote.find_element(By.CLASS_NAME, "author").text
            print(f"{text} — {author}")
    finally:
        driver.quit()   # Always close the browser, even on error
Mit Selenium gefundene Zitate: 10

“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.” — Albert Einstein
“It is our choices, Harry, that show what we truly are, far more than our abilities.” — J.K. Rowling
“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.” — Albert Einstein
“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.” — Jane Austen
“Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.” — Marilyn Monroe
“Try not to become a man of success. Rather become a man of value.” — Albert Einstein
“It is better to be hated for what you are than to be loved for what you are not.” — André Gide
“I have not failed. I've just found 10,000 ways that won't work.” — Thomas A. Edison
“A woman is like a tea bag; you never know how strong it is until it's in hot water.” — Eleanor Roosevelt
“A day without sunshine is like, you know, night.” — Steve Martin

Vorteile:

  • Zugriff auf dynamisch geladene Inhalte (JavaScript)

  • Simulation von Benutzerinteraktionen (Klicks, Formulare ausfĂĽllen)

  • “Sieht” die Website wie ein menschlicher Benutzer

Nachteile:

  • Deutlich ressourcenintensiver

  • Langsamer als requests oder Scrapy

  • Anfälliger fĂĽr Ă„nderungen im Website-Layout

5.2.3. Geeignete Szenarien fĂĽr die verschiedenen Methoden#

Szenario

Geeignete Methode

BegrĂĽndung

Extraktion von Texten aus einer bekannten Webseite

requests

Einfach, effizient fĂĽr einzelne statische Seiten

Durchsuchen und Extraktion von Daten aus einem Blog oder Wiki

Scrapy

Effizientes Folgen von Links, Extrahieren ähnlicher Daten von mehreren Seiten

Korpuserstellung aus statischen Webseiten

Scrapy

Gute Balance aus Geschwindigkeit und Funktionalität für größere Sammlungen

Daten aus einem Social-Media-Portal

Selenium

Notwendig fĂĽr Login, Scrollen, Klicken und dynamisch nachgeladene Inhalte

Korpuserstellung aus dynamischen Webseiten

Selenium

Notwendig fĂĽr Scrollen, Klicken und dynamisch nachgeladene Inhalte

Interaktion mit Suchformularen

Selenium

Ermöglicht das Ausfüllen und Absenden von Formularen

5.2.4. Ethische und rechtliche Aspekte#

Beim Web Scraping sind stets ethische und rechtliche Aspekte zu beachten:

  • Beachtung der robots.txt-Datei einer Website, die Informationen darĂĽber gibt, welche Websites gescraped werden dĂĽrfen.

  • Angemessene Wartezeiten zwischen Anfragen einhalten

  • Keine persönlichen Daten ohne Einwilligung sammeln

  • Urheberrecht und Nutzungsbedingungen der Websites beachten

  • Datenschutzbestimmungen einhalten