Lernen Sie, wie man einen Web Scraper in Python erstellt, der eine ganze Website durchsucht und alle wichtigen Daten durch Web Scraping extrahiert.
Beim Web Scraping geht es darum, Daten aus dem Web zu extrahieren. Ein Web Scraper ist ein Tool, das Web Scraping durchführt und im Allgemeinen durch ein Skript dargestellt wird. Python ist eine der einfachsten und zuverlässigsten Skriptsprachen auf dem Markt. Außerdem verfügt sie über eine Vielzahl von Web-Scraping-Bibliotheken. Das macht Python zur perfekten Programmiersprache für Web Scraping. Im Einzelnen erfordert Python Web Scraping nur wenige Zeilen Code.
In diesem Tutorial lernen Sie alles, was Sie für die Erstellung eines einfachen Python-Scrapers wissen müssen. Diese Anwendung durchsucht eine gesamte Website und extrahiert Daten von jeder Seite. Anschließend werden alle Daten, die wir mit Python gesammelt haben, in einer CSV-Datei gespeichert. In diesem Tutorial erfahren Sie, welche die besten Python-Bibliotheken für Data Scraping sind, welche Sie verwenden sollten und wie Sie sie einsetzen können. Folgen Sie diesem Tutorial Schritt für Schritt und lernen Sie, wie Sie ein Web Scraping-Python-Skript erstellen.
Inhaltsangabe:
- Voraussetzungen
- Die besten Python-Bibliotheken für Web Scraping.
- Erstellen eines Web Scrapers in Python
- Fazit
- FAQ
Voraussetzungen
Um einen Python-Web-Scraper zu erstellen, benötigen Sie die folgenden Voraussetzungen:
Wenn Sie Python noch nicht auf Ihrem Computer installiert haben, können Sie es über den ersten Link oben herunterladen. Wenn Sie ein Windows-Benutzer sind, achten Sie darauf, dass Sie bei der Installation von Python das Kontrollkästchen „Add python.exe to PATH“ (python.exe zu PATH hinzufügen) markieren (siehe unten):
Auf diese Weise erkennt Windows automatisch die Befehle python und pip im Terminal. Im Detail ist pip ein Paketmanager für Python-Pakete. Beachten Sie, dass pip standardmäßig in Python Version 3.4 oder höher enthalten ist. Sie müssen es also nicht manuell installieren.
Sie sind nun bereit, Ihren ersten Python Web Scraper zu erstellen. Aber zuerst brauchen Sie eine Python Web Scraping Bibliothek!
Die besten Python-Bibliotheken für Web Scraping.
Sie können ein Web-Scraping-Skript von Grund auf mit Python Vanilla erstellen, aber das ist nicht die ideale Lösung. Schließlich ist Python für seine große Auswahl an verfügbaren Bibliotheken bekannt. Im Einzelnen gibt es mehrere Web Scraping Bibliotheken, aus denen Sie wählen können. Werfen wir nun einen Blick auf die wichtigsten davon!
Requests
Mit der requests
-Bibliothek können Sie HTTP-Anfragen in Python ausführen. Im Vergleich zu den Standard-HTTP-Bibliotheken von Python erleichtert requests
das Senden von HTTP-Anfragen. requests
spielt eine Schlüsselrolle in einem Python Web Scraping Projekt. Denn um die in einer Webseite enthaltenen Daten zu scrapen, müssen Sie diese zunächst über einen HTTP-GET-Request abrufen. Außerdem müssen Sie möglicherweise weitere HTTP-Anfragen an den Server der Ziel-Website stellen.
Sie können requests
mit dem folgenden Pip-Befehl installieren:
pip install requests
Beautiful Soup
Die Python-Bibliothek Beautiful Soup erleichtert das Sammeln von Informationen aus Webseiten. Beautiful Soup funktioniert mit jedem HTML- oder XML-Parser und bietet alles, was Sie zum Iterieren, Suchen und Ändern des Parsebaums benötigen. Beachten Sie, dass Sie Beautiful Soup mit html.parser verwenden können, dem Parser, der in der Python-Standardbibliothek enthalten ist und mit dem Sie HTML-Textdateien parsen können. Im Einzelnen können Sie Beautiful Soup verwenden, um das DOM zu durchlaufen und die benötigten Daten daraus zu extrahieren.
Sie können Beautiful Soup mit der Pip wie folgt installieren:
pip install beautifulsoup4
Selenium
Selenium ist ein fortschrittliches, automatisiertes Open-Source-Testframework, mit dem Sie Operationen auf einer Webseite in einem Browser ausführen können. Mit anderen Worten: Sie können Selenium verwenden, um einen Browser anzuweisen, bestimmte Aufgaben auszuführen. Beachten Sie, dass Sie Selenium aufgrund seiner Headless-Browser-Fähigkeiten auch als Web-Scraping-Bibliothek verwenden können. Falls Sie mit diesem Konzept nicht vertraut sind: Ein Headless Browser ist ein Webbrowser, der ohne eine grafische Benutzeroberfläche (GUI – Graphical User Interface) läuft. Wenn Selenium im Headless-Modus konfiguriert ist, wird der Browser im Hintergrund ausgeführt.
So werden die in Selenium besuchten Webseiten in einem echten Browser gerendert, der in der Lage ist, JavaScript auszuführen. Folglich können Sie mit JavaScript Selenium Websites scrapen, die auf JavaScript angewiesen sind. Beachten Sie, dass Sie dies nicht mit Requests oder einem anderen HTTP-Client erreichen können. Der Grund dafür ist, dass Sie einen Browser benötigen, um JavaScript auszuführen, während Requests Ihnen lediglich ermöglicht, HTTP-Anfragen auszuführen.
Selenium stellt Ihnen alles zur Verfügung, was Sie brauchen, um einen Web Scraper ohne weitere Bibliotheken zu erstellen. Sie können es mit dem folgenden pip-Befehl installieren:
pip install selenium
Erstellen eines Web Scrapers in Python
Im Folgenden lernen Sie, wie man einen Web Scraper in Python erstellt. Das Ziel dieses Tutorials ist es, zu lernen, wie man alle Quotes von der Quotes to Scrape Website extrahiert. Für jeden Quote werden Sie lernen, wie Sie den Text, den Autor und die Liste der Tags auslesen können.
Werfen wir jedoch zunächst einen Blick auf die Ziel-Website. So sieht eine Webseite von Quotes to Scrape aus:
Wie Sie sehen können, ist Quotes to Scrape nichts anderes als eine Testumgebung für Web Scraping. Sie enthält insbesondere eine paginierte Liste von Quotes. Der Python-Web-Scraper, den Sie erstellen werden, wird alle auf jeder Seite enthaltenen Quotes abrufen und sie als CSV-Daten zurückgeben.
Nun ist es Zeit herauszufinden, welches die besten Python-Bibliotheken für Web Scraping sind, um das Ziel zu erreichen. Wie Sie auf der Registerkarte „Netzwerk“ des Chrome DevTools-Fensters unten sehen können, führt die Ziel-Website keine Fetch/XHR-Anfrage durch.
Mit anderen Worten: Quotes to Scrape verlässt sich nicht auf JavaScript, um auf Webseiten gerenderte Daten abzurufen. Dies ist eine übliche Situation für die meisten Server-gerenderten Webseiten. Da die Zielwebseite nicht auf JavaScript angewiesen ist, um die Seite zu rendern oder Daten abzurufen, brauchen Sie Selenium nicht, um sie zu scrapen. Sie können es trotzdem verwenden, aber es ist nicht erforderlich.
Wie Sie bereits gelernt haben, öffnet Selenium Webseiten in einem Browser. Da dies Zeit und Ressourcen benötigt, führt Selenium einen Leistungs-Overhead ein. Sie können dies vermeiden, indem Sie Beautiful Soup zusammen mit Requests verwenden. Im Folgenden lernen wir, wie man ein einfaches Python-Skript für Web Scraping erstellt, um mit Beautiful Soup Daten von einer Website abzurufen.
Erste Schritte
Bevor Sie mit dem Schreiben der ersten Codezeilen beginnen, müssen Sie Ihr Python Web Scraping Projekt einrichten. Technisch gesehen brauchen Sie nur eine einzige .py-Datei. Die Verwendung einer fortgeschrittenen IDE (Integrated Development Environment) erleichtert Ihnen jedoch das Programmieren. Hier erfahren Sie, wie Sie ein Python-Projekt in PyCharm 2022.2.3 einrichten, aber auch jede andere IDE ist geeignet.
Öffnen Sie zunächst PyCharm und wählen Sie „Datei > Neues Projekt…“. Im Popup-Fenster „Neues Projekt“ wählen Sie „Pure Python“ und initialisieren Ihr Projekt.
Sie können Ihr Projekt zum Beispiel python-web-scraper
nennen. Klicken Sie auf „Erstellen“. Sie haben nun Zugang zu Ihrem leeren Python-Projekt. Standardmäßig wird PyCharm eine Datei main.py
initialisieren. Der Übersichtlichkeit halber können Sie diese in scraper.py
umbenennen. So sieht Ihr Projekt dann aus:
Wie Sie sehen können, initialisiert PyCharm automatisch eine Python-Datei für Sie. Ignorieren Sie den Inhalt dieser Datei und löschen Sie alle Codezeilen. Auf diese Weise fangen Sie bei Null an.
Anschließend installieren Sie die Abhängigkeiten des Projekts. Sie können Requests und Beautiful Soup installieren, indem Sie den folgenden Befehl im Terminal aufrufen:
pip install requests beautifulsoup4
Mit diesem Befehl werden beide Bibliotheken auf einmal installiert. Warten Sie, bis der Installationsprozess abgeschlossen ist. Jetzt können Sie Beautiful Soup und Requests verwenden, um Ihren Web-Crawler und -Scraper in Python zu erstellen. Stellen Sie sicher, dass Sie die beiden Bibliotheken importieren, indem Sie die folgenden Zeilen am Anfang Ihrer scraper.py-Skriptdatei hinzufügen:
import requests
from bs4 import BeautifulSoup
PyCharm zeigt diese beiden Zeilen in grau an, da die Bibliotheken im Code nicht verwendet werden. Wenn sie rot unterstrichen sind, bedeutet dies, dass bei der Installation etwas schief gelaufen ist. Versuchen Sie sie in diesem Fall erneut zu installieren.
So sollte Ihre scraper.py
-Datei jetzt aussehen. Sie können nun mit der Definition der Web-Scraping-Logik beginnen.
Verbinden mit der Ziel-URL zum Scrapen
Das erste, was in einem Web Scraper zu tun ist, ist eine Verbindung zu Ihrer Ziel-Webseite herzustellen. Rufen Sie zunächst die vollständige URL der Seite von Ihrem Webbrowser ab. Stellen Sie sicher, dass Sie auch den http://
oder http://
kopieren. HTTP-Protokollabschnitt. In diesem Fall handelt es sich um die gesamte URL der Ziel-Webseite:
https://quotes.toscrape.com
Mit der folgenden Codezeile können Sie nun Requests zum Herunterladen einer Webseite verwenden:
page = requests.get('https://quotes.toscrape.com')
Diese Zeile weist das Ergebnis einfach der Methode request.get()
der variablen Seite zu. Im Hintergrund führt request.get()
eine GET-Anforderung unter Verwendung der als Parameter übergebenen URL aus. Anschließend wird ein Response
-Objekt zurückgegeben, das die Serverantwort auf die HTTP-Anfrage enthält.
Wenn die HTTP-Anfrage erfolgreich ausgeführt wurde, enthält page.page.status_code
den Wert 200. Dies liegt daran, dass der HTTP-Statuscode 200 OK anzeigt, aus dem hervorgeht, dass die HTTP-Anfrage erfolgreich ausgeführt wurde. Ein 4xx
oder 5xx
HTTP-Statuscode bedeutet einen Fehler. Dies kann aus verschiedenen Gründen geschehen, aber bedenken Sie, dass die meisten Webseiten Requests blockieren, die keinen gültigen User-Agent
-Header enthalten. Der User-Agent-Header ist eine Zeichenfolge, die die Anwendung und die Version des Betriebssystems angibt, von der eine Anfrage stammt. Erfahren Sie mehr über User-Agents
für Web Scraping.
Sie können einen gültigen User-Agent
-Header in requests
wie folgt festlegen:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
page = requests.get('https://quotes.toscrape.com', headers=headers)
requests
wird nun die HTTP-Anfrage mit den als Parameter übergebenen Headern ausführen.
Worauf Sie achten sollten, ist die Eigenschaft page.text
. Diese enthält das vom Server zurückgegebene HTML-Dokument im String-Format. Geben Sie die text
-Eigenschaft an Beautiful Soup weiter, um Daten aus der Web-Seite zu extrahieren. Hier erfahren Sie, wie das geht.
Extrahieren von Daten mit dem Python Web Scraper
Zum Extrahieren von Daten aus einer Webseite müssen Sie zunächst die HTML-Elemente identifizieren, die die Daten enthalten, an denen Sie interessiert sind. Insbesondere müssen Sie die CSS-Selektoren finden, die erforderlich sind, um diese Elemente aus dem DOM zu extrahieren. Dies können Sie mit den Entwicklungswerkzeugen Ihres Browsers erreichen. Klicken Sie in Chrome mit der rechten Maustaste auf das gewünschte HTML-Element und wählen Sie Untersuchen.
Das HTML-Element quote <div>
wird durch die Klasse quote identifiziert, wie Sie hier sehen können. Dieses enthält:
- Den Text des Quotes in einem HTML-Element
<span>
- Den Verfasser des Quotes in einem HTML-Element
<small>
- Eine Liste von Tags in einem
<div>
-Element, die jeweils in einem<a>
-HTML-Element enthalten sind
Im Einzelnen können Sie diese Daten mit den folgenden CSS-Selektoren in .quote
extrahieren:
.text
.author
.tags .tag
Im Folgenden lernen Sie, wie Sie dies mit Beautiful Soup in Python erreichen können. Zunächst übergeben wir das HTML-Dokument page.text
an den BeautifulSoup()
Constructor:
soup = BeautifulSoup(page.text, 'html.parser')
Der zweite Parameter gibt den Parser an, den Beautiful Soup zum Parsen des HTML-Dokuments verwenden wird. Die soup
-Variable enthält nun ein BeautifulSoup
-Objekt. Dies ist ein Parsebaum, der durch das Parsen des in page.text
enthaltenen HTML-Dokuments mit dem in Python eingebauten html.parser
erzeugt wurde.
Initialisieren Sie nun eine Variable, die die Liste aller ausgewerteten Daten enthält.
quotes = []
Sie können nun soup
verwenden, um Elemente aus dem DOM wie folgt zu extrahieren:
quote_elements = soup.find_all('div', class_='quote')
Die Methode find_all()
gibt die Liste aller <div>
-HTML-Elemente aus, die durch die Klasse quote gekennzeichnet sind. Mit anderen Worten: Diese Codezeile entspricht der Anwendung des CSS-Selektors .quote
, um die Liste der HTML-Elemente für Quotes auf der Seite abzurufen. Sie können dann über die Liste der quotes
iterieren, um die Kursdaten wie unten beschrieben abzurufen:
for quote_element in quote_elements:
# extracting the text of the quote
text = quote_element.find('span', class_='text').text
# extracting the author of the quote
author = quote_element.find('small', class_='author').text
# extracting the tag <a> HTML elements related to the quote
tag_elements = quote_element.find('div', class_='tags').find_all('a', class_='tag')
# storing the list of tag strings in a list
tags = []
for tag_element in tag_elements:
tags.append(tag_element.text)
Dank der Beautiful Soup Methode find()
können Sie das einzelne HTML-Element von Interesse extrahieren. Da es sich bei den mit dem Quote verbundenen Tags um mehrere handelt, sollten Sie sie in einer Liste speichern.
Dann können Sie diese Daten in ein Wörterbuch umwandeln und wie folgt an die quotes
-Liste anhängen:
quotes.append(
{
'text': text,
'author': author,
'tags': ', '.join(tags) # merging the tags into a "A, B, ..., Z" string
}
)
Durch die Speicherung der extrahierten Daten in einem solchen Wörterbuchformat werden Ihre Daten leichter zugänglich und verständlich.
Sie haben gerade gelernt, wie Sie alle Kursdaten aus einer einzigen Seite extrahieren können. Denken Sie aber daran, dass die Ziel-Webseite aus mehreren Webseiten besteht. Im Folgenden erfahren Sie, wie Sie die gesamte Webseite crawlen können.
Implementierung der Crawling-Logik
Am unteren Ende der Startseite finden Sie ein <a>
-HTML-Element „Next →“, das auf die nächste Seite der Ziel-Webseite weiterleitet. Dieses HTML-Element ist auf allen Seiten enthalten, außer auf der letzten. Ein solches Szenario ist bei jeder paginierten Webseite üblich.
Wenn Sie dem Link im <a>
-HTML-Element „Next →“ folgen, können Sie problemlos durch die gesamte Webseite navigieren. Beginnen wir also mit der Startseite und sehen wir uns an, wie man die einzelnen Seiten der Ziel-Webseite durchgeht. Sie müssen nur nach dem HTML-Element .next
<li>
suchen und den relativen Link zur nächsten Seite extrahieren.
Sie können die Crawling-Logik wie folgt implementieren:
# the url of the home page of the target website
base_url = 'https://quotes.toscrape.com'
# retrieving the page and initializing soup...
# getting the "Next →" HTML element
next_li_element = soup.find('li', class_='next')
# if there is a next page to scrape
while next_li_element is not None:
next_page_relative_url = next_li_element.find('a', href=True)['href']
# getting the new page
page = requests.get(base_url + next_page_relative_url, headers=headers)
# parsing the new page
soup = BeautifulSoup(page.text, 'html.parser')
# scraping logic...
# looking for the "Next →" HTML element in the new page
next_li_element = soup.find('li', class_='next')
Dieser „Wo-Zyklus“ durchläuft jede Seite, bis es keine nächste Seite mehr gibt. Insbesondere extrahiert er die relative URL der nächsten Seite und verwendet sie, um die URL der nächsten zu crawlenden Seite zu erstellen. Dann wird die nächste Seite heruntergeladen. Anschließend wird sie gecrawlt und die Logik wiederholt.
Sie haben gerade gelernt, wie man eine Crawling-Logik implementiert, um eine ganze Webseite zu scrapen. Anschließend können Sie die extrahierten Daten in ein nützlicheres Format umwandeln.
Konvertierung der Daten in das CSV-Format
Sehen wir uns an, wie man die Liste der Wörterbücher, die die gecrawlten Quote-Daten enthalten, in eine CSV-Datei umwandelt. Das erreichen Sie mit den folgenden Zeilen:
import csv
# scraping logic...
# reading the "quotes.csv" file and creating it
# if not present
csv_file = open('quotes.csv', 'w', encoding='utf-8', newline='')
# initializing the writer object to insert data
# in the CSV file
writer = csv.writer(csv_file)
# writing the header of the CSV file
writer.writerow(['Text', 'Author', 'Tags'])
# writing each row of the CSV
for quote in quotes:
writer.writerow(quote.values())
# terminating the operation and releasing the resources
csv_file.close()
Dieses Snippet schreibt die in der Liste der Wörterbücher enthaltenen Quotes-Daten in eine quotes.csv
-Datei. Beachten Sie, dass csv
Teil der Python-Standardbibliothek ist. Sie können es also importieren und verwenden, ohne eine zusätzliche Abhängigkeit zu installieren. Das heißt konkret, dass Sie einfach eine Datei mit open()
erstellen müssen. Dann können Sie es mit der Funktion writerow()
aus dem Writer
-Objekt der csv
-Bibliothek ausfüllen. Dadurch wird jedes Quote-Wörterbuch als CSV-formatierte Zeile in die CSV-Datei geschrieben.
Sie sind von Rohdaten einer Webseite zu strukturierten Daten in einer CSV-Datei übergegangen. Der Prozess der Datenextraktion ist abgeschlossen, und Sie können nun einen Blick auf den gesamten Python Web Scraper werfen.
Alles zusammenfügen
So sieht das komplette Python-Skript zum Web Scraping aus:
import requests
from bs4 import BeautifulSoup
import csv
def scrape_page(soup, quotes):
# retrieving all the quote <div> HTML element on the page
quote_elements = soup.find_all('div', class_='quote')
# iterating over the list of quote elements
# to extract the data of interest and store it
# in quotes
for quote_element in quote_elements:
# extracting the text of the quote
text = quote_element.find('span', class_='text').text
# extracting the author of the quote
author = quote_element.find('small', class_='author').text
# extracting the tag <a> HTML elements related to the quote
tag_elements = quote_element.find('div', class_='tags').find_all('a', class_='tag')
# storing the list of tag strings in a list
tags = []
for tag_element in tag_elements:
tags.append(tag_element.text)
# appending a dictionary containing the quote data
# in a new format in the quote list
quotes.append(
{
'text': text,
'author': author,
'tags': ', '.join(tags) # merging the tags into a "A, B, ..., Z" string
}
)
# the url of the home page of the target website
base_url = 'https://quotes.toscrape.com'
# defining the User-Agent header to use in the GET request below
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
# retrieving the target web page
page = requests.get(base_url, headers=headers)
# parsing the target web page with Beautiful Soup
soup = BeautifulSoup(page.text, 'html.parser')
# initializing the variable that will contain
# the list of all quote data
quotes = []
# scraping the home page
scrape_page(soup, quotes)
# getting the "Next →" HTML element
next_li_element = soup.find('li', class_='next')
# if there is a next page to scrape
while next_li_element is not None:
next_page_relative_url = next_li_element.find('a', href=True)['href']
# getting the new page
page = requests.get(base_url + next_page_relative_url, headers=headers)
# parsing the new page
soup = BeautifulSoup(page.text, 'html.parser')
# scraping the new page
scrape_page(soup, quotes)
# looking for the "Next →" HTML element in the new page
next_li_element = soup.find('li', class_='next')
# reading the "quotes.csv" file and creating it
# if not present
csv_file = open('quotes.csv', 'w', encoding='utf-8', newline='')
# initializing the writer object to insert data
# in the CSV file
writer = csv.writer(csv_file)
# writing the header of the CSV file
writer.writerow(['Text', 'Author', 'Tags'])
# writing each row of the CSV
for quote in quotes:
writer.writerow(quote.values())
# terminating the operation and releasing the resources
csv_file.close()
Wie Sie hier gelernt haben, können Sie in weniger als 100 Zeilen Code einen Web Scraper erstellen. Dieses Python-Skript ist in der Lage, eine ganze Webseite zu crawlen, automatisch alle Daten zu extrahieren und sie in eine CSV-Datei zu konvertieren.
Herzlichen Glückwunsch! Sie haben gerade gelernt, wie man mit den Bibliotheken Requests und Beautiful Soup einen Python Web Scraper erstellt!
Ausführen des Web Scraping Python-Skripts
Wenn Sie ein PyCharm-Benutzer sind, führen Sie das Skript aus, indem Sie auf die Schaltfläche unten klicken:
Andernfalls starten Sie den folgenden Python-Befehl im Terminal innerhalb des Projektverzeichnisses:
python scraper.py
Warten Sie, bis der Prozess beendet ist. Sie haben nun Zugriff auf eine quotes.csv
-Datei. Öffnen Sie die Datei. Sie sollte die folgenden Daten enthalten:
Et voilà! Sie haben nun alle 100 Quotes, die in der Ziel-Webseite enthalten sind, in einer CSV-Datei!
Fazit
In diesem Tutorial haben Sie gelernt, was Web Scraping ist, was Sie für den Einstieg in Python brauchen und welches die besten Python-Bibliotheken für Web Scraping sind. Dann haben Sie gesehen, wie man Beautiful Soup und Requests verwendet, um eine Web-Scraping-Anwendung anhand eines realen Beispiels zu erstellen. Wie Sie wissen, sind für Web Scraping in Python nur ein paar Zeilen Code erforderlich.
Web Scraping ist jedoch mit einigen Herausforderungen verbunden. Insbesondere Anti-Bot- und Anti-Scraping-Technologien werden immer beliebter. Aus diesem Grund benötigen Sie ein fortschrittliches und umfassendes automatisiertes Web-Scraping-Tool, das von Bright Data bereitgestellt wird.
Um zu vermeiden, dass Sie blockiert werden, empfehlen wir Ihnen, einen Proxy aus den verschiedenen von Bright Data angebotenen Proxy-Services auszuwählen, der auf Ihren Anwendungsfall zugeschnitten ist.