Anleitung zur Verwendung von cURL mit Python

Bemerkungen: 0

Beim Web Scraping werden Daten von Websites für Aufgaben wie Datenanalyse, Forschung und Automatisierung extrahiert. Python bietet zwar Bibliotheken zum Senden von HTTPS-Anfragen und zur Durchführung von Scraping, aber die Verwendung von cURL über PycURL kann effizienter sein. In diesem Tutorial zeigen wir, wie man Python cURL zum Scrapen von Webseiten verwendet. Wir zeigen Beispiele und vergleichen die Leistung mit anderen beliebten Bibliotheken wie Requests, HTTPX und AIOHTTP.

Erste Schritte mit cURL und Python

Bevor Sie sich mit der Python-Integration beschäftigen, sollten Sie die Grundlagen von cURL kennen. Sie können cURL-Befehle direkt im Terminal verwenden, um Aufgaben wie GET- und POST-Anfragen auszuführen.

Beispiel für cURL-Befehle:

# GET-Anfrage
curl -X GET "https://httpbin.org/get"

# POST-Anfrage
curl -X POST "https://httpbin.org/post"

1.png

2.png

Installation der erforderlichen Bibliotheken

Um cURL in Python zu verwenden, benötigen wir die pycurl-Bibliothek, die eine Python-Schnittstelle zur cURL-Bibliothek bietet.

Installation von PycURL:

pip install pycurl

HTTP-Anfragen mit PycURL stellen

PycURL bietet detaillierte Kontrolle über HTTP-Anfragen in Python. Im Folgenden wird anhand eines Beispiels gezeigt, wie man eine GET-Anfrage mit PycURL stellt:

import pycurl
import certifi
from io import BytesIO

# Erstellen eines BytesIO-Objekts zur Aufnahme der Antwortdaten
buffer = BytesIO()

# Initialisieren eines cURL-Objekts
c = pycurl.Curl()

# Legen Sie die URL für die HTTP-GET-Anfrage fest
c.setopt(c.URL, 'https://httpbin.org/get')

# Einstellen des Puffers zur Erfassung der Ausgabedaten
c.setopt(c.WRITEDATA, buffer)

# Legen Sie den Pfad zur CA-Bundle-Datei für die SSL/TLS-Verifizierung fest
c.setopt(c.CAINFO, certifi.where())

# Ausführen der HTTP-Anfrage
c.perform()

# Schließen Sie das cURL-Objekt, um Ressourcen freizugeben
c.close()

# Abrufen des Inhalts der Antwort aus dem Puffer
body = buffer.getvalue()

# Dekodieren und Drucken des Antwortkörpers
print(body.decode('iso-8859-1'))

Behandlung von POST-Anfragen

Das Senden von Daten mit POST-Anfragen ist üblich. Mit PycURL verwenden Sie die Option POSTFIELDS. Hier ist ein Beispiel für eine POST-Anfrage mit PycURL:

import pycurl
import certifi
from io import BytesIO

# Erstellen eines BytesIO-Objekts zur Aufnahme der Antwortdaten
buffer = BytesIO()

# Initialisieren eines cURL-Objekts
c = pycurl.Curl()

# Legen Sie die URL für die HTTP-POST-Anforderung fest
c.setopt(c.URL, 'https://httpbin.org/post')

# Einstellen der zu verbuchenden Daten
post_data = 'param1="pycurl"¶m2=article'
c.setopt(c.POSTFIELDS, post_data)

# Einstellen des Puffers zur Erfassung der Ausgabedaten
c.setopt(c.WRITEDATA, buffer)

# Legen Sie den Pfad zur CA-Bundle-Datei für die SSL/TLS-Verifizierung fest
c.setopt(c.CAINFO, certifi.where())

# Ausführen der HTTP-Anfrage
c.perform()

# Schließen Sie das cURL-Objekt, um Ressourcen freizugeben
c.close()

# Abrufen des Inhalts der Antwort aus dem Puffer
body = buffer.getvalue()

# Dekodieren und Drucken des Antwortkörpers
print(body.decode('iso-8859-1'))

Behandlung benutzerdefinierter HTTP-Header

Benutzerdefinierte Header oder Authentifizierung sind bei HTTP-Anfragen oft erforderlich. Nachfolgend ein Beispiel für das Setzen von benutzerdefinierten Headern mit PycURL:

import pycurl
import certifi
from io import BytesIO

# Erstellen eines BytesIO-Objekts zur Aufnahme der Antwortdaten
buffer = BytesIO()

