Schritt-für-Schritt-Anleitung zum Web-Scraping mit Python für Anfänger

Bemerkungen: 0

Python ist aufgrund seiner robusten Bibliotheken und einfachen Syntax die erste Wahl für Web Scraping. In diesem Python-Tutorial zum Web-Scraping erkunden wir die Grundlagen der Datenextraktion und führen Sie durch die Einrichtung Ihrer Python-Umgebung, um Ihren ersten Web-Scraper zu erstellen. Wir stellen Ihnen die wichtigsten Bibliotheken vor, die sich für Scraping-Aufgaben eignen, darunter Beautiful Soup, Playwright und lxml.

Welche Bibliotheken Sie verwenden sollten

Es gibt eine Reihe von Python-Bibliotheken, die den Prozess vereinfachen. Im Folgenden sind einige der beliebtesten aufgeführt:

  • requests: eine einfache und elegante HTTP-Bibliothek für Python, mit der HTTP-Anfragen zum Abrufen von Webseiten gesendet werden können.
  • BeautifulSoup: eignet sich hervorragend zum Parsen von Seiteninhalten. Es erstellt Parse-Bäume aus dem Seitenquellcode, die das Extrahieren von Daten erleichtern.
  • lxml: lxml ist für seine Geschwindigkeit und Effizienz bekannt und eignet sich hervorragend zum Parsen strukturierter Daten.
  • Playwright: ein robustes Tool für dynamisches Scraping von Inhalten und Interaktion mit Webseiten.

Wenn Sie sich fragen, wie Sie eine Website mit Python scrapen können, müssen Sie zunächst verstehen, wie HTTP-Anfragen funktionieren.

Einführung in HTTP-Anfragen

HTTP (HyperText Transfer Protocol) ist ein Protokoll der Anwendungsschicht für die Übertragung von Daten im Internet. Sie geben eine URL in den Browser ein, der daraufhin eine HTTP-Anfrage erzeugt und sie an den Webserver sendet. Der Server sendet die Antwort an den Browser zurück, der sie als Webseite wiedergibt. Für Web Scraping müssen Sie diesen Prozess nachahmen und HTTP-Anfragen von Ihrem Skript aus generieren, um den Inhalt von Webseiten programmatisch abzurufen.

Einrichten Ihrer Umgebung

Stellen Sie zunächst sicher, dass Sie Python auf Ihrem System installiert haben. Sie können es von der offiziellen Website von Python herunterladen.

Eine virtuelle Umgebung hilft bei der Verwaltung von Abhängigkeiten. Verwenden Sie diese Befehle, um eine virtuelle Umgebung zu erstellen und zu aktivieren:


python -m venv scraping_env
source scraping_env/bin/activate

Installieren Sie anschließend die erforderlichen Pakete mit den folgenden Befehlen:


pip install requests
pip install beautifulsoup4 
pip install lxml

Web Scraper mit Beautiful Soup bauen

Beginnen wir mit einem einfachen Beispiel für die Verwendung von Python zum Scrapen einer Website unter Verwendung der requests-Bibliothek, um statische Inhalte zu extrahieren.

HTTP-GET-Anfrage stellen

Die gängigste Form der HTTP-Anfrage ist die GET-Anfrage, mit der Daten von einer bestimmten URL abgerufen werden. Hier ist ein einfaches Python-Beispiel für Web-Scraping, das zeigt, wie eine GET-Anfrage an http://example.com durchgeführt wird.


import requests
url = 'http://example.com'
response = requests.get(url)

Umgang mit HTTP-Antworten

Die Anfragebibliothek bietet mehrere Möglichkeiten, die Antwort zu verarbeiten:

Statuscode prüfen: Sicherstellen, dass die Anfrage erfolgreich war.


if response.status_code == 200:
    print('Request was successful!')
else:
    print('Request failed with status code:', response.status_code)

Extrahieren von Inhalten: Extrahieren des Text- oder JSON-Inhalts aus der Antwort.


# Inhalt der Antwort als Text abrufen
page_content = response.text
print(page_content)

# Antwortinhalt als JSON abrufen (wenn die Antwort im JSON-Format vorliegt)
json_content = response.json()
print(json_content)

Behandlung von HTTP- und Netzwerkfehlern

HTTP- und Netzwerkfehler können auftreten, wenn eine Ressource nicht erreichbar ist, eine Anfrage eine Zeitüberschreitung aufweist oder der Server einen HTTP-Fehlerstatus zurückgibt (z. B. 404 Not Found, 500 Internal Server Error). Wir können die von Anfragen ausgelösten Ausnahmeobjekte verwenden, um diese Situationen zu behandeln.


