Web Scraping mit Python: Einführung und Tutorial

Das World Wide Web besteht aus Milliarden untereinander verlinkter Dokumente, weithin bekannt als Webseiten. Der Quelltext der Webseiten ist in der Sprache Hypertext Markup Language (HTML) geschrieben. Beim HTML-Quelltext handelt es sich um eine Mischung von menschenlesbaren Informationen und maschinenlesbaren Codes, den sogenannten Tags. Der Webbrowser – z. B. Chrome, Firefox, Safari oder Edge – verarbeitet den Quelltext, interpretiert die Tags und stellt die darin enthaltenen Informationen für den Nutzer dar.
Um gezielt nur die für Menschen interessanten Informationen aus dem Quelltext zu extrahieren, bedient man sich spezieller Software. Diese als „Web Scraper“, „Crawler“, „Spider“ oder einfach „Bot“ bekannten Programme durchsuchen den Quelltext von Webseiten nach vorgegebenen Mustern und extrahieren die darin enthaltenen Informationen. Die durch Web Scraping gewonnenen Informationen werden zusammengefasst, kombiniert, ausgewertet oder für weitere Verwendung gespeichert.
Im Folgenden erklären wir, warum sich die Sprache Python besonders gut für das Erstellen von Web Scrapern eignet, und geben Ihnen mit einem entsprechenden Tutorial eine Einführung.
Website mit eigener Domain – MyWebsite Now
Erstellen Sie Ihre eigene Website in wenigen Minuten
  • Professionelle Templates
  • Änderungen am Design mit nur einem Klick
  • Domain, SSL und E-Mail-Postfach inklusive

Warum gerade Python für Web Scraping nutzen?

Die beliebte Programmiersprache Python eignet sich gut für die Erstellung von Web-Scraping-Software. Da Websites laufend angepasst werden, ändern sich Webinhalte über die Zeit. Beispielsweise wird das Design angepasst oder es werden neue Seitenbestandteile hinzugefügt. Ein Web Scraper wird für die spezifische Struktur einer Seite geschrieben. Ändert sich die Struktur der Seite, muss der Scraper angepasst werden. Das geht mit Python besonders einfach.
Ferner ist Python ausgesprochen stark in den Bereichen Textverarbeitung und Abruf von Webressourcen; beides sind technische Grundlagen für Web Scraping. Darüber hinaus ist Python ein etablierter Standard für Datenanalyse und -verarbeitung. Neben der generellen Eignung der Sprache besticht Python durch ein blühendes Programmier-Ökosystem. Dazu zählen Bibliotheken, Open-Source-Projekte, Dokumentation und Sprachreferenz sowie Foren-Beiträge, Bugreports und Blogartikel.
Speziell existieren mehrere weit ausgereifte Tools für das Web Scraping mit Python. Wir stellen hier die drei bekannten Tools Scrapy, Selenium, und BeautifulSoup vor. Als praktische Übung können Sie unser Web-Scraping-mit-Python-Tutorial auf Basis von BeautifulSoup nutzen. So können Sie den Scraping-Prozess ganz unmittelbar nachvollziehen.

Web Scraping im Überblick

Das grundlegende Schema des Scraping-Vorgangs ist schnell erklärt. Zunächst analysiert der Scraper-Entwickler den HTML-Quelltext der interessanten Seite. Für gewöhnlich finden sich eindeutige Muster, nach denen sich die gewünschten Informationen extrahieren lassen. Für diese Muster wird der Scraper programmiert. Der Rest der Arbeit wird vom Scraper automatisiert geleistet:
  1. Webseite unter URL-Adresse abrufen
  2. Automatisiert strukturierte Daten den Mustern entsprechend extrahieren
  3. Die extrahierten Informationen zusammenfassen, speichern, auswerten, kombinieren etc.

Anwendungsfälle für Web Scraping

Das Web Scraping ist vielseitig anwendbar. Außer zur Suchmaschinen-Indizierung wird Web Scraping u. a. für die folgenden Zwecke verwendet:
  • Kontaktdatenbanken erstellen
  • Preise von Online-Angeboten überwachen und vergleichen
  • Daten aus verschiedenen Onlinequellen zusammenführen
  • Onlinepräsenz und -reputation verfolgen
  • Finanz-, Wetter- und andere Daten sammeln
  • Webinhalte auf Änderungen überwachen
  • Daten zu Forschungszwecken sammeln
  • Data Mining durchführen

Ein anschauliches Web-Scraping-Beispiel

