Grundlagen des Web Scraping mit Python
Web Scraping, oft auch als Datenscraping bezeichnet, beschreibt den Prozess des automatischen Extrahierens von Daten aus Webseiten. Diese Technik ermöglicht es, strukturierte Informationen zu gewinnen und sie für unterschiedliche Zwecke zu nutzen.
Stellen Sie sich vor, Sie möchten Daten aus einer Online-Tabelle extrahieren, diese in das JSON-Format umwandeln und sie anschließend für die Entwicklung eigener interner Anwendungen verwenden. Web Scraping bietet Ihnen die Möglichkeit, genau die gewünschten Daten zu sammeln, indem es auf spezifische Elemente einer Webseite zugreift. Insbesondere die Verwendung von Python für Web Scraping ist sehr populär, da Python eine Vielzahl von Bibliotheken wie BeautifulSoup oder Scrapy bereitstellt, die den Datenextraktionsprozess erheblich vereinfachen.
Die Fähigkeit, Daten effizient zu extrahieren, ist heutzutage für Entwickler und Datenwissenschaftler von entscheidender Bedeutung. Dieser Artikel soll Ihnen helfen, die Grundlagen des Web Scrapings zu verstehen und die notwendigen Techniken zu erlernen, um Webseiten gezielt zu durchsuchen und die gewonnenen Inhalte nach Ihren Bedürfnissen zu verarbeiten. In diesem Tutorial werden wir uns auf das BeautifulSoup-Paket konzentrieren, eine beliebte und benutzerfreundliche Bibliothek für das Web Scraping mit Python.
Warum Python für Web Scraping verwenden?
Python ist für viele Entwickler die erste Wahl, wenn es um die Entwicklung von Web-Scrapern geht. Es gibt viele Gründe für diese Beliebtheit, aber in diesem Artikel werden wir uns auf drei Hauptargumente konzentrieren.
Umfangreiche Bibliotheks- und Community-Unterstützung: Python verfügt über eine beeindruckende Sammlung von Bibliotheken, darunter BeautifulSoup, Scrapy und Selenium, die effiziente Methoden zur Datenextraktion aus Webseiten bieten. Dieses etablierte Ökosystem für Web Scraping, kombiniert mit einer großen globalen Entwicklergemeinschaft, sorgt dafür, dass Sie schnell Hilfe finden, sollten Sie auf Probleme stoßen.
Automatisierungsfähigkeiten: Python ist bekannt für seine hervorragenden Automatisierungsfähigkeiten. Wenn Sie ein komplexes Tool entwickeln möchten, das auf Web Scraping basiert, ist mehr als nur die reine Datenextraktion erforderlich. Stellen Sie sich beispielsweise vor, Sie erstellen ein Tool, das die Preise von Artikeln in einem Online-Shop überwacht. In diesem Fall sind Automatisierungsfunktionen notwendig, damit das Tool die Preise täglich verfolgen und in Ihrer Datenbank speichern kann. Python erleichtert die Automatisierung solcher Prozesse erheblich.
Datenvisualisierung: Web Scraping spielt eine wichtige Rolle für Datenwissenschaftler. Sie benötigen oft Daten von Webseiten für ihre Analysen. Python bietet Bibliotheken wie Pandas, die die Datenvisualisierung aus Rohdaten erheblich vereinfachen.
Bibliotheken für Web Scraping in Python
Python bietet eine Reihe von Bibliotheken, die den Prozess des Web Scraping erheblich vereinfachen. Lassen Sie uns die drei populärsten Bibliotheken genauer betrachten:
#1. BeautifulSoup
BeautifulSoup ist eine der am häufigsten verwendeten Bibliotheken für Web Scraping. Sie unterstützt Entwickler seit 2004 beim Extrahieren von Daten aus Webseiten. Die Bibliothek bietet einfache Methoden zum Navigieren, Suchen und Bearbeiten der Parse-Baumstruktur. BeautifulSoup kümmert sich auch um die Codierung eingehender und ausgehender Daten. Die Bibliothek wird aktiv weiterentwickelt und verfügt über eine aktive Community.
#2. Scrapy
Scrapy ist ein weiteres bekanntes Framework für die Datenextraktion. Mit über 43.000 Sternen auf GitHub ist Scrapy sehr beliebt und vielseitig. Es kann nicht nur zum Scrapen von Webseiten, sondern auch zum Extrahieren von Daten aus APIs verwendet werden. Scrapy bietet auch praktische Features wie den Versand von E-Mails.
#3. Selenium
Selenium ist in erster Linie keine Web-Scraping-Bibliothek, sondern ein Browser-Automatisierungspaket. Dennoch können wir seine Funktionen nutzen, um Daten von Webseiten zu extrahieren. Selenium verwendet das WebDriver-Protokoll, um verschiedene Browser zu steuern. Es ist seit fast 20 Jahren auf dem Markt. Mit Selenium können Sie den Prozess der Datenextraktion von Webseiten einfach automatisieren.
Herausforderungen beim Web Scraping mit Python
Beim Scrapen von Daten von Webseiten können diverse Herausforderungen auftreten. Dazu gehören Probleme wie langsame Netzwerke, Anti-Scraping-Mechanismen, IP-basierte Blockierungen und Captcha-Aufforderungen. Diese Herausforderungen können die Arbeit mit Web Scraping erheblich erschweren.
Es gibt jedoch Möglichkeiten, diese Herausforderungen effektiv zu meistern. Beispielsweise wird eine IP-Adresse oft von einer Website blockiert, wenn innerhalb eines bestimmten Zeitraums zu viele Anfragen gesendet werden. Um eine IP-Sperre zu vermeiden, sollten Sie Ihren Scraper so programmieren, dass er nach dem Senden von Anfragen eine kurze Pause einlegt.
Darüber hinaus verwenden Entwickler oft Honeypot-Fallen, die für Scraper gedacht sind. Diese Fallen sind für das menschliche Auge oft unsichtbar, können aber von Scraping-Programmen erkannt werden. Wenn Sie eine Website mit einer solchen Falle scrapen, muss Ihr Scraper entsprechend angepasst werden.
Captcha ist ein weiteres Problem, das beim Web Scraping auftreten kann. Viele Websites verwenden heute Captchas, um Bot-Zugriffe auf ihre Seiten zu verhindern. In solchen Fällen kann ein Captcha-Löser erforderlich sein.
Eine Website mit Python scrapen
Wie bereits erwähnt, verwenden wir BeautifulSoup, um eine Website zu scrapen. In diesem Tutorial extrahieren wir die historischen Ethereum-Daten von Coingecko und speichern die Tabellendaten als JSON-Datei. Lassen Sie uns nun mit der Erstellung des Scrapers beginnen.
Der erste Schritt ist die Installation von BeautifulSoup und Requests. Für dieses Tutorial verwende ich Pipenv, einen virtuellen Umgebungsmanager für Python. Sie können auch Venv verwenden, wenn Sie möchten, aber ich bevorzuge Pipenv. Die detaillierte Erläuterung von Pipenv würde den Rahmen dieses Tutorials sprengen. Hier finden Sie jedoch eine Anleitung zur Verwendung von Pipenv und hier eine Einführung zu virtuellen Python-Umgebungen.
Starten Sie die Pipenv-Shell in Ihrem Projektverzeichnis mit dem Befehl pipenv shell
. Dies startet eine Subshell in Ihrer virtuellen Umgebung. Führen Sie nun den folgenden Befehl aus, um BeautifulSoup zu installieren:
pipenv install beautifulsoup4
Um Requests zu installieren, verwenden Sie einen ähnlichen Befehl:
pipenv install requests
Nach der Installation importieren Sie die benötigten Pakete in Ihre Hauptdatei. Erstellen Sie eine Datei namens main.py
und importieren Sie die Pakete wie folgt:
from bs4 import BeautifulSoup import requests import json
Der nächste Schritt ist das Abrufen des Inhalts der historischen Datenseite und dessen Parsen mit dem HTML-Parser von BeautifulSoup.
r = requests.get('https://www.coingecko.com/en/coins/ethereum/historical_data#panel') soup = BeautifulSoup(r.content, 'html.parser')
Im obigen Code greifen wir mit der get-Methode der Requests-Bibliothek auf die Seite zu. Der geparste Inhalt wird dann in einer Variablen namens soup
gespeichert.
Der eigentliche Scrape-Prozess beginnt nun. Zuerst müssen Sie die Tabelle im DOM korrekt identifizieren. Wenn Sie die Seite öffnen und sie mit den Entwicklerwerkzeugen Ihres Browsers untersuchen, sehen Sie, dass die Tabelle die folgenden Klassen hat: table table-striped text-sm text-lg-normal
.
Um diese Tabelle korrekt anzusprechen, können Sie die find
-Methode verwenden:
table = soup.find('table', attrs={'class': 'table table-striped text-sm text-lg-normal'}) table_data = table.find_all('tr') table_headings = [] for th in table_data[0].find_all('th'): table_headings.append(th.text)
Im obigen Code wird zunächst die Tabelle mit der Methode soup.find
gefunden. Dann werden mit der Methode find_all
alle tr
-Elemente in der Tabelle durchsucht. Diese tr
-Elemente werden in der Variable table_data
gespeichert. Die Tabelle enthält einige Elemente für die Überschriften. Eine neue Variable namens table_headings
wird initialisiert, um die Überschriften in einer Liste zu speichern.
Anschließend wird eine For-Schleife für die erste Zeile der Tabelle ausgeführt. In dieser Zeile werden alle th
-Elemente gefunden und ihr Textwert wird zur Liste table_headings
hinzugefügt. Der Text wird mit der text
-Methode extrahiert. Wenn Sie jetzt die Variable table_headings
ausgeben, wird die folgende Ausgabe angezeigt:
['Date', 'Market Cap', 'Volume', 'Open', 'Close']
Der nächste Schritt ist das Scrapen der restlichen Elemente, das Erstellen eines Wörterbuchs für jede Zeile und das Anhängen der Zeilen an eine Liste.
table_details = [] for tr in table_data: th = tr.find_all('th') td = tr.find_all('td') data = {} for i in range(len(td)): data.update({table_headings[0]: th[0].text}) data.update({table_headings[i+1]: td[i].text.replace('n', '')}) if data.__len__() > 0: table_details.append(data)
Dies ist der Kern des Codes. Für jedes tr
in der table_data
-Variable werden zuerst die th
-Elemente gesucht. Die th
-Elemente enthalten die Überschriften der Tabelle. Diese th
-Elemente werden in einer Variablen th
gespeichert. In ähnlicher Weise werden alle td
-Elemente in der Variablen td
gespeichert.
Ein leeres Wörterbuch data
wird initialisiert. Nach der Initialisierung iterieren wir durch den Bereich der td
-Elemente. Für jede Zeile aktualisieren wir zuerst das erste Feld des Wörterbuchs mit dem ersten Element von th
. Der Code table_headings[0]: th[0].text
weist ein Schlüssel-Wert-Paar aus Datum und dem ersten Element zu.
Nach der Initialisierung des ersten Elements werden die weiteren Elemente mit data.update({table_headings[i+1]: td[i].text.replace('n', '')})
aktualisiert. Hier wird der Text der td
-Elemente mit der Methode text
extrahiert und anschließend werden alle n
mit der Methode replace
entfernt. Der Wert wird dann dem i+1-ten Element der Liste table_headings
zugewiesen, da das i-te Element bereits zugewiesen ist.
Wenn die Länge des Wörterbuchs data
dann größer als Null ist, wird das Wörterbuch der Liste table_details
hinzugefügt. Sie können die Liste table_details
zur Überprüfung ausgeben, aber wir schreiben die Werte in eine JSON-Datei. Betrachten wir den entsprechenden Code:
with open('table.json', 'w') as f: json.dump(table_details, f, indent=2) print('Data saved to json file...')
Wir verwenden hier die Methode json.dump
, um die Werte in eine JSON-Datei namens table.json
zu schreiben. Nach dem Abschluss des Schreibvorgangs wird der Text „Data saved to json file…“ auf der Konsole ausgegeben.
Führen Sie nun die Datei mit dem folgenden Befehl aus:
python run main.py
Nach einer kurzen Zeit sollte der Text „Data saved to JSON file…“ auf der Konsole erscheinen. Sie sehen auch eine neue Datei namens table.json
in Ihrem Arbeitsverzeichnis. Die Datei sollte in etwa wie folgt aussehen:
[ { "Date": "2022-11-27", "Market Cap": "$145,222,050,633", "Volume": "$5,271,100,860", "Open": "$1,205.66", "Close": "N/A" }, { "Date": "2022-11-26", "Market Cap": "$144,810,246,845", "Volume": "$5,823,202,533", "Open": "$1,198.98", "Close": "$1,205.66" }, { "Date": "2022-11-25", "Market Cap": "$145,091,739,838", "Volume": "$6,955,523,718", "Open": "$1,204.21", "Close": "$1,198.98" }, // ... // ... ]
Sie haben erfolgreich einen Web Scraper mit Python implementiert. Den vollständigen Code können Sie in diesem GitHub-Repository finden.
Fazit
In diesem Artikel haben wir die grundlegenden Schritte zur Implementierung eines einfachen Python-Scrapers erläutert. Wir haben besprochen, wie BeautifulSoup für das schnelle Scrapen von Daten von Webseiten verwendet werden kann. Wir haben auch andere verfügbare Bibliotheken sowie die Gründe dafür diskutiert, warum Python für viele Entwickler die bevorzugte Wahl für Web Scraping ist.
Hier sind einige zusätzliche Web Scraping Frameworks, die Sie sich ansehen können.