import requests

url = 'http://example.com'

try:
    response = requests.get(url, timeout=10)  # Set a timeout for the request
    response.raise_for_status()  # Raises an HTTPError for bad responses
except requests.exceptions.HTTPError as http_err:
    print(f'HTTP error occurred: {http_err}')
except requests.exceptions.ConnectionError:
    print('Failed to connect to the server.')
except requests.exceptions.Timeout:
    print('The request timed out.')
except requests.exceptions.RequestException as req_err:
    print(f'Request error: {req_err}')
else:
    print('Request was successful!')

Extrahieren von Daten aus HTML-Elementen

Um strukturierte Daten zu extrahieren, helfen Bibliotheken wie Beautiful Soup und lxml dabei, bestimmte Teile der Seite zu identifizieren und zu parsen.

Webseiten bestehen aus verschachtelten Elementen, die durch Tags dargestellt werden, wie <div>, <p>, <a>, usw. dargestellt werden. Jedes Tag kann Attribute haben und Text, andere Tags oder beides enthalten.

XPath- und CSS-Selektoren bieten eine Möglichkeit, Elemente anhand ihrer Attribute oder ihrer Position im Dokument auszuwählen.

Suche nach XPath- und CSS-Selektoren

Beim Scraping müssen zum Extrahieren bestimmter Daten oft die richtigen XPath- oder CSS-Selektoren ermittelt werden. Hier erfahren Sie, wie Sie diese effizient finden:

Die meisten modernen Webbrowser verfügen über integrierte Entwicklerwerkzeuge, mit denen Sie die HTML-Struktur von Webseiten untersuchen können. Im Folgenden finden Sie eine schrittweise Anleitung zur Verwendung dieser Tools:

  1. Offene Entwicklerwerkzeuge:
    • In Chrome: Klicken Sie mit der rechten Maustaste auf die Seite und wählen Sie "Prüfen" oder drücken Sie Strg+Umschalt+I (Windows/Linux) bzw. Cmd+Opt+I (Mac).
    • In Firefox: Klicken Sie mit der rechten Maustaste auf die Seite und wählen Sie "Element inspizieren" oder drücken Sie
    • Strg+Umschalt+I (Windows/Linux) oder Cmd+Opt+I (Mac).
  2. Überprüfen Sie das Element:
    • Klicken Sie mit dem Inspektionswerkzeug (Cursorsymbol) auf das Element, das Sie entfernen möchten. Es wird dann in der Strukturansicht hervorgehoben.
  3. XPath- oder CSS-Selektor kopieren:
    • Klicken Sie mit der rechten Maustaste auf das markierte Element im Entwicklerbereich. Wählen Sie "XPath kopieren" oder "Selektor kopieren".

1n.png

XPath: /html/body/div/h1

CSS-Selektor: body > div > h1

Extraktion mit Beautiful Soup

Beautiful Soup ist eine Python-Bibliothek zum Parsen von Seiteninhalten. Sie bietet Methoden und Attribute zum Navigieren und Suchen in der Seitenstruktur.


from bs4 import BeautifulSoup
import requests

# URL der zu durchsuchenden Webseite
url = 'https://example.com'

# Senden Sie eine HTTP-GET-Anfrage an die URL
response = requests.get(url)

# Analysieren Sie den HTML-Inhalt der Antwort mit Beautiful Soup
soup = BeautifulSoup(response.content, 'html.parser')

# Verwenden Sie den CSS-Selektor, um alle <h1> Tags zu finden, die sich innerhalb von <div> Tags befinden
# die direkte Kinder des Tags <body> sind
h1_tags = soup.select('body > div > h1')

# Iterieren Sie über die Liste der gefundenen <h1> Tags und drucken Sie deren Textinhalt
for tag in h1_tags:
    print(tag.text)

Behandlung von Parsing-Fehlern

Wie Beautiful Soup erlaubt auch lxml das Abfangen und die elegante Behandlung von Problemen mit Hilfe von Ausnahmen wie lxml.etree.XMLSyntaxError.

Der bereitgestellte "Python Web Scraping Code" führt eine Datenextraktion auf einer Amazon-Produktseite mit Playwright und lxml durch. Er richtet einen Proxy ein und startet einen Browser, navigiert zur Produktseite, interagiert mit Elementen, wartet, bis die Seite vollständig geladen ist, und erfasst die Seitenquelle.