Stellen Sie sich eine Website vor, auf der Gebrauchtwagen zum Kauf angeboten werden. Wenn Sie die Seite im Browser ansteuern, wird Ihnen eine Liste von Autos angezeigt. Betrachten wir exemplarisch den Quelltext für den Eintrag eines Autos:
raw_html = """
<h1>Gebrauchtwagen zum Kauf</h1>
<ul class="cars-listing">
    <li class="car-listing">
        <div class="car-title">
            Volkswagen Käfer
        </div>
        <div class="car-description">
            <span class="car-make">Volkswagen</span>
            <span class="car-model">Käfer</span>
            <span class="car-build">1973</span>
        </div>
        <div class="sales-price">
            € <span class="car-price">14.998,—</span>
        </div>
    </li>
</ul>
    
 """
Ein Web Scraper kann die online verfügbare Auflistung von Gebrauchtwagen durchsuchen. Je nach Absicht des Erstellers sucht der Scraper nach einem bestimmten Modell; in unserem Beispiel handelt es sich um einen Volkswagen Käfer. Im Quelltext sind die Angaben für Marke und Modell des Autos mit den CSS-Klassen 'car-make' und 'car-model' ausgezeichnet. Mithilfe der Klassennamen lassen sich die gewünschten Informationen leicht scrapen. Hier ein Beispiel mit BeautifulSoup:

# den in raw_html gespeicherten HTML-Quelltext parsen
html = BeautifulSoup(raw_html, 'html.parser')
# den Inhalt des Tags mit Klasse 'car-title' extrahieren
car_title = html.find(class_ = 'car-title').text.strip()
# falls es sich bei diesem Auto um einen Volkswagen Käfer handelt
if (car_title == 'Volkswagen Käfer'):
    # vom Titel des Autos zum umschließenden <li>-Tag aufsteigen
    html.find_parent('li')
    
    # den Preis des Autos ermitteln
    car_price = html.find(class_ = 'sales-price').text.strip()
    
    # den Preis des Autos ausgeben
    print(car_price)

Juristische Risiken beim Web Scraping

So praktisch das Web Scraping ist, es birgt auch juristische Risiken. Da der Website-Betreiber seine Seite eigentlich für die Nutzung durch Menschen bereitstellt, kann ein automatisierter Abruf mittels Web Scraper einen Verstoß gegen die Nutzungsbedingungen darstellen. Insbesondere trifft dies dann zu, wenn der Abruf in hohem Volume auf mehrere Seiten gleichzeitig oder in hoher Folge stattfindet. Ein Mensch könnte nicht auf diese Weise mit der Site interagieren.
Ferner stellt das automatisierte Abrufen, Speichern und Auswerten der auf einer Website publizierten Daten ggf. eine Verletzung des Urheberrechts dar. Handelt es sich bei den gescrapten Informationen um persönlich identifizierbare Daten, verstößt die Speicherung und Auswertung ohne Zustimmung der Betroffenen gegen geltende Bestimmungen zum Datenschutz. So ist es beispielsweise nicht erlaubt, Facebook-Profile zu scrapen, um personenbezogene Daten zu sammeln.
Hinweis
Bei Verstößen gegen Datenschutz und Urheberrecht drohen empfindliche Strafen. Stellen Sie also sicher, dass Sie gegen keinerlei Gesetze verstoßen, wenn Sie Web Scraping einsetzen möchten. Vorhandene technische Sperren dürfen keinesfalls umgangen werden.

Technische Beschränkungen des Web Scrapings

Website-Betreiber haben oft ein Interesse daran, das automatisierte Scraping ihrer Online-Angebote zu limitieren. Zum einen kann der massenhafte Zugriff auf die Website durch Scraper sich negativ auf die Performanz der Site auswirken. Zum anderen gibt es oft interne Bereiche einer Website, die nicht in Suchergebnissen auftauchen sollen.
Zur Limitierung der Zugriffe durch Scraper hat sich der Standard robots.txt etabliert: Der Website-Betreiber legt eine Textdatei namens robots.txt im Hauptverzeichnis der Website ab. Innerhalb der Datei wird über spezielle Einträge festgelegt, welche Scraper bzw. Bots auf welche Bereiche der Website zugreifen dürfen. Die Einträge der robots.txt gelten dabei immer für eine gesamte Domäne.
Hier ein Beispiel für eine robots.txt-Datei, die das Scraping durch jegliche Bots auf der gesamten Site untersagt:
# Jeglicher Bot
User-agent: *
# Gesamtes Hauptverzeichnis ausschließen
Disallow: /
Bei der robots.txt handelt es sich um eine freiwillige Beschränkung. Die Bots sollen sich zwar an die Vorgaben halten; technisch erzwingen lässt sich dies jedoch nicht. Um den Zugriff durch Web Scraper effektiv zu regulieren, setzen Website-Betreiber daher auch aggressivere Techniken ein: Zum einen lässt sich der Zugriff durch Web Scraper per Durchsatzbegrenzung limitieren; zum anderen kann bei wiederholtem Zugriff entgegen der Vorgaben die IP-Adresse des Scrapers blockiert werden.

