Web Scraping mit Python: Schritt-für-Schritt-Anleitung

Web Scraping ist die Idee, Informationen von einer Website zu extrahieren und für einen bestimmten Anwendungsfall zu verwenden.

Angenommen, Sie versuchen, eine Tabelle aus einer Webseite zu extrahieren, sie in eine JSON-Datei zu konvertieren und die JSON-Datei zum Erstellen einiger interner Tools zu verwenden. Mit Hilfe von Web Scraping können Sie die gewünschten Daten extrahieren, indem Sie auf bestimmte Elemente einer Webseite abzielen. Web-Scraping mit Python ist eine sehr beliebte Wahl, da Python mehrere Bibliotheken wie BeautifulSoup oder Scrapy bereitstellt, um Daten effektiv zu extrahieren.

Die Fähigkeit, Daten effizient zu extrahieren, ist auch als Entwickler oder Datenwissenschaftler sehr wichtig. Dieser Artikel wird Ihnen helfen zu verstehen, wie Sie eine Website effektiv schaben und die notwendigen Inhalte erhalten, um sie nach Ihren Bedürfnissen zu manipulieren. Für dieses Tutorial verwenden wir das BeautifulSoup-Paket. Es ist ein trendiges Paket zum Scrapen von Daten in Python.

Warum Python für Web Scraping verwenden?

Python ist für viele Entwickler die erste Wahl beim Bau von Web Scrapern. Es gibt viele Gründe, warum Python die erste Wahl ist, aber lassen Sie uns für diesen Artikel drei Hauptgründe diskutieren, warum Python für das Data Scraping verwendet wird.

Bibliotheks- und Community-Unterstützung: Es gibt mehrere großartige Bibliotheken wie BeautifulSoup, Scrapy, Selenium usw., die großartige Funktionen zum effektiven Scrapen von Webseiten bieten. Es hat ein hervorragendes Ökosystem für Web Scraping aufgebaut, und da viele Entwickler weltweit bereits Python verwenden, können Sie schnell Hilfe bekommen, wenn Sie nicht weiterkommen.

Automatisierung: Python ist berühmt für seine Automatisierungsfähigkeiten. Wenn Sie versuchen, ein komplexes Tool zu erstellen, das auf Scraping basiert, ist mehr als nur Web Scraping erforderlich. Wenn Sie beispielsweise ein Tool erstellen möchten, das den Preis von Artikeln in einem Online-Shop verfolgt, müssen Sie einige Automatisierungsfunktionen hinzufügen, damit es die Preise täglich verfolgen und zu Ihrer Datenbank hinzufügen kann. Python gibt Ihnen die Möglichkeit, solche Prozesse mit Leichtigkeit zu automatisieren.

Datenvisualisierung: Web Scraping wird von Datenwissenschaftlern stark genutzt. Data Scientists müssen häufig Daten aus Webseiten extrahieren. Mit Bibliotheken wie Pandas vereinfacht Python die Datenvisualisierung aus Rohdaten.

Bibliotheken für Web Scraping in Python

In Python sind mehrere Bibliotheken verfügbar, um das Web Scraping zu vereinfachen. Lassen Sie uns hier die drei beliebtesten Bibliotheken besprechen.

#1. Schöne Suppe

Eine der beliebtesten Bibliotheken für Web Scraping. BeautifulSoup hilft Entwicklern seit 2004 beim Scrapen von Webseiten. Es bietet einfache Methoden zum Navigieren, Suchen und Ändern des Parse-Baums. Beautifulsoup selbst übernimmt auch die Codierung für eingehende und ausgehende Daten. Es ist gut gepflegt und hat eine tolle Community.

#2. Schroff

Ein weiteres beliebtes Framework für die Datenextraktion. Scrapy hat mehr als 43000 Sterne auf GitHub. Es kann auch verwendet werden, um Daten von APIs zu kratzen. Es hat auch ein paar interessante integrierte Unterstützung, wie das Versenden von E-Mails.

#3. Selen

Selenium ist nicht hauptsächlich eine Web-Scraping-Bibliothek. Stattdessen handelt es sich um ein Browser-Automatisierungspaket. Aber wir können seine Funktionalitäten zum Scrapen von Webseiten leicht erweitern. Es verwendet das WebDriver-Protokoll zur Steuerung verschiedener Browser. Selen ist seit fast 20 Jahren auf dem Markt. Aber mit Selenium können Sie Daten von Webseiten einfach automatisieren und entfernen.

Herausforderungen mit Python Web Scraping

Beim Versuch, Daten von Websites zu kratzen, kann man sich vielen Herausforderungen stellen. Es gibt Probleme wie langsame Netzwerke, Anti-Scraping-Tools, IP-basierte Blockierung, Captcha-Blockierung usw. Diese Probleme können beim Versuch, eine Website zu scrapen, massive Probleme verursachen.

Aber Sie können Herausforderungen effektiv umgehen, indem Sie einige Wege gehen. Beispielsweise wird in den meisten Fällen eine IP-Adresse von einer Website blockiert, wenn mehr als eine bestimmte Anzahl von Anfragen in einem bestimmten Zeitintervall gesendet werden. Um eine IP-Blockierung zu vermeiden, müssen Sie Ihren Scraper so codieren, dass er nach dem Senden von Anfragen abkühlt.

Entwickler neigen auch dazu, Honeypot-Fallen für Scraper einzusetzen. Diese Fallen sind normalerweise für das bloße menschliche Auge unsichtbar, können aber von einem Schaber durchkämmt werden. Wenn Sie eine Website scrapen, die eine solche Honeypot-Falle installiert, müssen Sie Ihren Scraper entsprechend codieren.