Dieser Inhalt wird mit lxml geparst, um einen Elementbaum zu erstellen, und XPath wird verwendet, um den Produkttitel zu extrahieren. Das Skript behandelt Fälle, in denen das Element nicht gefunden wird oder das Parsen fehlschlägt. Nach dem Scraping wird die Browser-Sitzung ordnungsgemäß geschlossen.


from bs4 import BeautifulSoup
import requests

# URL der zu durchsuchenden Webseite
url = 'https://example.com'

# Senden Sie eine HTTP-GET-Anfrage an die URL
response = requests.get(url)

try:
    # Analysieren Sie den HTML-Inhalt der Antwort mit Beautiful Soup
    soup = BeautifulSoup(response.content, 'html.parser')

    # Verwenden Sie den CSS-Selektor, um alle <h1> Tags zu finden, die sich innerhalb von <div> Tags befinden.
    # die direkte Kinder des <body> Tags sind
    h1_tags = soup.select('body > div > h1')

    # Iterieren Sie über die Liste der gefundenen <h1> Tags und drucken Sie deren Textinhalt
    for tag in h1_tags:
        print(tag.text)
except AttributeError as attr_err:
    # Behandlung von Fällen, in denen ein AttributeError auftreten könnte (z. B. wenn der response.content keiner ist)
    print(f'Attribute error occurred: {attr_err}')
except Exception as parse_err:
    # Behandlung sonstiger Ausnahmen, die während des Parsings auftreten können
    print(f'Error while parsing HTML: {parse_err}')

Extraktion mit lxml

Eine weitere beliebte Bibliothek zum Parsen von Inhalten ist lxml. BeautifulSoup ist zwar benutzerfreundlich, aber lxml ist schneller und flexibler und daher ideal für leistungsrelevante Aufgaben.


from lxml.html import fromstring
import requests

# URL der zu durchsuchenden Webseite
url = 'https://example.com'

# Senden Sie eine HTTP-GET-Anfrage an die URL
response = requests.get(url)

# Parsen des HTML-Inhalts der Antwort mit der fromstring-Methode von lxml
parser = fromstring(response.text)

# Verwenden Sie XPath, um den Textinhalt des ersten <h1> Tags zu finden
# das sich innerhalb eines <div> Tags befindet, der ein direktes Kind des <body> Tags ist
title = parser.xpath('/html/body/div/h1/text()')[0]

# Den Titel drucken
print(title)

Behandlung von Parsing-Fehlern

Ähnlich wie Beautiful Soup erlaubt lxml eine elegante Behandlung von Parsing-Fehlern, indem Ausnahmen wie lxml.etree.XMLSyntaxError abgefangen werden.


from lxml.html import fromstring
from lxml import etree
import requests

# URL der zu durchsuchenden Webseite
url = 'https://example.com'

# Senden Sie eine HTTP-GET-Anfrage an die URL
response = requests.get(url)

try:
    # Parsen des HTML-Inhalts der Antwort mit der fromstring-Methode von lxml
    parser = fromstring(response.text)

    # Verwenden Sie XPath, um den Textinhalt des ersten <h1> Tags zu finden
    # der sich innerhalb eines <div> Tags befindet, der ein direktes Kind des <body> Tags ist
    title = parser.xpath('/html/body/div/h1/text()')[0]

    # Den Titel drucken
    print(title)
except IndexError:
    # Behandlung des Falles, dass die XPath-Abfrage keine Ergebnisse liefert
    print('No <h1> tag found in the specified location.')
except etree.XMLSyntaxError as parse_err:
    # Behandlung von XML-Syntaxfehlern beim Parsen
    print(f'Error while parsing HTML: {parse_err}')
except Exception as e:
    # Behandeln Sie alle anderen Ausnahmen
    print(f'An unexpected error occurred: {e}')

Speichern der extrahierten Daten

Sobald Sie erfolgreich Daten extrahiert haben, besteht der nächste Schritt darin, diese Daten zu speichern. Python bietet mehrere Optionen zum Speichern von gescrapten Daten, darunter das Speichern in CSV-Dateien, JSON-Dateien und Datenbanken. Hier finden Sie einen Überblick darüber, wie Sie extrahierte Daten in verschiedenen Formaten speichern können:

Speichern von Daten in einer CSV-Datei