APIs als Alternative zum Web Scraping

Auch wenn das Web Scraping nützlich ist, handelt es sich nicht um den bevorzugten Ansatz, Daten von Websites zu beziehen. Oft gibt es einen besseren Weg: Viele Website-Betreiber stellen Daten in einem strukturierten, maschinenlesbaren Format zur Verfügung. Auf die Daten wird über spezielle Programmierschnittstellen zugegriffen, die sogenannten Application Programming Interfaces (APIs).
Die Vorteile, die sich durch Nutzung einer API ergeben, sind bedeutend:
  • Die API wird vom Anbieter explizit für den Zugriff auf die Daten zur Verfügung gestellt: Somit ergeben sich weniger juristische Risiken und der Anbieter kann den Zugriff auf die Daten besser regeln. Z. B. kann für den Datenzugriff ein API-Schlüssel verlangt werden. Auch die Durchsatzbegrenzung lässt sich vom Anbieter präziser umsetzen.
  • Die API liefert die Daten gleich in einem maschinenlesbaren Format aus: Damit entfällt das mühselige Extrahieren der Daten aus dem Quelltext. Ferner wird die Struktur der Daten von der visuellen Repräsentation getrennt. So bleibt die Struktur auch bei Änderung des Website-Designs bestehen.
Sofern eine API verfügbar ist und vollständige Daten liefert, ist diese der bevorzugte Weg, auf Daten zuzugreifen. Dennoch gilt: Mit Scraping lassen sich prinzipiell alle Texte abgreifen, die für Menschen lesbar auf Webseiten präsentiert werden.

Python-Web-Scraping-Tools

Im Python-Ökosystem existieren mehrere etablierte Tools für die Umsetzung eines Web-Scraping-Projekts:
  • Scrapy
  • Selenium
  • BeautifulSoup
Wir gehen im Weiteren auf die Vor- und Nachteile der drei Technologien ein.

Web Scraping mit Scrapy

Das Python-Web-Scraping-Tool Scrapy nutzt einen HTML-Parser, um Informationen aus dem HTML-Quelltext der Seite zu extrahieren. Es ergibt sich das folgende Schema für das Web Scraping mit Scrapy:
URL → HTTP-Request → HTML → Scrapy
Das Kernkonzept der Scraper-Entwicklung mit Scrapy sind die „Web Spider“ genannten Scraper. Dabei handelt es sich um kleine, auf Scrapy aufbauende Programme. Jeder Spider ist für das Scraping einer bestimmten Website programmiert und hangelt sich wie die namensgebende Spinne von Seite zu Seite. Dabei kommt objektorientierte Programmierung zum Einsatz: Jeder Spider ist eine eigene Python-Klasse.
Neben dem eigentlichen Python-Paket bringt die Scrapy-Installation ein Kommandozeilen-Tool mit. Über diese Scrapy Shell werden die Spider gesteuert. Ferner lassen sich existierende Spider in die Scrapy Cloud hochladen. Dort werden die Spider mit einem Terminplan versehen ausgeführt. So können auch große Sites gescrapt werden, ohne dass dafür der eigene Rechner und die heimische Internetverbindung herhalten müssen. Alternativ lässt sich ein eigener Web-Scraping-Server mit der Open-Source-Software Scrapyd aufsetzen.
Bei Scrapy handelt es sich um eine ausgereifte Plattform, um Web Scraping mit Python durchzuführen. Die Architektur des Tools orientiert sich an den Bedürfnissen professioneller Projekte. So enthält Scrapy eine integrierte Pipeline zur Verarbeitung der gescrapten Daten. Der Seitenabruf in Scrapy erfolgt asynchron; das bedeutet, dass mehrere Seiten parallel heruntergeladen werden können. Somit eignet sich Scrapy gut für Scraping-Projekte mit einem hohen Volumen an zu verarbeitenden Seiten.

Web Scraping mit Selenium

