Im Internet gibt es Millionen und Milliarden von Websites und entsprechend auch eine riesige Menge an Informationen. Web Scraping ist das automatisierte Auslesen von Homepages mit dem Ziel die gesuchten Informationen in großer Zahl auslesen zu können. Dieser Beitrag zeigt, wie man mit Python einfache Web Scraping Projekte realisieren kann.
Kurze Einführung: Quellcode einer Website
Damit wir Web Scraping verstehen und anwenden können, müssen wir uns auch mit dem allgemeinen Aufbau und der Funktionsweise einer Website beschäftigen. Wir versuchen in diesem Beitrag nur auf die grundlegendsten Elemente einzugehen, ohne die dieser Text sonst nicht verständlich wäre. Auf w3schools gibt es darüber hinaus noch ausführliche Tutorials zu HTML, CSS und JavaScript, bei denen man weiter in die Tiefe gehen kann.
Der Grundaufbau jeder Website ist mit Hilfe von Hypertext Markup Language (HTML) umgesetzt. Mit dieser wird beispielsweise definiert, welche Textabschnitte Überschriften sind, Bilder eingefügt oder verschiedene Seitenabschnitte definiert. Darüber hinaus werden die Cascading Style Sheets (CSS) genutzt, um die Website zu designen, also die Schriftart und Schriftfarbe zu definieren oder die Abstände zwischen Textelementen festzulegen.
Mit Hilfe von HTML und CSS lässt sich bereits eine Vielzahl von Internetseiten nachbauen. Jedoch nutzen viele noch zusätzlich JavaScript, um den Inhalten Leben einzuhauchen. Ganz allgemein lässt sich sagen, dass alles, was man sieht, wenn man den Refresh Button klickt oder neu auf eine Seite (mit einer anderen URL) kommt mit HTML und CSS programmiert ist. Alles was erst nachträglich “aufpoppt” oder mit einem Button geöffnet wird, ohne(!) dass eine komplett neue Seite geladen wird ist hingegen mit JavaScript programmiert.
Wenn Du Dich dafür interessierst, wie konkrete Websites aufgebaut sind, kannst Du in den meisten Browsern mit der Tastenkombination Strg & Umschalt & i (MacBook entsprechend Cmd statt Strg), den Quellcode der geöffneten Seite einsehen. Ansonsten geht es auch per Rechtsklick und anschließend auf Untersuchen.
Python Bibliotheken für Web Scraping
Python stellt verschiedenste Bibliotheken zur Verfügung mit denen man Web Scraping betreiben kann. Grundsätzlich unterscheiden diese sich darin, wie “tief” sie Informationen von der Seite scrapen können. Beim Web Scraping gibt es verschiedene Schwierigkeitsstufen, um an die gewünschten Daten zu kommen.
Am einfachsten ist es, wenn die Informationen, die man abgreifen will, im Code versteckt sind, der beim initialen Laden der Seite zur Ausführung kommt. Dafür ist die Python Bibliothek Beautiful Soup am Besten geeignet, die wir in diesem Beispiel auch verwenden werden. Für solche Anwendungen kann auch Scrapy genutzt werden. Es geht über Beautiful Soup hinaus, indem es auch bei der anschließenden Datenverarbeitung und Datenspeicherung behilflich ist. Welche der beiden Bibliothek man nutzt ist in den meisten Fällen eher eine Geschmacksfrage.
Die Bibliothek Selenium ist vor allem dann nützlich, wenn erst eine Interaktion mit der Website stattfinden muss, um überhaupt an die gewünschten Informationen zu gelangen. Wenn man sich beispielsweise erst einloggen muss, kann man in Selenium die Website öffnen und auch per Python Code mit ihr interagieren. Dieses Feature bietet Beautiful Soup beispielsweise nicht, da es nur die statischen Elemente der Website scrapen kann.
Was halten Website Betreiber von Scrapern?
Für die Betreiber von Internetseiten sind Web Scraping Algorithmen und andere automatisierte Visits vergleichsweise einfach über das Web-Tracking-Tool erkennbar. Einfach gehaltene Web Scraper lassen sich beispielsweise an sehr kurzen Verweildauern von unter einer Sekunde oder vielen Seitenzugriffen in kurzer Zeit erkennen. Dies lässt darauf schließen, dass es sich dabei nicht um einen menschlichen Zugriff handelt. Die IP-Adressen dieser Besucher lassen sich dann auch mit wenigen Klicks sperren. Automatisierte Website-Besucher müssen aber nicht gezwungenermaßen ein Nachteil für das betroffene Unternehmen oder den Website Betreiber sein.
Die Suchmaschine Google beispielweise scraped relevante Websites in regelmäßigen Abständen und sucht sie nach den sogenannten Keywords und Backlinks ab, um die Suchreihenfolge zu aktualisieren und zu verbessern. Ein anderes Beispiel sind Preisvergleichsseiten, welche mit Hilfe von Web Scrapern regelmäßig Preise für relevante Produkte extrahieren. Ein unbekannter Online-Shop für Notebooks profitiert von der großen Reichweite der Vergleichsseite und hofft dadurch seinen Umsatz steigern zu können. Diese Unternehmen werden Web Scrapern gerne Zugriff auf ihre Seite gewähren. Auf der anderen Seite können auch Wettbewerber diese Methode nutzen, um beispielsweise in großem Stil Preise abzufragen.
Es lässt sich nur schwer sagen, ob Web Scraping im heutigen Web positiv oder negativ ist. Es findet auf jeden Fall häufiger statt, als wir denken. Im Allgemeinen ist es für Websiten Betreiber wichtig, dass die Scraper die technisch einwandfreie Funktionalität der Seite nicht in Gefahr bringen und sie die automatisierten Besucher bei ihrer Analyse ausschließen, um nicht falsche Schlüsse zu ziehen. Ansonsten entscheidet sich im Einzelfall, ob Web Scraping eher schädlich oder nützlich für eine Seite ist.
Beispiel: Homepage Apple Inc.
Für dieses Beispiel werden wir den Store von Apple Inc. scrapen, um herauszufinden, welche Produktkategorien Apple aktuell anbietet. Dieses einfache Beispiel könnte genutzt werden, um die Kategorien über einen längeren Zeitraum zu erfassen und eine automatisierte Benachrichtigung zu bekommen, sobald Apple eine neue Produktkategorie in das Sortiment aufnimmt. Zugegeben, wahrscheinlich werden die wenigsten wirklich eine solche Auswertung benötigen, da man das nach der Apple Keynote oder aus den meisten einschlägigen Nachrichtenportalen erfährt, aber es ist ein anschauliches Beispiel.
Das gezeigte Beispiel wurde in Python 3.7 entwickelt und getestet. Als erstes importieren wir zwei Bibliotheken, urllib nutzen wir für den Umgang mit URLs und für das Öffnen von Websites und Beautifoul Soup für das eigentliche Web Scraping. Wir speichern uns den kompletten Code der Website in der Variable “soup” ab, dabei hilft uns die Bibliothek Beautiful Soup.
import urllib.request
from bs4 import BeautifulSoup
url = "https://www.apple.com/store"
open_page = urllib.request.urlopen(url)
soup = BeautifulSoup(open_page, "html.parser")
print(soup)
Eine Untersuchung der Seite von Apple Inc. ergibt, dass die Namen der Produktkategorien in Abschnitten mit der Klasse “rf-productnav-card-title” abgespeichert sind. Diese Klassen werden von den Entwicklern der Website vergeben und müssen bei jedem Projekt aufs Neue gesucht werden. Bevor wir also mit dem Bau eines Web Scrapers beginnen können, müssen wir die Positionen der interessanten Informationen auf der Website ausmachen. In unserem Fall ist das die beschriebene Klasse.
In unserem Quellcode der Website, die wir in der Variable “soup” gespeichert haben, müssen wir nun alle Elemente der Klasse ” rf-productnav-card-title” finden. Dies tun wir mit dem Befehl “findAll”. Diese Elemente können wir mit einer for-Schleife durchlaufen und uns jeweils nur den Text des Elements ausgeben lassen.
for category in soup.findAll(attrs={"class": "rf-productnav-card-title"}):
category = category.text.strip()
print(category)
# Output:
Mac
iPhone
iPad
Apple Watch
Apple TV
AirPods
HomePod Mini
iPod touch
Accessories
Apple Gift Card
Mit diesen wenigen Zeilen Code haben wir es also geschafft Informationen von der Apple Website zu scrapen. Nicht alle Anwendungsfälle werden immer so schnell umzusetzen sein wie dieser. Es kann natürlich auch vorkommen, dass die gesuchten Informationen deutlich verschachtelter in der Website sind. Des Weiteren müssen wir Web Scraping Projekte auch immer wieder auf Funktionalität überprüfen, da die gescrapeten Seiten ihren Aufbau ändern können, woraufhin wir unseren Code umbauen müssen. Es ist also nicht sichergestellt, dass unser Algorithmus auch in wenigen Monaten noch funktionieren wird, sondern muss in regelmäßigen Abständen geprüft und überarbeitet werden.
Welche Web Scraping Techniken gibt es noch?
Je nachdem, welche Informationen man von einer Website erhalten will und wo diese abgespeichert sind, gibt es verschiedene Arten des Web Scrapings. Die folgenden Formen zählen zu den gängigsten Methoden:
- Verwendung von HTML-Parsing-Bibliotheken: Diese Methode haben wir in unserem Beispiel angewendet, indem wir eine Python Bibliothek genutzt haben, um Information aus der HTML Struktur einer Website herauszulesen. Eine solche Art des Web Scrapings ist gut geeignet für einfache Web Scraping Aufgaben und wenn sich die Informationen bereits in der HTML-Struktur der Website befinden und keine Interaktion, wie zum Beispiel ein Buttonklick stattfinden muss.
- Verwendung von APIs: Je nach Art der Website kann es vorkommen, dass die Seite bereits eine vordefinierte Schnittstelle, eine sogenannte API bereitstellt, damit die Daten dort strukturiert abgefragt werden können. Diese Art des Web Scrapings eignet sich sehr gut, wenn die Informationen in regelmäßigen Abständen abgefragt werden sollen. Die APIs ermöglichen einen einfachen Zugriff auf die Daten und verhindern eine hohe Belastung der Website durch Scraping.
- No-Code Tools für das Web Scraping: Auch technisch nicht-versierte Benutzer können eigene Web Scraper erstellen, indem sie Web Scraping Tools nutzen, die ganz ohne Programmiercode auskommen. Beispiel hierfür sind unter anderem Octoparse, Parsehub und WebHarvy.
- Verwendung der Browser-Automatisierung: Bei dieser Technik werden Tools, wie beispielsweise Selenium genutzt, die eine menschliche Interaktion mit der Website simulieren und dadurch Daten zum Vorschein bringen, die erst durch Ausführung von JavaScript Code zum Vorschein kommen. Dieses Scraping ist nützlich für das Auslesen von dynamischen Website, die Teile des Inhalts erst noch rendern.
- Verwendung von HTTP-Anfragen: Bei dieser Art des Web Scrappings werden HTTP-Anfrage an die Website direkt gestellt und die Antwort ausgewertet. Dadurch lassen sich auch Website verarbeiten, die keine klar definierte HTML-Struktur aufweisen.
Wie wir gesehen haben, hängt die Wahl der Web Scraping Art nicht nur vom Aufbau der Website selbst ab, sondern auch von den Vorkenntnissen und Fähigkeiten des Benutzers. Mit diesen Werkzeugen lassen sich bereits eine Großzahl von Websites scrapen. Jedoch sollte dabei immer darauf geachtet werden, dass die Erlaubnis des Website-Eigentümers eingeholt wurde und gewisse Standards befolgt werden.
Das solltest Du mitnehmen
- Web Scraping ist das automatisierte Auslesen von Websiten, um die gewünschten Informationen extrahieren zu können.
- Python bietet verschiedene Bibliotheken für das Scraping an, die je nach Anwendungsfall auszuwählen sind.
- Ein gewisses Verständnis für den Aufbau von Websites ist erforderlich, um einen funktionierenden Scraper programmieren zu können.
Was sind Microservices?
Erstellen Sie skalierbare und modulare Anwendungen mit Microservices. Ermöglichen Sie flexible Dienste für eine effiziente Entwicklung.
Was ist Named Entity Recognition (NER)?
Erklärung von Named Entity Recognition mit Beispielen und Anwendungen.
Sentiment Analyse mit BERT und TensorFlow
Nutzung des BERT Embeddings zur Textklassifizierung von IMDb Filmbewertungen.
Convolutional Neural Network in TensorFlow mit CIFAR10 Bildern
Convolutional Neural Network in Python erstellen mit Tensorflow.
Andere Beiträge zum Thema Web Scraping
- Wenn Du wirklich alles zum Thema Web Scraping mit Python wissen willst, kann ich das Buch “Web Scraping with Python” von O’Reilly nur empfehlen.
Niklas Lang
Seit 2020 bin ich als Machine Learning Engineer und Softwareentwickler tätig und beschäftige mich leidenschaftlich mit der Welt der Daten, Algorithmen und Softwareentwicklung. Neben meiner Arbeit in der Praxis unterrichte ich an mehreren deutschen Hochschulen, darunter die IU International University of Applied Sciences und die Duale Hochschule Baden-Württemberg, in den Bereichen Data Science, Mathematik und Business Analytics.
Mein Ziel ist es, komplexe Themen wie Statistik und maschinelles Lernen so aufzubereiten, dass sie nicht nur verständlich, sondern auch spannend und greifbar werden. Dabei kombiniere ich praktische Erfahrungen aus der Industrie mit fundierten theoretischen Grundlagen, um meine Studierenden bestmöglich auf die Herausforderungen der Datenwelt vorzubereiten.