# Initialisieren eines cURL-Objekts
c = pycurl.Curl()

# Legen Sie die URL für die HTTP-GET-Anfrage fest
c.setopt(c.URL, 'https://httpbin.org/get')

# Benutzerdefinierte HTTP-Header festlegen
c.setopt(c.HTTPHEADER, ['User-Agent: MyApp', 'Accept: application/json'])

# Einstellen des Puffers zur Erfassung der Ausgabedaten
c.setopt(c.WRITEDATA, buffer)

# Legen Sie den Pfad zur CA-Bundle-Datei für die SSL/TLS-Verifizierung fest
c.setopt(c.CAINFO, certifi.where())

# Ausführen der HTTP-Anfrage
c.perform()

# Schließen Sie das cURL-Objekt, um Ressourcen freizugeben
c.close()

# Abrufen des Inhalts der Antwort aus dem Puffer
body = buffer.getvalue()

# Dekodieren und Drucken des Antwortkörpers
print(body.decode('iso-8859-1'))

Verarbeitung von XML-Antworten

Das Parsen und Verarbeiten von XML-Antworten ist bei der Arbeit mit APIs entscheidend. Im Folgenden finden Sie ein Beispiel für die Verarbeitung von XML-Antworten mit PycURL:

# Notwendige Bibliotheken importieren
import pycurl  # Bibliothek zur Erstellung von HTTP-Anfragen
import certifi  # Bibliothek zur Überprüfung von SSL-Zertifikaten
from io import BytesIO  # Bibliothek zur Behandlung von Byte-Streams
import xml.etree.ElementTree as ET  # Bibliothek zum Parsen von XML

# Erstellen eines Puffers zur Aufnahme der Antwortdaten
buffer = BytesIO()

# Initialisieren eines cURL-Objekts
c = pycurl.Curl()

# Legen Sie die URL für die HTTP-GET-Anfrage fest
c.setopt(c.URL, 'https://www.google.com/sitemap.xml')

# Einstellen des Puffers zur Erfassung der Ausgabedaten
c.setopt(c.WRITEDATA, buffer)

# Legen Sie den Pfad zur CA-Bundle-Datei für die SSL/TLS-Verifizierung fest
c.setopt(c.CAINFO, certifi.where())

# Ausführen der HTTP-Anfrage
c.perform()

# Schließen Sie das cURL-Objekt, um Ressourcen freizugeben
c.close()

# Abrufen des Inhalts der Antwort aus dem Puffer
body = buffer.getvalue()

# Parsen des XML-Inhalts in ein ElementTree-Objekt
root = ET.fromstring(body.decode('utf-8'))

# Tag und Attribute des Wurzelelements des XML-Baums ausgeben
print(root.tag, root.attrib)

Handhabung von HTTP-Fehlern

Eine robuste Fehlerbehandlung ist für zuverlässige HTTP-Anfragen unerlässlich. Nachfolgend ein Beispiel für die Fehlerbehandlung mit PycURL:

import pycurl  # Importieren Sie die pycurl-Bibliothek
import certifi  # Importieren Sie die Zertifizierungsbibliothek
from io import BytesIO  # Importieren von BytesIO für die Verarbeitung von Byte-Streams

# Ein Curl-Objekt initialisieren
c = pycurl.Curl()