CSV (Comma-Separated Values) ist ein einfaches und weit verbreitetes Format zum Speichern von tabellarischen Daten. Das CSV-Modul in Python macht es einfach, Daten in CSV-Dateien zu schreiben.


import csv

# Beispielhafte Daten
data = {
    'title': 'Example Title',
    'paragraphs': ['Paragraph 1', 'Paragraph 2', 'Paragraph 3']
}

# Daten in einer CSV-Datei speichern
with open('scraped_data.csv', mode='w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(['Title', 'Paragraph'])
    for paragraph in data['paragraphs']:
        writer.writerow([data['title'], paragraph])

print('Data saved to scraped_data.csv')

Speichern von Daten in einer JSON-Datei

JSON (JavaScript Object Notation) ist ein leichtgewichtiges Format für den Datenaustausch, das einfach zu lesen und zu schreiben ist. Das JSON-Modul in Python bietet Methoden zum Speichern von Daten im JSON-Format.


import json

# Beispielhafte Daten
data = {
    'title': 'Example Title',
    'paragraphs': ['Paragraph 1', 'Paragraph 2', 'Paragraph 3']
}

# Daten in einer JSON-Datei speichern
with open('scraped_data.json', mode='w', encoding='utf-8') as file:
    json.dump(data, file, ensure_ascii=False, indent=4)

print('Data saved to scraped_data.json')

Fortgeschrittene Web-Scraping-Techniken mit Playwright in Python

Playwright ist ein leistungsfähiges Tool für das Scraping dynamischer Inhalte und die Interaktion mit Webelementen. Es kann JavaScript-lastige Websites verarbeiten, was statische HTML-Parser nicht können.

Installieren Sie Playwright und richten Sie es ein:


pip install playwright
playwright install

Scraping dynamischer Inhalte

Mit Playwright können Sie mit Web-Elementen interagieren, z. B. Formulare ausfüllen und auf Schaltflächen klicken. Es kann auf die Fertigstellung von AJAX-Anfragen warten, bevor es fortfährt, was es ideal für das Scraping dynamischer Inhalte macht.

2n.png

Der bereitgestellte Python-Web-Scraping-Code führt eine Datenextraktion auf einer Amazon-Produktseite mit Playwright und lxml durch. Zu Beginn werden die erforderlichen Module importiert. Eine Lauffunktion wird definiert, um die Scraping-Logik zu kapseln. Die Funktion beginnt mit dem Einrichten eines Proxy-Servers und dem Starten einer neuen Browser-Instanz mit dem Proxy und im Non-Headless-Modus, damit wir die Browser-Aktionen beobachten können. Im Browserkontext wird eine neue Seite geöffnet und zur angegebenen Amazon-Produkt-URL navigiert, wobei eine Zeitüberschreitung von 60 Sekunden vorgesehen ist, um sicherzustellen, dass die Seite vollständig geladen wird.

Das Skript interagiert dann mit der Seite, um einen bestimmten Produktstil aus einem Dropdown-Menü und eine Produktoption mit Hilfe von Locators und Textabgleich auszuwählen. Sobald diese Interaktionen abgeschlossen sind und die Seite vollständig geladen ist, wird der Seiteninhalt erfasst.

Dieser Inhalt wird dann mit der fromstring-Methode in lxml geparst, um einen Elementbaum zu erstellen. Eine XPath-Abfrage wird verwendet, um den Textinhalt des Produkttitels aus einem bestimmten Element mit der ID productTitle zu extrahieren. Das Skript ist so konzipiert, dass es mit Situationen umgehen kann, in denen die XPath-Abfrage keine Ergebnisse liefert, in denen beim Parsen Probleme mit der XML-Syntax auftreten oder in denen etwas anderes unerwartet schief läuft. Am Ende wird der mit lxml extrahierte Produkttitel gedruckt, und sowohl der Browser-Kontext als auch der Browser selbst werden ordnungsgemäß geschlossen, um die Sitzung zu beenden

Die Ausführungsfunktion wird innerhalb einer Playwright-Sitzung ausgeführt, die von sync_playwright gestartet wird, um sicherzustellen, dass der gesamte Prozess in einer kontrollierten Umgebung verwaltet und ausgeführt wird. Diese Struktur gewährleistet Robustheit und Fehlertoleranz bei der Durchführung der Web-Scraping-Aufgabe.


from playwright.sync_api import Playwright, sync_playwright
from lxml.html import fromstring, etree


def run(playwright: Playwright) -> None:
   # Definieren Sie den Proxyserver
   proxy = {"server": "https://IP:PORT", "username": "LOGIN", "password": "PASSWORD"}

   # Eine neue Browserinstanz mit dem angegebenen Proxy und im nicht-kopflosen Modus starten
   browser = playwright.chromium.launch(
       headless=False,
       proxy=proxy,
       slow_mo=50,
       args=['--ignore-certificate-errors'],
   )

   # Erstellen Sie einen neuen Browser-Kontext
   context = browser.new_context(ignore_https_errors=True)

   # Eine neue Seite im Browser-Kontext öffnen
   page = context.new_page()

   # Navigieren Sie zu der angegebenen Amazon-Produktseite
   page.goto(
       "https://www.amazon.com/A315-24P-R7VH-Display-Quad-Core-Processor-Graphics/dp/B0BS4BP8FB/",
       timeout=10000,
   )

   # Warten, bis die Seite vollständig geladen ist
   page.wait_for_load_state("load")

   # Wählen Sie einen bestimmten Produktstil aus dem Dropdown-Menü
   page.locator("#dropdown_selected_style_name").click()

   # Wählen Sie eine bestimmte Produktoption
   page.click('//*[@id="native_dropdown_selected_style_name_1"]')
   page.wait_for_load_state("load")

   # Abrufen des HTML-Inhalts der geladenen Seite
   html_content = page.content()

   try:
       # Parsen des HTML-Inhalts mit der fromstring-Methode von lxml
       parser = fromstring(html_content)

       # XPath verwenden, um den Textinhalt des Produkttitels zu extrahieren
       product_title = parser.xpath('//span[@id="productTitle"]/text()')[0].strip()

       # Drucken des extrahierten Produkttitels
       print({"Product Title": product_title})
   except IndexError:
       # Behandlung des Falles, dass die XPath-Abfrage keine Ergebnisse liefert
       print('Product title not found in the specified location.')
   except etree.XMLSyntaxError as parse_err:
       # Behandlung von XML-Syntaxfehlern beim Parsen
       print(f'Error while parsing HTML: {parse_err}')
   except Exception as e:
       # Behandeln Sie alle anderen Ausnahmen
       print(f'An unexpected error occurred: {e}')

   # Schließen Sie den Browser-Kontext und den Browser
   context.close()
   browser.close()


# Verwenden Sie sync_playwright, um die Playwright-Sitzung zu starten und das Skript auszuführen
with sync_playwright() as playwright:
   run(playwright)

Web-Scraping mit Python ist eine leistungsstarke Methode zum Sammeln von Daten aus Websites. Die besprochenen Tools erleichtern die Extraktion, Verarbeitung und Speicherung von Webdaten für verschiedene Zwecke. Dabei sind die Verwendung von Proxy-Servern zum Wechseln von IP-Adressen und die Implementierung von Verzögerungen zwischen den Anfragen entscheidend für die Umgehung von Sperren. Beautiful Soup ist benutzerfreundlich für Anfänger, während lxml dank seiner Effizienz für die Verarbeitung großer Datenmengen geeignet ist. Für fortgeschrittenere Scraping-Anforderungen, insbesondere bei dynamisch geladenen JavaScript-Websites, erweist sich Playwright als äußerst effektiv.

Schlussfolgerung

Dieses Python-Tutorial zum Web-Scraping beschreibt praktische Methoden zur automatisierten Datenextraktion mit Bibliotheken wie Beautiful Soup, lxml und Playwright. Technisch gesehen bezeichnet Web Scraping Python die Verwendung von Python-basierten Tools zum systematischen Abrufen und Verarbeiten strukturierter Daten von Websites.

Egal, ob Sie mit statischen Inhalten oder mit JavaScript-gerenderten Seiten arbeiten, es gibt ein Python-Tool für diese Aufgabe. Wenn Sie HTTP-Anfragen lernen, das Parsing beherrschen und die Datenextraktion verstehen, sind Sie bereit, zuverlässige Scraper zu erstellen.

Denken Sie bei Ihren Fortschritten daran, ethische Scraping-Praktiken zu befolgen - respektieren Sie robots.txt, vermeiden Sie die Überlastung von Servern und gehen Sie stets verantwortungsvoll mit Daten um. Mit einer soliden Grundlage können Sie nun selbstbewusst mit der Entwicklung Ihrer eigenen Scraping-Projekte beginnen und das volle Potenzial von Webdaten ausschöpfen.

Bemerkungen:

0 Bemerkungen