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”):
Book-Only Mode: Sie lesen das Notebook hier im “Jupyter Book”, ohne den Code selbst auszuführen.
Cloud Mode: Klicken Sie oben rechts in der Menüleiste auf das Raketen-Symbol 🚀 und wählen Sie “Colab”, um das Notebook auszuführen.
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
# 🚀 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:
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
requestsoderScrapyAnfä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 |
|
Einfach, effizient fĂĽr einzelne statische Seiten |
Durchsuchen und Extraktion von Daten aus einem Blog oder Wiki |
|
Effizientes Folgen von Links, Extrahieren ähnlicher Daten von mehreren Seiten |
Korpuserstellung aus statischen Webseiten |
|
Gute Balance aus Geschwindigkeit und Funktionalität für größere Sammlungen |
Daten aus einem Social-Media-Portal |
|
Notwendig fĂĽr Login, Scrollen, Klicken und dynamisch nachgeladene Inhalte |
Korpuserstellung aus dynamischen Webseiten |
|
Notwendig fĂĽr Scrollen, Klicken und dynamisch nachgeladene Inhalte |
Interaktion mit Suchformularen |
|
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