buffer = BytesIO()
# Legen Sie die URL für die HTTP-Anfrage fest
c.setopt(c.URL, 'http://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # Ausführen der HTTP-Anfrage
    c.perform()
except pycurl.error as e:
    # Wenn während der Anfrage ein Fehler auftritt, fangen Sie die pycurl.error-Ausnahme ab
    errno, errstr = e.args  # Retrieve the error number and error message
    print(f'Error: {errstr} (errno {errno})')  # Print the error message and error number
finally:
    # Schließen Sie das Curl-Objekt, um Ressourcen freizugeben
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # Decode and print the response body

3.png

Der korrigierte Code passt die URL an https://example.com an, wodurch das Protokollproblem behoben wird. Er wiederholt den Prozess der Konfiguration der Anfrage, ihrer Ausführung und der Fehlerbehandlung wie im ersten Ausschnitt. Nach erfolgreicher Ausführung wird der Antwortkörper erneut dekodiert und gedruckt. Diese Schnipsel zeigen, wie wichtig eine korrekte URL-Konfiguration und eine robuste Fehlerbehandlung bei HTTP-Anfragen mit pycurl sind.

import pycurl  # Importieren Sie die pycurl-Bibliothek
import certifi  # Importieren Sie die Zertifizierungsbibliothek
from io import BytesIO  # Importieren von BytesIO für die Verarbeitung von Byte-Streams

# Reinitialisieren Sie das Curl-Objekt
c = pycurl.Curl()

buffer = BytesIO()
# Correct the URL to use HTTPS
c.setopt(c.URL, 'https://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # Ausführen der korrigierten HTTP-Anfrage
    c.perform()
except pycurl.error as e:
    # Wenn während der Anfrage ein Fehler auftritt, fangen Sie die pycurl.error-Ausnahme ab
    errno, errstr = e.args  # Abrufen der Fehlernummer und der Fehlermeldung
    print(f'Error: {errstr} (errno {errno})')  # Druckt die Fehlermeldung und die Fehlernummer
finally:
    # Schließen Sie das Curl-Objekt, um Ressourcen freizugeben
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # Dekodieren und Drucken des Antwortkörpers

Erweiterte cURL-Funktionen

cURL bietet viele erweiterte Optionen, um das Verhalten von HTTP-Anfragen zu steuern, wie z.B. die Behandlung von Cookies und Timeouts. Nachfolgend ein Beispiel, das die erweiterten Optionen mit PycURL demonstriert.

import pycurl  # Importieren Sie die pycurl-Bibliothek
import certifi  # Importieren Sie die certifi-Bibliothek für die SSL-Zertifikatsprüfung
from io import BytesIO  # Importieren von BytesIO für die Verarbeitung von Byte-Streams

# Erstellen eines Puffers zur Aufnahme der Antwortdaten
buffer = BytesIO()

# Ein Curl-Objekt initialisieren
c = pycurl.Curl()

# Legen Sie die URL für die HTTP-Anfrage fest
c.setopt(c.URL, 'http://httpbin.org/cookies')

# Aktivieren Sie Cookies, indem Sie ein bestimmtes Schlüssel-Wert-Paar festlegen
c.setopt(c.COOKIE, 'cookies_key=cookie_value')

# Setzen Sie eine Zeitüberschreitung von 30 Sekunden für die Anfrage
c.setopt(c.TIMEOUT, 30)

# Einstellen des Puffers zur Erfassung der Ausgabedaten
c.setopt(c.WRITEDATA, buffer)

# Legen Sie den Pfad zur CA-Bundle-Datei für die SSL/TLS-Verifizierung fest
c.setopt(c.CAINFO, certifi.where())

# Ausführen der HTTP-Anfrage
c.perform()

# Schließen Sie das Curl-Objekt, um Ressourcen freizugeben
c.close()

# Abrufen des Inhalts der Antwort aus dem Puffer
body = buffer.getvalue()

# Den Antwortkörper mit UTF-8-Kodierung kodieren und ausgeben
print(body.decode('utf-8'))

Vergleich von PycURL, Requests, HTTPX und AIOHTTP

Bei der Arbeit mit HTTP-Anfragen in Python gibt es vier beliebte Bibliotheken: PycURL, Requests, HTTPX und AIOHTTP. Jede hat ihre Stärken und Schwächen. Hier ein Vergleich, der Ihnen helfen soll, das richtige Tool für Ihre Bedürfnisse zu wählen:

Merkmal PycURL Requests HTTPX AIOHTTP
Benutzerfreundlichkeit Mäßig Sehr leicht Einfach Mäßig
Leistung Hoch Mäßig Hoch Hoch
Asynchrone Unterstützung Nein Nein Ja Ja
Streaming Ja Begrenzt Ja Ja
Unterstützung des Protokolls Umfangreich (unterstützt viele Protokolle) HTTP/HTTPS HTTP/HTTPS, HTTP/2, WebSockets HTTP/HTTPS, WebSockets

Die vergleichende Analyse zeigt, dass PycURL eine hohe Leistung und Flexibilität bietet und damit für fortgeschrittene Benutzer geeignet ist, die eine detaillierte Verwaltung von HTTP-Anfragen benötigen. Andererseits sind Requests und HTTPX besser für einfachere, intuitivere Szenarien geeignet. AIOHTTP zeichnet sich durch die Handhabung asynchroner Aufgaben aus und bietet effektive Werkzeuge für die Verwaltung asynchroner Anfragen.

Die Wahl der richtigen Bibliothek hängt von den spezifischen Bedürfnissen und Anforderungen Ihres Projekts ab, wobei PycURL eine ausgezeichnete Wahl für diejenigen ist, die Geschwindigkeit und fortgeschrittene Fähigkeiten benötigen.

Bemerkungen:

0 Bemerkungen