Die freie Software Selenium ist ein Framework für automatisierte Software-Tests von Webanwendungen. Eigentlich zum Testen von Webseiten und Web-Apps entwickelt, lässt sich der Selenium WebDriver mit Python auch zum Scrapen von Websites verwenden. Obwohl Selenium selbst nicht in Python geschrieben ist, lässt sich auf die Funktionalität der Software aus Python heraus zugreifen.
Anders als Scrapy oder BeautifulSoup operiert Selenium nicht auf dem HTML-Quelltext der Seite. Stattdessen wird die Seite in einem Browser ohne Benutzeroberfläche geladen. Der Browser interpretiert den Quelltext der Seite und erzeugt daraus ein Document Object Model (DOM). Diese standardisierte Schnittstelle erlaubt das Testen von Benutzerinteraktionen: So lassen sich u. a. Klicks simulieren und Formulare automatisiert ausfüllen. Die sich daraus ergebenden Änderungen an der Seite spiegeln sich im DOM wider. Es ergibt sich das folgende Schema für das Web Scraping mit Selenium:
URL → HTTP-Request → HTML → Selenium → DOM
Da das DOM dynamisch erzeugt wird, lassen sich mit Selenium auch Seiten scrapen, deren Inhalte über JavaScript erzeugt wurden. Der Zugriff auf dynamische Inhalte ist der entscheidende Vorteil von Selenium. Praktischerweise lässt sich Selenium auch in Kombination mit Scrapy oder BeautifulSoup einsetzen. Selenium liefert dabei den Quelltext, während das zweite Tool das Parsen und Auswerten übernimmt. In diesem Fall ergibt sich das folgende Schema:
URL → HTTP-Request → HTML → Selenium → DOM → HTML → Scrapy / BeautifulSoup

Web Scraping mit BeautifulSoup

BeautifulSoup ist das älteste der vorgestellten Python-Web-Scraping-Tools. Wie bei Scrapy handelt es sich um einen HTML-Parser. Es ergibt sich das folgende Schema für das Web Scraping mit BeautifulSoup:
URL → HTTP-Request → HTML → BeautifulSoup
Im Gegensatz zu Scrapy erfordert die Scraper-Entwicklung mit BeautifulSoup keine objektorientierte Programmierung. Stattdessen wird ein Scraper als einfaches Skript geschrieben. Somit handelt es sich bei BeautifulSoup um den wohl einfachsten Weg, gezielt Informationen aus der „Tag-Suppe“ zu fischen.

Python-Web-Scraping-Tools im Vergleich

Jedes der drei vorgestellten Tools hat seine Vor- und Nachteile. Wir haben diese für Sie übersichtlich zusammengefasst:
  Scrapy Selenium BeautifulSoup
Einfach zu erlernen ++ + +++
Dynamische Inhalte auslesen ++ +++ +
Komplexe Anwendungen realisieren +++ + ++
Robustheit gegenüber HTML-Fehlern ++ + +++
Für Scraping-Performanz optimiert +++ + +
Ausgeprägtes Ökosystem +++ + ++
Fazit
Welches Tool sollten Sie nun für Ihr Projekt verwenden? Kurz gesagt: Nehmen Sie BeautifulSoup, wenn die Entwicklung schnell gehen soll oder Sie sich erst einmal mit den Themen Python und Web Scraping vertraut machen möchten. Mit Scrapy lassen sich anspruchsvolle Web-Scraping-Anwendungen in Python realisieren – das entsprechende Know-how vorausgesetzt. Greifen Sie auf Selenium zurück, wenn es Ihnen primär darum geht, dynamische Inhalte mit Python zu scrapen.

Web Scraping mit Python und BeautifulSoup – ein Tutorial

Hier zeigen wir Ihnen, wie Sie mit BeautifulSoup Daten aus einer Webseite extrahieren können. Zunächst müssen Sie Python und einige Hilfsmittel installieren. Sie benötigen:
  • Python ab Version 3.4
  • Den Python-Paketmanager pip
  • Das venv-Modul
Bitte befolgen Sie zur Installation die Anweisungen auf der Python-Installations-Seite.
Sofern Sie auf Ihrem System den freien Paketmanager Homebrew installiert haben, können Sie Python auch mit dem folgenden Befehl installieren:
brew install python
Hinweis
Die nachfolgenden Erklärungen und der abgebildete Code beziehen sich auf Python 3 unter macOS. Prinzipiell sollte der Code auch auf anderen Betriebssystemen laufen. Es kann jedoch sein, dass Sie einige Anpassungen vornehmen müssen, insbesondere, wenn Sie Windows verwenden.

Python-Web-Scraping-Projekt auf dem eigenen Gerät einrichten

