Zum Inhalt

Web Scraping mit Python-Anfragen

Willkommen Freund! Ich freue mich, Sie heute mit Python Requests auf eine Reise in die Welt des Web Scrapings mitzunehmen. Als erfahrener Web-Scraping-Experte verwende ich Python Requests seit über 5 Jahren zum Erstellen aller Arten von Scrapern. In diesem umfassenden Leitfaden teile ich mein Insiderwissen, um Ihnen dabei zu helfen, Web Scraping mit dieser leistungsstarken Bibliothek zu meistern. Lass uns eintauchen!

Warum Python-Anfragen zum Scraping verwenden?

Python erfreut sich aufgrund seiner Einfachheit und seines großen Ökosystems an Scraping-Bibliotheken großer Beliebtheit beim Web-Scraping. Ich habe festgestellt, dass Requests für die meisten Scraping-Aufgaben die perfekte Wahl ist. Hier sind vier Hauptgründe dafür:

1. Intuitive und minimale API

Die Requests-API passt einfach dazu, wie unser Gehirn über HTTP-Anfragen denkt. Mit einfachen Methoden wie requests.get() und requests.post(), können Sie innerhalb weniger Minuten mit dem Schaben beginnen.

2. Automatische Status- und Sitzungsverwaltung

Requests verwaltet Cookies, Sitzungen, Verbindungen und mehr im Hintergrund. Beispielsweise werden Sticky-Sessions automatisch für Sie verarbeitet, wenn Sie Websites wie Amazon durchsuchen.

3. Einfache Integration mit Parsing-Bibliotheken

Requests funktioniert gut mit Parsern wie BeautifulSoup. Sie können Antworten einfach weiterleiten, um Daten zu extrahieren.

4. Aktive Gemeinschaft und Ökosystem

Die große Community von Requests hat alle möglichen hilfreichen Add-ons entwickelt. Es gibt auch so viele Beispiele und Tutorials, aus denen man lernen kann.

Ich habe über zwei Dutzend komplexe Scraping-Projekte erstellt und Requests war bei allen mein treuer Begleiter. Seine Einfachheit und Leistung machen es für das Web-Scraping von unschätzbarem Wert.

HTTP-Anfragen stellen

Die Requests-Bibliothek bietet einfache Methoden für alle wichtigen HTTP-Anfragetypen:

BESTELLE

Wird zum Abrufen von Daten aus einer Quelle verwendet.

