Anleitung zur Verwendung von cURL mit Python

Bemerkungen: 0

Beim Web Scraping geht es darum, Daten von Websites für Analyse, Forschung oder Automatisierung zu extrahieren. In diesem cURL-Python-Tutorial lernen Sie anhand von praktischen Beispielen, wie Sie mit PycURL Webanfragen durchführen können. Wir zeigen auch, wie man eine typische curl-Anfrage in Python konvertiert und vergleichen sie mit Bibliotheken wie Requests, HTTPX und AIOHTTP.

Wie man den cURL-Befehl in Python verwendet

Das Verständnis dieses Konzepts ist für die Python-Integration von entscheidender Bedeutung, also lassen Sie uns mit den Grundlagen beginnen. Sie können Python cURL-Befehle direkt im Terminal verwenden, um Aufgaben wie GET- und POST-Anfragen auszuführen.

Beispiel für cURL-Befehle:


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

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

1.png

2.png

Installation der erforderlichen Bibliotheken

Um cURL zu verwenden, installieren Sie die Python-Bibliothek PycURL.

Installieren:


pip install pycurl

HTTP-Anfragen mit PycURL stellen

Die Verwendung von curl in Python bietet detaillierte Kontrolle über HTTP-Anfragen. Im Folgenden wird anhand eines Beispiels gezeigt, wie eine GET-Anfrage mit PycURL gestellt wird:


import pycurl
import certifi
from io import BytesIO

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

# Ein cURL-Objekt initialisieren
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()

# Das Schließen des cURL-Objekts hilft, die verbrauchten 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 - Curl an Python-Anfragen - ist üblich. Mit der Bibliothek 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()

# Ein cURL-Objekt initialisieren
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 Systemressourcen 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'))

Umgang mit benutzerdefinierten HTTP-Headern

Benutzerdefinierte Kopfzeilen oder Authentifizierung sind bei HTTP-Anfragen oft erforderlich. Umgang mit benutzerdefinierten Headern: HTTP-Anfragen erfordern oft Authentifizierungs-Token oder benutzerdefinierte Header. Der Umgang mit benutzerdefinierten Headern kann effizient erfolgen, wenn Sie wissen, wie man Python curl json parse Techniken verwendet:


import pycurl
import certifi
from io import BytesIO

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

# Ein cURL-Objekt initialisieren
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()

# Wenn Sie fertig sind, schließen Sie das cURL-Handle, um alles aufzuräumen
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'))

Umgang mit XML-Antworten

Umgang mit XML-Antworten Bei der Arbeit mit XML-Parsing und dem Umgang mit verschiedenen APIs ist der Umgang mit XML-Antworten unerlässlich. Im Folgenden finden Sie ein Beispiel für die Verarbeitung von XML-Antworten mit PycURL:


# Erforderliche Bibliotheken importieren
import pycurl  # Eine Bibliothek zum Senden 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 Systemressourcen freizugeben
c.close()

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

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

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

Behandlung von HTTP-Fehlern

Die Behandlung von Fehlern bei HTTP-Anfragen ist ein wichtiger Aspekt bei der Arbeit mit externen Integrationen. Hier ist 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  # 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 Systemressourcen freizugeben
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # Dekodieren und Drucken des Antwortkörpers

Der korrigierte Code passt die URL an https://example.com an, wodurch das Protokollproblem behoben wird. Danach wiederholt der Autor die gleichen Schritte 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 ausgedruckt. Dies unterstreicht, wie wichtig es ist, URLs korrekt zu konstruieren, einen korrekten Anfragefluss aufrechtzuerhalten und vor allem eine robuste Fehlerbehandlung zu implementieren, wenn HTTP-Anfragen mit PycURL gestellt werden.

3.png


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()
# Korrigieren Sie die URL zur Verwendung von 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 Systemressourcen freizugeben
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # Dekodieren und Drucken des Antwortkörpers

Erweiterte cURL-Funktionen

Bei der Arbeit mit Python-Konvertierungen von cURL-Anfragen ist es nützlich zu wissen, dass cURL viele erweiterte Optionen zur Steuerung des HTTP-Verhaltens bietet, z. B. die Behandlung von Cookies und Timeouts. Nachfolgend ein Beispiel, das die erweiterten Optionen zur Ausführung von curl-Befehlen in Python zeigt.


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 Systemressourcen freizugeben
c.close()

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

# Dekodierung des Antwortkörpers mit UTF-8-Kodierung und Ausdruck
print(body.decode('utf-8'))

Vergleich von PycURL, Requests, HTTPX und AIOHTTP

Vier Bibliotheken sind bei der Arbeit mit HTTP-Anfragen in Python sehr beliebt: PyCurl, Requests, HTTPX und AIOHTTP. Jede hat ihre Stärken und Schwächen. Hier ist ein Vergleich, der Ihnen hilft, 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

Fortgeschrittene Benutzer werden die benutzerdefinierten Steuerelemente schätzen, die mit HTTP-Befehlen angeboten werden; sie werden feststellen, dass PycURL die Erwartungen an die Leistung übertrifft. 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.

Wie Sie sehen, kann sich Ihre Wahl je nach Umfang des Projekts ändern - Flexibilität oder Geschwindigkeit. In fortgeschrittenen Kontexten ist PycURL die bevorzugte, wenn nicht die einzige Wahl.

Schlussfolgerung

Wenn Sie bei HTTP-Anfragen Wert auf Leistung und Kontrolle auf niedriger Ebene legen, ist PycURL eine gute Wahl. Das Erlernen der Verwendung von cURL in Python ist vielleicht nicht der anfängerfreundlichste Weg, aber es erschließt leistungsstarke Funktionen, die abstraktere Bibliotheken oft verbergen. Von Web Scraping und XML-Verarbeitung bis hin zur Verwaltung von benutzerdefinierten Headern und Cookies - PycURL erledigt alles mit Präzision. Für einfachere Aufgaben, asynchrone Arbeitsabläufe oder eine einfache Bedienung sind Bibliotheken wie Requests, HTTPX und AIOHTTP jedoch möglicherweise besser geeignet.

Bemerkungen:

0 Bemerkungen