Captcha ist ein weiteres schwerwiegendes Problem mit Scrapern. Die meisten Websites verwenden heutzutage ein Captcha, um den Bot-Zugriff auf ihre Seiten zu schützen. In einem solchen Fall müssen Sie möglicherweise einen Captcha-Löser verwenden.

Scraping einer Website mit Python

Wie wir besprochen haben, werden wir BeautifulSoup verwenden, um eine Website zu verschrotten. In diesem Tutorial werden wir die historischen Daten von Ethereum von Coingecko kratzen und die Tabellendaten als JSON-Datei speichern. Kommen wir zum Bau des Schabers.

Der erste Schritt besteht darin, BeautifulSoup und Requests zu installieren. Für dieses Tutorial verwende ich Pipenv. Pipenv ist ein virtueller Umgebungsmanager für Python. Sie können auch Venv verwenden, wenn Sie möchten, aber ich bevorzuge Pipenv. Die Erörterung von Pipenv würde den Rahmen dieses Tutorials sprengen. Wenn Sie jedoch erfahren möchten, wie Pipenv verwendet werden kann, folgen Sie dieser Anleitung. Wenn Sie virtuelle Python-Umgebungen verstehen möchten, folgen Sie dieser Anleitung.

Starten Sie die Pipenv-Shell in Ihrem Projektverzeichnis, indem Sie den Befehl pipenv shell ausführen. Es startet eine Subshell in Ihrer virtuellen Umgebung. Führen Sie nun den folgenden Befehl aus, um BeautifulSoup zu installieren:

pipenv install beautifulsoup4

Führen Sie zum Installieren von Anforderungen den Befehl ähnlich dem obigen aus:

pipenv install requests

Importieren Sie nach Abschluss der Installation die erforderlichen Pakete in die 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 besteht darin, den Inhalt der historischen Datenseite abzurufen und ihn mit dem in BeautifulSoup verfügbaren HTML-Parser zu parsen.

r = requests.get('https://www.coingecko.com/en/coins/ethereum/historical_data#panel')

soup = BeautifulSoup(r.content, 'html.parser')

Im obigen Code wird auf die Seite mit der get-Methode zugegriffen, die in der Anforderungsbibliothek verfügbar ist. Der geparste Inhalt wird dann in einer Variablen namens Soup gespeichert.

Der ursprüngliche Scraping-Teil beginnt jetzt. Zunächst müssen Sie die Tabelle im DOM korrekt identifizieren. Wenn Sie diese Seite öffnen und sie mit den im Browser verfügbaren Entwicklertools untersuchen, sehen Sie, dass die Tabelle diese Klassen hat: table table-striped text-sm text-lg-normal.

Coingecko Ethereum Historische Datentabelle

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 zuerst 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 einer Variablen namens table_data gespeichert. Die Tabelle enthält einige Elemente für den Titel. Eine neue Variable namens table_headings wird initialisiert, um die Titel in einer Liste zu halten.

Dann wird eine for-Schleife für die erste Zeile der Tabelle ausgeführt. In dieser Zeile werden alle Elemente mit th gesucht und ihr Textwert wird zur Liste table_headings hinzugefügt. Der Text wird mit der Textmethode extrahiert. Wenn Sie jetzt die Variable table_headings drucken, können Sie die folgende Ausgabe sehen:

['Date', 'Market Cap', 'Volume', 'Open', 'Close']

Der nächste Schritt besteht darin, die restlichen Elemente zu kratzen, ein Wörterbuch für jede Zeile zu generieren und die Zeilen dann an eine Liste anzuhängen.

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 wesentliche Teil des Codes. Für jedes tr in der table_data-Variablen werden zuerst die th-Elemente gesucht. Die th Elemente sind die in der Tabelle angezeigten Daten. Diese th-Elemente werden in einer Variablen th gespeichert. Ebenso werden alle td-Elemente in der td-Variablen gespeichert.

Es werden leere Wörterbuchdaten initialisiert. Nach der Initialisierung durchlaufen wir 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‘, ”)}). Hier wird td elements text zuerst mit der text-Methode extrahiert und dann alle n mit der replace-Methode ersetzt. 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 Datenwörterbuchs dann null überschreitet, hängen wir das Wörterbuch an die Liste table_details an. Sie können die Liste table_details zur Überprüfung ausdrucken. Aber wir schreiben die Werte in eine JSON-Datei. Werfen wir einen Blick auf den Code dafür,

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. Sobald das Schreiben abgeschlossen ist, drucken wir die in der JSON-Datei gespeicherten Daten in die Konsole.

Führen Sie nun die Datei mit dem folgenden Befehl aus:

python run main.py

Nach einiger Zeit können Sie den Text Data saved to JSON file… in der Konsole sehen. Sie sehen auch eine neue Datei namens table.json im Arbeitsdateiverzeichnis. Die Datei sieht ähnlich aus wie die folgende JSON-Datei:

[
  {
    "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. Um den vollständigen Code anzuzeigen, können Sie dieses GitHub-Repo besuchen.

Fazit

In diesem Artikel wurde erläutert, wie Sie ein einfaches Python-Scrape implementieren können. Wir haben diskutiert, wie BeautifulSoup zum schnellen Scrapen von Daten von der Website verwendet werden könnte. Wir haben auch andere verfügbare Bibliotheken besprochen und warum Python für viele Entwickler die erste Wahl zum Scrapen von Websites ist.

Sie können sich auch diese Web-Scraping-Frameworks ansehen.