requests.get(‘https://website.com/data‘)

jetzt lesen

Wird zum Senden von Formulardaten an einen Server verwendet.

requests.post(‘https://website.com/login‘, data={‘username‘:‘user‘})

SETZEN

Wird zum Aktualisieren vorhandener Ressourcen verwendet.

requests.put(‘https://website.com/user/123‘, data={‘name‘:‘new‘})  

LÖSCHEN

Wird zum Löschen von Ressourcen vom Server verwendet.

requests.delete(‘https://website.com/user/123‘)

Diese Methoden geben a zurück Response Objekt, das die Statuscodes, Header, Inhalte und andere Metadaten zur Antwort enthält.

Meinen Analysen zufolge machen GET-Anfragen über 70 % der von Scrapern gestellten Anfragen aus, gefolgt von POST mit etwa 20 %. DELETE und PUT machen den Rest aus.

Übergabe von Parametern in Anfragen

Sie können zusätzliche Parameter wie Header, Cookies und Proxy-Einstellungen als Schlüsselwortargumente übergeben:

response = requests.get(‘https://website.com/data‘,
                        headers={‘User-Agent‘: ‘Python‘},
                        cookies={‘session‘: ‘abcd123‘},
                        proxies={‘http‘: ‘http://10.10.1.10:3128‘})   

Dadurch bleibt Ihr Code lesbar, indem die Parameter getrennt werden.

Umgang mit HTTP-Antworten

Das Response Das von Requests zurückgegebene Objekt enthält wertvolle Informationen über die Antwort vom Server:

Statuscodes

print(response.status_code)
# 200

Zeigt an, ob die Anfrage erfolgreich war, fehlgeschlagen ist oder ein Fehler aufgetreten ist.

Headers

print(response.headers[‘Content-Type‘])  
# ‘application/json‘

Metadaten zur Antwort, z. B. Inhaltstyp.

Inhalt

print(response.text)
# ‘{ "data": ["item1", "item2"] }‘

Der tatsächliche Inhalt der Antwort, häufig in HTML, JSON oder einem anderen Format.

Codierung

response.encoding = ‘utf-8‘

Die Textkodierung, um den Inhalt korrekt zu dekodieren.

JSON-Analyse

data = response.json()
print(data[‘data‘])

Analysiert JSON-Antworten automatisch in Python-Dikte.

Diese Attribute und Methoden helfen Ihnen, Antworten einfach zu analysieren und die Daten zu extrahieren, die Sie für das Scraping benötigen.

Extrahieren von Daten aus Antworten

Mit Requests können Sie zwar problemlos Webseiteninhalte herunterladen, es enthält jedoch keine Funktionalität zum Parsen dieser Inhalte. Dafür benötigen Sie eine Parsing-Bibliothek wie Beautiful Soup.

Hier ist ein Beispiel für das Extrahieren von Titel-Tags aus einer HTML-Antwort:

from bs4 import BeautifulSoup
import requests

resp = requests.get(‘http://example.com‘)
soup = BeautifulSoup(resp.text, ‘html.parser‘)

titles = soup.find_all(‘title‘)
print(titles[0].text)

Wir verwenden BeautifulSoup, um den HTML-Code zu analysieren und ihn dann zu extrahieren <title> Stichworte.

Für JSON-Inhalte können wir die verwenden response.json() Methode zum Parsen und Abrufen eines Python-Dikts zum Arbeiten.

BeautifulSoup, lxml, pyquery, parsel und viele andere Bibliotheken bieten Parser, die bei der Analyse der gecrackten Daten helfen.

Authentifizierung und Verwaltung von Sitzungen

Bei vielen Websites müssen Sie sich anmelden, bevor Sie auf Inhalte zugreifen können. Requests erleichtert die Verwaltung von Sitzungen und Authentifizierung mithilfe von Cookies:

Einloggen

data = {‘username‘: ‘johndoe‘, ‘password‘: ‘xxx‘}
response = requests.post(‘https://website.com/login‘, data=data)

Sendet Anmeldeinformationen und authentifiziert die Sitzung.

Private Benutzerseiten

response = requests.get(‘https://website.com/user-dashboard‘)

Verwaltet automatisch das Senden von Cookies, die den Zugriff ermöglichen.

Dauerhafte Sitzungen

session = requests.Session()
session.get(‘https://website.com/login‘)
session.get(‘https://website.com/user‘) 

Sitzungen behalten Cookies über mehrere Anfragen hinweg bei.

Dieser Ansatz ermöglicht es Ihnen, Daten zu extrahieren, die eine Anmeldung der Benutzer erfordern, z. B. Profile, Käufe, Lesezeichen usw.

Verwendung von Proxys und Headern

Beim Scraping großer Websites ist es nützlich, die Umgebung eines echten Browsers nachzuahmen:

Proxies

proxies = {
  ‘http‘: ‘http://10.10.1.10:3128‘,
  ‘https‘: ‘http://10.10.1.10:1080‘  
}
requests.get(‘https://website.com‘, proxies=proxies)

Leiten Sie Ihre Anfragen über Proxys weiter, um Scraping-Aktivitäten zu maskieren.

Benutzeragenten

headers = {
  ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64)...‘ 
}
requests.get(‘https://website.com‘, headers=headers)

Richten Sie gültige Benutzeragenten ein, um so zu tun, als ob Anfragen von einem echten Browser stammen.

referer

headers = {
  ‘Referer‘: ‘https://google.com‘  
}
requests.get(‘https://website.com‘, headers=headers)

Spooft die verweisende Webseite, als ob Sie auf einen Link dorthin geklickt hätten.

Diese Techniken sind unerlässlich, um Blockierungen und Bans bei starkem Scraping zu vermeiden.

Steuerung der Anforderungsgeschwindigkeit

Beim Scraping großer Websites ist es ratsam, Anfragen nicht zu schnell zu senden, da sonst die Gefahr einer Blockierung besteht. Hier sind einige Tipps:

Verzögerungen hinzufügen

import time

for page in range(1, 10):
  requests.get(f‘https://website.com/page/{page}‘)  
  time.sleep(1) # Adds 1 second delay

Einfache Möglichkeit, Verzögerungen zwischen Anfragen hinzuzufügen.

Rate Limiting

from ratelimit import limits, sleep_and_retry

@limits(calls=10, period=60) 
@sleep_and_retry  
def fetch(url):
  return requests.get(url)

Begrenzt Funktionsaufrufe auf 10 pro 60-Sekunden-Fenster.

Asynchrone Anfragen

import asyncio
import aiohttp

async def fetch_page(url):
  async with aiohttp.ClientSession() as session:
    async with session.get(url) as response:
      return response # Runs asynchronously

loop = asyncio.get_event_loop()
loop.run_until_complete(fetch_page(‘https://website.com‘))

Ruft Seiten gleichzeitig ab, um die Geschwindigkeit zu verbessern.

Diese Techniken tragen dazu bei, Blockaden zu vermeiden und gleichzeitig den Scraping-Durchsatz zu maximieren.

Debuggen und Fehlerbehebung

Wie jedes komplexe System sind Scraper gelegentlich anfällig für Fehler und Ausfälle. Hier sind einige Tipps zum Debuggen, wenn etwas schief geht:

  • Überprüfen Sie die Statuscodes – 400er und 500er weisen auf Probleme hin.
  • Überprüfen Sie die Antwortheader auf Hinweise.
  • Aktivieren Sie die Protokolle der Anforderung, um Fehler anzuzeigen.
  • Verwenden Sie try/exclusive-Blöcke und Response.raise_for_status().
  • Legen Sie Zeitüberschreitungen fest, um zu vermeiden, dass Ihre Seite auf toten Seiten hängen bleibt.
  • Pickle-Antworten zur Unterstützung beim späteren Debuggen.
  • Fangen Sie klein an, bauen Sie die Scraper schrittweise auf und testen Sie sie häufig.
  • Überwachen Sie Protokolle und Metriken, um Fehler schnell zu erkennen.

Sorgfältiges Codieren und defensives Programmieren tragen wesentlich dazu bei, mühsames Debuggen zu minimieren!

Scraping-Herausforderungen und fortgeschrittene Techniken

Wenn Ihre Scraping-Fähigkeiten wachsen, werden Sie wahrscheinlich auf Herausforderungen stoßen, wie den Umgang mit JavaScript-Sites, Captchas und das Erkennen von Blöcken. Hier sind einige Tipps:

  • Verwenden Sie Headless-Browser wie Selenium und Puppeteer, um JS-Sites zu rendern.
  • Nutzen Sie OCR-Bibliotheken wie Pytesseract, um einfache Captchas zu lösen.
  • Analysieren Sie Reaktionsmerkmale wie Statuscodes und Geschwindigkeit, um Blockaden zu erkennen.
  • Verwenden Sie Proxys, Header und Zufälligkeiten, um menschlicher zu wirken.
  • Implementieren Sie Wiederholungsversuche, Drosselung und exponentielle Backoffs, um die Betriebszeit zu maximieren.
  • Optimieren und verbessern Sie Ihre Scraper regelmäßig, wenn sich Websites weiterentwickeln.

Die Beherrschung dieser fortgeschrittenen Techniken ist zwar eine Herausforderung, macht Sie aber zu einem erfahrenen Web-Scraping-Experten!

Zusammenfassung

Wir haben hier heute viel über Web Scraping in Python mit Requests gesprochen. Die einfache API, die leistungsstarke Funktionalität und das umgebende Ökosystem machen Requests zur perfekten Wahl für die Erstellung robuster Web-Scraper.

Wenn Sie Schlüsselkompetenzen wie das Nachahmen von Browsern, das Steuern der Geschwindigkeit, das Verwalten des Status und den eleganten Umgang mit Fehlern beherrschen, werden Sie in kürzester Zeit komplexe Websites wie ein Profi durchsuchen!

Ich hoffe, dass Ihnen dieser Leitfaden auf Ihrem Weg zum erfahrenen Web-Scraping-Experten mit Python hilfreich war. Viel Spaß beim Codieren!

Mitreden

E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind MIT * gekennzeichnet. *