Wir wollen den Projektordner web Scraper für das Python Tutorial auf dem Desktop anlegen. Öffnen Sie eine Kommandozeile (Terminal.App auf dem Mac), kopieren Sie die folgenden Codezeilen in das Terminal und führen Sie diese aus:
# In den Desktop-Ordner wechseln
cd ~/Desktop/
# Projektverzeichnis anlegen
mkdir ./web Scraper/ && cd ./web Scraper/
# Virtuelle Umgebung anlegen
# stellt u. a. sicher, dass später pip3 verwendet wird
python3 -m venv ./env
# Virtuelle Umgebung aktivieren
source ./env/bin/activate
# Pakete installieren
pip install requests
pip install beautifulsoup4

Mit Python und BeautifulSoup Zitate und Autoren scrapen

Die Website Quotes to Scrape stellt eine Auswahl an Zitaten zur Verfügung. Dabei handelt es sich um ein Angebot speziell für Scraping-Tests. So müssen wir uns keine Sorgen machen, gegen Nutzungsbedingungen zu verstoßen.
Lassen Sie uns beginnen. Öffnen Sie eine Kommandozeile (Terminal.App auf dem Mac) und starten Sie den Python-Interpreter aus Ihrem Python-Projektordner web Scraper. Kopieren Sie dafür die folgenden Codezeilen in das Terminal und führen Sie diese aus:
# Zum Projektverzeichnis wechseln
cd ~/Desktop/web Scraper/
# Virtuelle Umgebung aktivieren
source ./env/bin/activate
# Python-Interpreter starten
# da wir uns in der virtuellen Umgebung befinden, wird python3 verwendet
python
Kopieren Sie nun den folgenden Code und fügen Sie diesen im Python-Interpreter in die Kommandozeile ein. Drücken Sie dann Enter – ggf. mehrmals –, um den Code auszuführen. Sie können den Code auch als Datei scrape_quotes.py in Ihrem Projektordner web Scraper speichern. In diesem Fall können Sie das Python-Script mit dem Befehl python scrape_quotes.py ausführen.
Als Endresultat der Code-Ausführung sollte in Ihrem Python-Projektordner web Scraper eine Datei zitate.csv abgelegt werden. Dabei handelt es sich um eine Tabelle mit den Zitaten und Autoren. Öffnen Sie die Datei mit einem Tabellenkalkulationsprogramm Ihrer Wahl.

# Module importieren
import requests
import csv
from bs4 import BeautifulSoup
# Adresse der Webseite
url = "http://quotes.toscrape.com/"
# GET-Request ausführen
response = requests.get(url)
# BeautifulSoup HTML-Dokument aus dem Quelltext parsen
html = BeautifulSoup(response.text, 'html.parser')
# Alle Zitate und Autoren aus dem HTML-Dokument extrahieren
quotes_html = html.find_all('span', class_="text")
authors_html = html.find_all('small', class_="author")
# Die Zitate in einer Liste sammeln
quotes = list()
for quote in quotes_html:
    quotes.append(quote.text)
# Die Autoren in einer Liste sammeln
authors = list()
for author in authors_html:
    authors.append(author.text) 
# Zum Testen: Einträge beiden Listen kombinieren und ausgeben
for t in zip(quotes, authors):
print(t)
# Die Zitate und Autoren in einer CSV-Datei im aktuellen Verzeichnis speichern
# Öffnen Sie die Datei mit Excel / LibreOffice, etc.
with open('./zitate.csv', 'w') as csv_file:
    csv_writer = csv.writer(csv_file, dialect='excel')
    csv_writer.writerows(zip(quotes, authors))

Python-Pakete für Web Scraping nutzen

Jedes Web-Scraping-Projekt ist anders: Mal wollen Sie eine Seite bloß auf Änderungen überprüfen; ein andermal geht es Ihnen um komplexe Auswertungen. Unter Python steht Ihnen eine große Auswahl an Paketen zur Verfügung.
  1. Pakete auf der Kommandozeile mit pip3 installieren.
pip3 install <package></package>
  1. Module innerhalb des Python-Scripts mit import einbinden.
from <package> import <module></module></package>
Die folgenden Pakete finden oft Verwendung in Web-Scraping-Projekten:
Paket Verwendung
venv Virtuelle Umgebung für Projekt verwalten
request Webseiten abrufen
lxml Alternativen Parser für HTML und XML nutzen
csv Tabellarische Daten im CSV-Format lesen und schreiben
pandas Daten verarbeiten und auswerten
scrapy Scrapy verwenden
selenium Selenium WebDriver verwenden
Tipp
Nutzen Sie den Python Package Index (PyPI) für eine Übersicht verfügbarer Python-Pakete.
Bitte beachten Sie den rechtlichen Hinweis zu diesem Artikel.
War dieser Artikel hilfreich?
Page top