Die 3 besten Python-HTTP-Clients für Web Scraping
Mihnea-Octavian Manolache am 02. Dezember 2022
Wenn es um Web-Scraping geht, ist Python aufgrund der Vielzahl der verfügbaren Python-HTTP-Clients eine der beliebtesten Wahlmöglichkeiten. Aber was genau sind diese HTTP-Clients und wie kann man sie verwenden, um einen Web Scraper zu erstellen? Nun, im heutigen Artikel werden wir genau dieses Thema besprechen. Am Ende dieses Artikels sollten Sie ein solides Verständnis haben über:
- Was ist ein HTTP-Client im Allgemeinen?
- Was sind die besten Python-HTTP-Clients im Jahr 2022
- Warum Python eine gute Wahl für Web Scraping ist
- Wie man einen Web Scraper mit HTTP-Clients erstellt
Was sind Python-HTTP-Clients und wie benutzt man sie?
Um ein tieferes Verständnis dafür zu bekommen, wie das Internet kommuniziert, sollte man sich mit dem Hypertext Transfer Protocol (HTTP) vertraut machen. Unser heutiges Hauptaugenmerk liegt jedoch auf den HTTP-Clients von Python. Ich gehe also davon aus, dass Sie bereits mit HTTP vertraut sind.
Im Allgemeinen bezieht sich ein HTTP-Client auf eine Instanz oder ein Programm, das die Kommunikation mit einem Server ermöglicht. Ein Webbrowser kann zum Beispiel als HTTP-Client betrachtet werden. Als Programmierer verwenden wir jedoch nur selten einen echten Browser, wenn wir eine Anwendung erstellen, es sei denn, wir arbeiten an einem Web Scraper oder betreiben Forschung.
Wenn wir uns auf HTTP-Clients in einer programmatischen Weise beziehen, meinen wir in der Regel eine Methode oder eine Instanz einer Klasse, die zur Ausführung von HTTP-Anfragen verwendet wird. Da Python zweifellos eine der beliebtesten Programmiersprachen ist (und auch meine persönliche Lieblingssprache), werden wir heute die besten Python-HTTP-Clients besprechen und auch, wie man sie in einem echten Projekt implementiert.
Verstehen des HTTP-Protokolls
Bevor ich fortfahre, auch wenn ich empfehle, die HTTP-Dokumentation zu lesen, möchte ich kurz einige grundlegende HTTP-Konzepte erläutern. Zunächst einmal ist HTTP vielleicht eines der am häufigsten verwendeten Internetprotokolle. Wir verwenden es jeden Tag, um Informationen zwischen Clients und Servern auszutauschen.
Um dies zu ermöglichen, verwendet HTTP Anforderungsmethoden. Diese Methoden geben die Aktion an, die ein Client auf einem Server durchführen möchte. Wenn Sie z. B. Informationen von einem Server abrufen möchten, verwenden Sie GET. Wenn Sie etwas an den Server senden möchten, würden Sie POST sagen. Im Folgenden finden Sie eine Liste der gängigsten HTTP-Anforderungsmethoden:
- GET - Abrufen von Daten vom Server
- HEAD - nur den Header abrufen, ohne den Body (die eigentlichen Daten)
- POST - Senden Sie einige Informationen an den Server
- PUT - Informationen an den Server senden und alle aktuellen Darstellungen der Ressource ersetzen
- PATCH - Informationen an den Server senden und die Ressource teilweise verändern
- DELETE - Löscht die Ressource vom Server
Warum Python für HTTP-Anfragen
Zunächst einmal hat Python eine großartige Syntax und eine noch größere Gemeinschaft. Daher ist es perfekt zum Lernen geeignet. Ich selbst habe mich, als ich mit dem Programmieren begann, für Python entschieden. Tatsächlich gehörten die HTTP-Clients von Python zu den ersten Technologien, mit denen ich in Berührung kam. Aber das ist ein anderes Thema.
Mit dem heutigen Artikel möchte ich sicherstellen, dass Sie nicht nur ein grundlegendes theoretisches Verständnis, sondern auch einen Überblick über die praktische Umsetzung erhalten.
Und Python eignet sich aus einer Reihe von Gründen hervorragend für beides. Um nur ein paar zu nennen:
- Syntax - Python zu schreiben ist ähnlich wie Englisch zu schreiben. Das Lesen eines Python-Skripts hilft Ihnen, theoretische Konzepte mit ihrer tatsächlichen Umsetzung zu verbinden.
- Unterstützung - Python hat eine sehr große Community. Wenn Sie nicht weiterkommen, reicht meist eine einfache Frage auf StackOverflow, um die Antwort auf Ihr Problem zu finden.
- Verfügbarkeit - Die Paketbibliothek von Python ist eine der umfangreichsten. Beispielsweise gibt es allein für Python-HTTP-Clients mehr als ein Dutzend Pakete. Aber wir werden uns heute auf die beliebtesten konzentrieren.
3(+1) Beste Python-HTTP-Clients
Wenn es darum geht, Pakete zu kategorisieren, um eine Top 3 der besten Python-HTTP-Clients zu erstellen, ist es meiner Meinung nach sowohl eine Frage der Funktionalität als auch der persönlichen Vorlieben. Daher ist es richtig zu sagen, dass die folgende Liste meine Top 3 der HTTP-Client-Bibliotheken für Python darstellt und keine allgemeine Rangliste ist.
1. Anfragen - Leistungsstarke Einfachheit
Requests ist wahrscheinlich einer der beliebtesten HTTP-Clients in der Python-Gemeinde. Ich mache da keine Ausnahme. Wann immer ich einen neuen Web Scraper teste, verwende ich Python mit Requests. Es ist so einfach, wie .get zu sagen und so leistungsfähig wie ein echter Webbrowser.
Die Anfragebibliothek bietet unter anderem:
- SSL-Verifizierung
- Proxy-Unterstützung für HTTPS
- Persistenz von Cookies und Sitzungen
- Funktion "Am Leben erhalten
- Benutzerdefinierte Authentifizierung
Und das sind nur ein paar davon. Die vollständige Liste der Funktionen können Sie hier einsehen. Jetzt möchte ich Ihnen zeigen, wie Sie mit Anfragen arbeiten können:
import requests
r = requests.get("http://google.com")
print(r.test)
Wie Sie sehen können, hilft uns die requests-Bibliothek mit nur 3 Zeilen Code, die HTML-Zeile von einem Server zu sammeln. Im obigen Beispiel stellen wir eine GET-Anfrage an den Server und geben das Ergebnis aus. Aber wie ich schon sagte, ist diese Bibliothek viel vielfältiger. Lassen Sie uns ein komplexeres Beispiel erstellen, das Funktionen wie Proxies und POST-Anfragen verwendet:
import requests
def get_params(object):
params = ''
for key,value in object.items():
if list(object).index(key) < len(object) - 1:
params += f"{key}={value}."
else:
params += f"{key}={value}"
return params
API_KEY = '<YOUR_API_KEY>'
TARGET_URL = 'https://httpbin.org/post'
DATA = {"foo":"bar"}
PARAMETERS = {
"proxy_type":"datacenter",
"device":"desktop"
}
PROXY = {
"http": f"http://webscrapingapi.{ get_params(PARAMETERS) }:{ API_KEY }@proxy.webscrapingapi.com:80",
"https": f"https://webscrapingapi.{ get_params(PARAMETERS) }:{ API_KEY }@proxy.webscrapingapi.com:8000"
}
response = requests.post(
url=TARGET_URL,
data=DATA,
proxies=PROXY,
verify=False
)
print(response.text)
Schauen wir uns an, was wir hier tun:
- Wir definieren die Funktion "get_params", die ein Objekt annimmt und es als URL-Parameter-String zurückgibt.
- Wir definieren unsere Variablen:
undefinedundefinedundefinedundefinedundefined - Wir verwenden die Methode "post" von Requests, um eine HTTP-Post-Anfrage zu senden.
- Wir drucken den Antwortkörper aus
2. HTTPX - Anfragen neu erfunden
HTTPX ist relativ neu in der Szene. In kürzester Zeit wurde es jedoch zu einem der meist empfohlenen Python-HTTP-Clients. Zum Beispiel empfiehlt Flask (eines der größten Web-Frameworks für Python) in seiner offiziellen Dokumentation die Verwendung von HTTPX.
Als ich sagte, HTTPX sei eine Neuerfindung von requests, meinte ich damit, dass die beiden Bibliotheken in ihrer Syntax sehr ähnlich sind. In der Tat strebt HTTPX eine vollständige Kompatibilität mit requests an. Es gibt nur ein paar kleine Designunterschiede zwischen den beiden, die hier hervorgehoben werden.
Hier sehen Sie, wie eine einfache POST-Anfrage in HTTPX aussieht:
import httpx
TARGET_URL = 'https://httpbin.org/post'
DATA = {"foo":"bar"}
r = httpx.post(
url=TARGET_URL,
data=DATA,
)
print(r.text)
Wie Sie sehen können, ist es hauptsächlich der Paketname, den wir im Vergleich zum Requests-Beispiel ändern. Und da sie sich so ähnlich sind, bleibt die Frage, warum HTTPX gegenüber Requests gewählt wird. Nun, ausnahmsweise ist HTTPX einer der wenigen Python-HTTP-Clients, der asynchrone Unterstützung bietet. Zusammenfassend lässt sich sagen, dass HTTPX eine gute Wahl ist, wenn Sie Ihren auf Requests basierenden Code refaktorisieren wollen.
3. urllib3 - Thread-Safe-Verbindungen
Python hat eine Reihe von "urllibs", was neue Programmierer in der Regel verwirrt. Der Hauptunterschied zwischen urllib, urllib2 und urllib3 liegt in den Funktionen der einzelnen Pakete. urllib war der ursprüngliche HTTP-Client von Python, der in der Standardbibliothek von Python 1.2 enthalten war. urllib2 war die verbesserte Version, die in Python 1.6 eingeführt wurde und die ursprüngliche urllib ersetzen sollte.
Bei urllib3 handelt es sich jedoch um einen Python-HTTP-Client eines Drittanbieters. Trotz seines Namens ist diese Bibliothek nicht mit den beiden "Vorgängern" verwandt. Außerdem gibt es in der Python-Gemeinschaft Gerüchte, dass nicht beabsichtigt ist, urllib3 in die Standardbibliothek aufzunehmen. Zumindest nicht in naher Zukunft.
Obwohl dieses Paket nicht offiziell mit der Python-Standardbibliothek verknüpft ist, wird es von vielen Entwicklern verwendet, da es eine Vielzahl von Möglichkeiten bietet:
- Sicherheit der Gewinde
- Client-seitige SSL/TLS-Verifizierung
- Proxy-Unterstützung für HTTP und SOCKS
- Vollständige Testabdeckung
Nachdem wir nun den theoretischen Teil behandelt haben, wollen wir uns ein Beispiel für die Umsetzung ansehen:
import urllib3,json
TARGET_URL = 'https://httpbin.org/post'
DATA = {"foo":"bar"}
http = urllib3.PoolManager()
encoded_data = json.dumps(DATA)
r = http.request('POST', TARGET_URL, body=encoded_data)
print(r.data.decode('utf-8'))
Lassen Sie uns die Unterschiede zwischen urllib3 und Requests diskutieren:
- `http` - eine Instanz der Methode `PoolManager`, die die Einzelheiten der Fadensicherheit und des Verbindungspoolings behandelt
- encoded_data" - ein konvertierter JSON-String, der die Nutzdaten enthält, die wir senden
- r" - die eigentliche POST-Anfrage, die wir mit Hilfe von urllib3 stellen. Hier verwenden wir die Methode `request` der Instanz `PoolManager`.
Und schließlich müssen wir die Daten, die wir von unserer Anfrage zurückerhalten, dekodieren. Wie Sie sehen können, gibt es ein paar Dinge, die wir anders machen als bei Requests.
Ehrenvolle Erwähnung: http.client - Traditioneller Python-HTTP-Client
http.client ist ebenfalls Teil der Standard-Python-Bibliothek. Traditionell wird sie von Programmierern nicht direkt verwendet. Zum Beispiel verwendet urllib es als Abhängigkeit, um HTTP- und HTTPS-Anfragen zu verarbeiten. Ich habe es in unsere Rangliste aufgenommen, weil ich denke, dass es für uns Programmierer gut ist, die "Knochen" der Pakete zu kennen, die wir verwenden.
Auch wenn Sie vielleicht nicht wirklich ein Projekt mit http.client erstellen, finden Sie hier ein Implementierungsbeispiel, das Ihnen sicher helfen wird, besser zu verstehen, wie Python-HTTP-Clients funktionieren:
import http.client
TARGET_URL = 'www.httpbin.org'
http = http.client.HTTPSConnection(TARGET_URL)
http.request("GET", "/get")
r = http.getresponse()
print(r.read().decode('utf-8'))
Die Instanz `HTTPSConnection` benötigt eine Reihe von Parametern, die Sie hier überprüfen können. In unserem Beispiel definieren wir nur die "Methode" und die "URL" (oder genauer gesagt den Endpunkt). Außerdem gibt http.client, ähnlich wie urllib3, eine kodierte Antwort zurück. Wir müssen sie also vor dem Drucken dekodieren.
Anwendungsfall: Aufbau eines Scrapers mit Requests
Da wir nun wissen, wie man HTTP-Clients verwendet, sollten wir uns ein kleines Projekt vornehmen. Es ist nicht nur hilfreich, um das Gelernte anzuwenden, sondern auch, um Ihr eigenes Programmierportfolio zu erweitern.
Da Python-HTTP-Clients üblicherweise zum Sammeln von Informationen von Servern verwendet werden, ist die häufigste Verwendung dieser Technologien die Erstellung eines Web-Scrapers. Wir werden uns also darauf konzentrieren, wie man einen Web Scraper mit HTTP-Clients in Python erstellt. Da ich einen persönlichen Favoriten habe - Requests - werde ich ihn für dieses Projekt verwenden. Sie können ihn jedoch als Ausgangspunkt verwenden und ihn sogar anpassen, um einige der anderen besprochenen Technologien zu verwenden. Fangen wir ohne weiteres mit dem Programmieren an:
1. Projekt einrichten
Beginnen wir mit der Erstellung eines neuen Verzeichnisses, in dem wir die Dateien für unseren Web Scraper speichern werden. Öffnen Sie nun ein neues Terminalfenster und gehen Sie mit "cd" in dieses Verzeichnis. Hier wollen wir eine neue virtuelle Umgebung einrichten. Wenn Sie mit einem UNIX-ähnlichen Betriebssystem arbeiten, können Sie dies tun:
~ " python3 -m venv env && source env/bin/activate
Erstellen Sie nun einfach eine neue Python-Datei, die unsere Logik enthält, und öffnen Sie sie in Ihrer gewünschten IDE. Wenn Sie das Terminal verwenden möchten, fügen Sie einfach den folgenden Befehl ein:
~ " touch scraper.py && code .
2. Installieren von Abhängigkeiten
Wir werden pip verwenden, um die Pakete zu installieren, die wir für dieses Projekt benötigen. Bis jetzt haben wir festgestellt, dass wir Requests verwenden werden, aber das ist nicht genug für einen Web Scraper. Zu einem Web Scraper gehört auch die Verarbeitung der Daten. Das bedeutet, dass wir das von den Servern gesammelte HTML parsen müssen. Glücklicherweise bietet die Python-Bibliothek eine große Auswahl an Paketen. Für dieses Projekt werden wir jedoch BeautifulSoup verwenden. Um die Pakete zu installieren, fügen Sie einfach den folgenden Befehl ein:
~ " python3 -m pip install requests bs4
3. Die Logik schreiben
Wir werden unseren Code in zwei Abschnitte aufteilen: einen für die Datenextraktion und einen für die Datenmanipulation. Der erste Teil wird durch das Paket Requests abgedeckt, der zweite Teil durch BeautifulSoup. Beginnen wir mit dem Teil der Datenextraktion, bevor wir uns an die Codierung machen:
import requests
def scrape( url = None ):
# wenn es keine URL gibt, ist es nicht nötig, Python-HTTP-Clients zu verwenden
# Wir werden eine Meldung ausgeben und die Ausführung stoppen
if url == None:
print('[!] Bitte fügen Sie ein Ziel hinzu!')
return
response = requests.get( url )
return response
In diesem Abschnitt definieren wir eine Funktion mit nur einem Parameter: die Ziel-URL. Wenn die URL nicht angegeben wird, geben wir eine Meldung aus und brechen die Ausführung ab. Andernfalls verwenden wir die get-Methode von Request, um die Antwort zurückzugeben. Wir wissen, dass die Python-HTTP-Clinetts mehr Methoden umfassen, also fügen wir einen bedingten Parameter hinzu:
import requests
def scrape( method = 'get', url = None, data = None ):
# wenn es keine URL gibt, ist es nicht nötig, Python-HTTP-Clients zu verwenden
# Wir werden eine Meldung ausgeben und die Ausführung stoppen
if url == None:
print('[!] Bitte ein Ziel hinzufügen!')
return
if method.lower() == 'get':
response = requests.get( url )
elif method.lower() == 'post':
if data == None:
print('[!] Please add a payload to your POST request!')
return
response = requests.post( url, data )
return response
Wie Sie sehen können, haben wir unserer Funktion einige weitere Parameter hinzugefügt. Der Parameter `method` gibt an, welche Methode für unsere Anfrage verwendet werden soll. Der Parameter "data" steht für die Nutzdaten, die wir mit der POST-Anfrage senden. Standardmäßig ist die Methode GET, daher ist der Parameter `method` nicht erforderlich.
Die Herausforderung: Fügen Sie weitere Methoden zu dieser Funktion hinzu und erweitern Sie die Möglichkeiten unseres Scrapers. Das macht nicht nur Spaß, sondern ist auch ein guter Lernansatz. Außerdem können Sie den Code zu Ihrem eigenen machen und ihn in Ihr Portfolio aufnehmen.
Bis jetzt haben wir die Datenextraktion behandelt. Lassen Sie uns das HTML analysieren und etwas damit machen:
from bs4 import BeautifulSoup
def extract_elements(data = None, el = None):
if data == None:
print('[!] Bitte fügen Sie einige Daten hinzu!')
return
if el == None:
print('[!] Bitte geben Sie an, welche Elemente Sie anvisieren!')
return
soup = BeautifulSoup(data.text, 'html.parser')
elements = soup.find_all(el)
return elements
Ein Web Scraper sollte jedoch in der Lage sein, spezifischere Daten zu extrahieren. Zum Beispiel sollte er in der Lage sein, Elemente auf der Grundlage ihres CSS-Selektors zu finden und zurückzugeben. Fügen wir also die Logik hinzu, die diesen Teil übernimmt:
from bs4 import BeautifulSoup
def extract_elements(data = None, el = None, attr = None, attr_value = None):
if data == None:
print('[!] Please add some data!')
return
if el == None:
print('[!] Please specify which elements you are targeting!')
return
soup = BeautifulSoup(data.text, 'html.parser')
elements = soup.find_all(el, { attr : attr_value })
return elements
BeautifulSoup ermöglicht es uns, bestimmte Daten auf der Grundlage ihrer Attribute zu extrahieren. Hier haben wir also zwei neue Parameter hinzugefügt, die uns helfen, Elemente anhand ihrer Attribute zu finden und zu extrahieren.
Wir haben jetzt alles, was wir brauchen. Alles, was noch zu tun ist, ist die beiden Abschnitte zu kombinieren und wir haben unseren Web Scraper. Sobald Sie Ihren Code zusammengesetzt haben, brauchen Sie nur noch:
- Erstellen Sie eine neue Variable, die die mit Requests extrahierten Daten enthalten wird
- Drucken der von BeautifulSoup zurückgegebenen Elemente
Hier sind die beiden fehlenden Teile Ihres Codes:
data = scrape('GET', 'https://webscrapingapi.com')
print( extract_elements(data, 'ul') )
Ich bin sicher, Sie haben bereits herausgefunden, was alles funktioniert, und eine Übersetzung ist an dieser Stelle nicht nötig. Genau wie bei unserem Scraper fordere ich Sie auf, mit der Funktion `extract_elements` herumzuspielen und dafür zu sorgen, dass sie mehr tut als nur Elemente zurückzugeben.
Schlussfolgerung
Wenn man ein neues Programmierkonzept erlernt, ist es meiner Meinung nach am besten, die verschiedenen verfügbaren Technologien auszuprobieren. Wenn es darum geht, die Infrastruktur für ein größeres Projekt aufzubauen, ist es jedoch besser, sich über die Stärken und Schwächen der einzelnen Technologien zu informieren, bevor man sich für eine entscheidet.
Ich hoffe, dass dieser Artikel Ihnen in jedem Fall geholfen hat und dass Sie nun ein solides Verständnis davon haben, wie die Python-HTTP-Clients funktionieren. Ich möchte Sie auch ermutigen, ein wenig herumzuspielen, denn ich bin sicher, Sie werden das richtige Paket für sich entdecken.
Nachrichten und Aktualisierungen
Bleiben Sie auf dem Laufenden mit den neuesten Web Scraping-Anleitungen und Nachrichten, indem Sie unseren Newsletter abonnieren.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Ähnliche Artikel

Entdecken Sie die Komplexität des Scrapens von Amazon-Produktdaten mit unserem ausführlichen Leitfaden. Von Best Practices und Tools wie der Amazon Scraper API bis hin zu rechtlichen Aspekten erfahren Sie, wie Sie Herausforderungen meistern, CAPTCHAs umgehen und effizient wertvolle Erkenntnisse gewinnen.


Lernen Sie, wie Sie mit Scrapy und Splash dynamische JavaScript-gerenderte Websites scrapen können. Von der Installation über das Schreiben eines Spiders bis hin zum Umgang mit Seitenumbrüchen und der Verwaltung von Splash-Antworten bietet dieser umfassende Leitfaden Schritt-für-Schritt-Anleitungen für Anfänger und Experten gleichermaßen.


Starten Sie mit WebScrapingAPI, der ultimativen Web-Scraping-Lösung! Sammeln Sie Echtzeitdaten, umgehen Sie Anti-Bot-Systeme und genießen Sie professionellen Support.
