Anleitung zur Verwendung von cURL mit Python

In diesem Artikel erfahren Sie, wie Python und cURL zusammen verwendet werden können, um GET-, POST- und PUT-Anfragen zu automatisieren und um Dateien und Websites herunterzuladen.
13 min read
Guide to using cURL with Python

cURL ist ein vielseitiges Open-Source-Kommandozeilen-Programm zum Übertragen von Dateien über ein Netzwerk. Es verfügt über eine Vielzahl von Parametern, sodass es fast jede Anfrage verarbeiten kann. Darüber hinaus ist cURL erweiterbar und hat eine Schnittstelle in praktisch jeder modernen Programmiersprache.

Die Verwendung von cURL zusammen mit einer Programmiersprache bietet viele Vorteile. Beispielsweise können Anfragen zur Fehlersuche oder zum Web Scraping automatisiert werden.

In diesem Artikel erfahren Sie, wie Python und cURL zusammen verwendet werden können, um GET-, POST- und PUT-Anfragen zu automatisieren und um Dateien und Websites herunterzuladen.

Was ist cURL?  

cURL ist ein Softwareprojekt, aber der Name wird auch für zwei Produkte verwendet: eine Bibliothek, die als libcurl bekannt ist, und ein Kommandozeilen-Programm namens curl (das libcurl verwendet). Wenn in diesem Artikel von curl die Rede ist, ist damit das Kommandozeilen-Programm gemeint.

curl gilt als vielseitig, aber seine wichtigste Aufgabe ist simpel: die Übertragung von Daten über verschiedene Netzwerkprotokolle. Angesichts der Komplexität des modernen Internets verfügt curl über eine enorme Liste mit Optionen, mit denen auch die komplexesten Anfragen verarbeitet werden können.

curl wurde erstmals 1996 als HttpGet veröffentlicht und später in urlget umbenannt. Danach wurde es zu curl. Der erste Anwendungsfall war das Abrufen von Wechselkursen, um diese in einem IRC-Kanal einzusetzen. Heute unterstützt curl die Übertragung von Daten mithilfe einer Reihe von Methoden: FTP(S), HTTP(S) (POST, GET, PUT), IMAP, POP3, MQTTund SMB. Außerdem kann curl Cookies und SSL-Zertifikate verarbeiten.

Wenn curl eine Verbindung über HTTPS herstellt, erhält es das Zertifikat des Remote-Servers und gleicht es mit dem CA-Zertifikatsspeicher ab, um sicherzustellen, dass der Remote-Server derjenige ist, der er vorgibt zu sein. Die folgende Anfrage sendet zum Beispiel eine HTTPS-Anfrage an die Website von Bright Data und setzt ein Cookie mit der Bezeichnung Gruß mit dem Wert Hallo:

curl --cookie "greeting=hello" https://www.brightdata.com

Warum curl zusammen mit Python verwenden?

Auch wenn curl ein vielseitiges Tool ist, gibt es doch einen wichtigen Grund, warum Sie es zusammen mit Python verwenden sollten: Python kann Ihre Anfragen automatisieren. Im Folgenden beschreiben wir drei Anwendungsfälle, für die diese Kombination sehr nützlich ist:  

Web Scraping

Unter Web Scraping versteht man das Erfassen von (oft großen) Datenmengen von einer oder mehreren Websites. Um Daten mit Python zu scrapen, vertrauen viele der Bibliothek requests (Anfragen). Zum rekursiven Scrapen können Sie wget verwenden. Für fortgeschrittene Scraping-Anwendungsfälle mit komplexen HTTP(S)-Aufrufen ist die Verwendung von curl zusammen mit Python jedoch ideal.

Während Daten von einer Website mit einem einzigen curl-Kommando erfasst werden können, der eine HTTP(S)-Anfrage erzeugt und verarbeitet, kann dies nicht rekursiv geschehen. Durch die Einbettung von curl in einen Python-Code können Sie einen Navigationspfad auf einer Website simulieren, indem Sie Elemente wie Anfrageparameter, Cookies und Benutzeragenten manipulieren.

Die Navigation muss nicht einmal fixiert werden. Wenn Sie die Navigation von den gescrapten Inhalten abhängig machen, kann jede neue Anfrage völlig dynamisch sein.

Wenn Sie beispielsweise den Kommentarbereich einer beliebten Nachrichten-Website scrapen, aber nur die Profilseite des Autors scrapen möchten, und der Kommentar hasserfüllte Schlüsselwörter enthält, können Sie eine bedingte Anweisung erstellen, die von den gescrapten Kommentaren abhängt, und diesen dynamischen Filter einfach anwenden.

Außerdem verfügen viele Websites über Sicherheitsmechanismen, die das Scrapen mehrerer Seiten erschweren: Denken Sie an einen DDoS-Schutz (Distributed Denial of Service) oder an die Aufforderung reCAPTCHA. Wenn Sie bestimmter Regeln anwenden und Pausen zwischen den Anfragen machen, können Sie menschliches Verhalten simulieren, das schwieriger zu erkennen ist.

Testen und Fehlersuche

Die Verwendung von curl auf der eigenen Website scheint töricht zu sein, ist aber nützlich zum Testen und zur Fehlersuche. Das Testen einer oder mehrerer Funktionen einer Anwendung oder die Suche von Fehlern ist oft eine mühsame Aufgabe. Die Funktionen müssen immer wieder mit verschiedenen Einstellungen oder Parametern getestet werden. Es gibt zwar viele Standardtools zum Testen, aber mit Python und curl lassen sich schnell einige kurze Tests einrichten.

Wenn Sie beispielsweise einen neuen Checkout-Ablauf für Ihren (komplexen) Online-Dienst ausgeben, der Cookies verwendet, sich auf den Referrer stützt, geringfügige Unterschiede zwischen den einzelnen Browsern aufweist (z. B. User Agent) und alle Schritte des Checkout-Ablaufs in den Body einer POST-Anfrage packt, könnte das manuelle Testen aller Varianten ewig dauern. In Python haben Sie die Möglichkeit ein Wörterbuch zu erstellen, das den gesamten Parametersatz enthält. Mit curl können Sie dann eine Anfrage für alle möglichen Kombinationen senden.

Automatisierung von Arbeitsabläufen

Neben dem Testen und der Fehlersuche sowie dem Web Scraping kann curl auch für die Automatisierung von Arbeitsabläufen eingesetzt werden. Viele Pipelines für die Datenintegration beginnen beispielsweise mit einem wiederkehrenden Dump eines Datenexports, wie z. B. einer CSV- oder Apache Parquet-Datei. Mit einer Python-Anwendung, die auf einem (S)FTP-Server nach neuen Dateien sucht, kann das Kopieren von Daten-Dumps vollständig automatisiert werden.  

Sie können auch Mailhooks einrichten. Stellen Sie sich vor, wie viele täglich anfallenden Aufgaben automatisiert werden könnten, wenn eine Anwendung nach E-Mail-Nachrichten suchen könnte, die eine Anfrage enthalten. Durch die Abfrage neuer Nachrichten über das POP3- oder IMAP-Protokoll können Python-Anwendungen ausgelöst werden, wenn eine bestimmte E-Mail in ein Postfach eingeht.

Wie cURL mit Python verwendet wird

Es gibt verschiedene Möglichkeiten, mit curl in Python Anfragen zu stellen. In diesem Artikel werden wir zwei Möglichkeiten behandeln. Die erste besteht darin, curl-Anfragen in der Kommandozeile über die Python-Pakete os und subprocess zu simulieren. Dieser einfache Ansatz sendet programmatisch Kommandos an die Kommandozeilenschnittstelle Ihres Betriebssystems.

Die zweite Möglichkeit ist, das PycURL-Paket zu verwenden. Wenn Sie mehr erfahren möchten über weitere Möglichkeiten, wie Websites mit Python (ohne curl) gescrapt werden, lesen Sie die Anleitung „Web Scraping mit Python“ von Bright Data. \

Voraussetzungen

Bevor Sie mit dieser Anleitung beginnen, stellen Sie sicher, dass Sie curl heruntergeladen und installiert haben. Wenn Sie Windows verwenden, fügen Sie curl zu Ihrer Umgebungsvariablen PATH hinzu, sodass Sie das Kommando curl einfach ausführen können.

Um mit Ihrem Betriebssystem eine Python-Schnittstelle zu erstellen, haben Sie die Wahl zwischen verschiedenen Paketen. Die beiden beliebtesten sind jedoch os und subprocess. Um beide zu installieren, führen Sie den folgenden pip-Befehl aus:

pip install os subprocess

Eine Anfrage mit „curl“ und „os“ stellen

Das Paket os ist ganz einfach zu handhaben. Das Ausführen einer curl-Anfrage, ohne die Antwort zu verarbeiten, erfordert nur zwei Zeilen Code. Sie müssen nur das im vorherigen Beispiel beschriebene Cookie übergeben. Die Ausgabe wird dann in die Datei output.txt geschrieben:

import os
os.system('curl -o output.txt --cookie "greeting=hello" -k https://curl.se')

Wenn Sie die Antwort in Python verarbeiten wollen, anstatt sie in eine Datei zu schreiben, sollten Sie das Paket subprocess verwenden, das wir im nächsten Abschnitt vorstellen werden.

Der folgende Code führt die gleiche Anweisung aus, aber anstatt die Antwort in eine Datei zu schreiben, werden stdout und stderr als ein Tupel ausgegeben. Diese Ausgabe kann dann mit anderen Python-Paketen verarbeitet werden, zum Beispiel mit Beautiful Soup:

import shlex
import subprocess
shell_cmd = shlex.split('curl --cookie "greeting=hello" -k https://curl.se')
process = subprocess.Popen(shell_cmd,
                    stdout = subprocess.PIPE,
                    stderr = subprocess.PIPE,
                    text = True,
                    shell = True
                    )
std_out, std_err = process.communicate()
std_out.strip(), std_err

Verwendung von PycURL

Anstelle die Schnittstelle zu Ihrem Terminal in Python aufzubauen, können Sie auch das Paket PycURL verwenden. Wenn Sie Linux verwenden, haben Sie Glück, denn Sie können PycURL mit pip installieren:

pip install pycurl
pip install certifi

Sie sollten auch certifi installieren, um die Schnittstelle über das HTTPS-Protokoll aufzubauen. Sollten Sie Probleme haben, befolgen Sie diese Anweisungen von Stack Overflow.

PycURL können Sie zwar auch unter Windows installieren, aber das ist ein äußerst frustrierendes Unterfangen. Wenn Sie versuchen, es über pip zu installieren, wird die folgende Fehlermeldung angezeigt:

Please specify --curl-dir=/path/to/built/libcurl

Deshalb müssen Sie es aus dem Quellcode installieren, aber das ist nichts für schwache Nerven, denn es gibt eine Vielzahl möglicher Abhängigkeiten, und jede dieser Abhängigkeiten hat ihre eigene Verzeichnisstruktur, ihren eigenen Konfigurationsstil, ihre eigenen Parameter und Eigenheiten. Wenn Sie mit Windows arbeiten, ist es deshalb empfehlenswert, dass Sie das Paket requests für grundlegende Netzwerkanfragen verwenden.

Anfragen mit PycURL stellen

Im restlichen Artikel befassen wir uns mit der Erstellung verschiedener Arten von Anfragen mit dem PycURL-Paket.

Eine GET-Anfrage mit PycURL stellen

Die einfachste Anfrage, die Sie mit PycURL stellen können, ist eine GET-Anfrage. Im Grunde handelt es ich dabei um eine Vorlage für alle anderen Vorlagen, die in diesem Abschnitt verwendet werden.

In dem folgenden Code können Sie fünf Schritte erkennen:

  1. Alle erforderlichen Pakete werden importiert.
  2. Es werden zwei Objekte erstellt: der Puffer, in dem die Antwort auf die Curl-Anfrage gespeichert wird, und das Curl-Objekt, das für die Anfrage verwendet wird.
  3. Die Optionen der Anfrage werden angegeben: die URL, der Zielort und die SSL-Validierung.
  4. Die Ausführung der Anfrage.
  5. Die Ausgabe der Anfrage.
# Preparation
import pycurl
import certifi
from io import BytesIO

# Set buffer and Curl object.
buffer = BytesIO()
c = pycurl.Curl()

# Set request options.
## Set the request destination.
c.setopt(c.URL, 'http://pycurl.io/')

## Set the buffer as the destination of the request's response.
c.setopt(c.WRITEDATA, buffer)

## Refer to the installed certificate authority bundle for validating the SSL certificate.
c.setopt(c.CAINFO, certifi.where())

# Execute and close the request.
c.perform()
c.close()

# Print the buffer's content with a Latin1 (iso-8859-1) encoding.
body = buffer.getvalue()
data = body.decode('iso-8859-1')
print(data)

Eine POST-Anfrage mit PycURL stellen

Eine POST-Anfrage mit PycURL ist einer GET-Anfrage sehr ähnlich. Allerdings wird der Anfrage eine zusätzliche Option hinzugefügt: der POST-Body. Im folgenden Codeschnipsel wird ein Schlüsselwert gesetzt und URL-verschlüsselt, um sicherzustellen, dass dieser angemessen verarbeitet wird:

# Preparation
import pycurl
import certifi
from io import BytesIO

# Set buffer and Curl object.
buffer = BytesIO()
c = pycurl.Curl()

# Set request options.
## Set the request destination.
c.setopt(c.URL, 'http://pycurl.io/')

## Set the request's body.
post_body = {'greeting': 'hello'}
postfields = urlencode(post_body)
c.setopt(c.POSTFIELDS, postfields)

## Set the buffer as the destination of the request's response.
c.setopt(c.WRITEDATA, buffer)

## Refer to the installed certificate authority bundle for validating the SSL certificate.
c.setopt(c.CAINFO, certifi.where())

# Execute and close the request.
c.perform()
c.close()

# Print the buffer's content with a Latin1 (iso-8859-1) encoding.
body = buffer.getvalue()
print(body.decode('iso-8859-1'))

Eine PUT-Anfrage mit PycURL stellen

Die im vorherigen Abschnitt erstellte POST-Anfrage kann auch als PUT-Anfrage gesendet werden. Anstatt den Schlüsselwert im Body der Anfrage zu senden, senden Sie ihn als eine Dateidarstellung, die in UTF-8 kodiert ist. Diese Methode kann auch zum Hochladen von Dateien verwendet werden:

import pycurl
import certifi
from io import BytesIO

c = pycurl.Curl()

# Set request options.
## Set the request destination.
c.setopt(c.URL, 'http://pycurl.io/')

## Set data for the PUT request.
c.setopt(c.UPLOAD, 1)
data = '{"greeting": "hello"}'
buffer = BytesIO(data.encode('utf-8'))
c.setopt(c.READDATA, buffer)

## Refer to the installed certificate authority bundle for validating the SSL certificate.
c.setopt(c.CAINFO, certifi.where())

# Execute and close the request.
c.perform()
c.close()

Eine Datei mit PycURL herunterladen

Der nächste Schnipsel zeigt, wie eine Datei mit PycURL heruntergeladen werden kann. Ein zufällig erstelltes JPEG-Bild wird angefordert, und es wird ein Schreibstrom zu some_image.jpg geöffnet und an PycURL als Zielort für die Datei übergeben:

import pycurl
import certifi

c = pycurl.Curl()

# Set the request destination.
c.setopt(c.URL, 'http://pycurl.io/some_image.jpg')

# Refer to the installed certificate authority bundle for validating the SSL certificate.
c.setopt(c.CAINFO, certifi.where())

# Execute and close the request.
with open('some_image.jpg', 'w') as f:
    c.setopt(c.WRITEFUNCTION, f.write)
    c.perform()

c.close()

Eine Website mit PycURL herunterladen und verarbeiten

Da viele PycURL-Anwendungsfälle mit Web Scraping zu tun haben, beschreiben wir im nächsten Abschnitt, wie Sie die Antwort auf eine Anfrage mit Beautiful Soup verarbeiten können, einem beliebten Paket zum Parsen von HTML-Dateien.

Installieren Sie zunächst Beautiful Soup 4 mit pip:

pip install beautifulsoup4

Platzieren Sie dann den nächsten Schnipsel direkt hinter dem ersten PycURL-Schnipsel, mit dem Sie eine GET-Anfrage gestellt haben. Das veranlasst Beautiful Soup die Antwortdaten zu verarbeiten.

Beispielshalber wird die Methode find_all zum Auffinden aller Absatzelemente verwendet. Der Inhalt der einzelnen Absätze wird gedruckt:

from bs4 import BeautifulSoup

# Parsing data using BeautifulSoup
soup = BeautifulSoup(data, 'html.parser')

# Find all paragraphs
paragraphs = soup.find_all('p')
for p in paragraphs:
   print(p.text)

Einen Proxy mit PycURL verwenden

Web Scraping in großem Maßstab funktioniert am besten, wenn Sie mit Proxys arbeiten. Der Vorteil ist, dass Sie das Surfverhalten parallel emulieren können, ohne dass Ihr Scraper als Bot oder als anormales Verhalten erkannt wird.

In diesem letzten Abschnitt erfahren Sie, wie Sie eine Anfrage mit PycURL und einem Proxy erstellen. Dafür müssen Sie, wie zuvor, die Anfrageoptionen anpassen. Im Folgenden beschreiben wir vier Einstellungen, aber Sie können diese an Ihre Situation anpassen:

  1. Um es einfach zu machen, werden unsichere Proxys aktiviert.
  2. Der Proxyserver ist eingerichtet.
  3. Das Skript authentifiziert sich beim Server.
  4. Der Proxy ist als HTTPS eingestellt.
# Enable insecure proxies
c.setopt(c.PROXY_SSL_VERIFYHOST, 0)
c.setopt(c.PROXY_SSL_VERIFYPEER, 0)

# Set proxy server
c.setopt(pycurl.PROXY, <YOUR_HTTPS_PROXY_SERVER>)

# Authenticate with the proxy server
c.setopt(pycurl.PROXYUSERPWD, f"{<YOUR_USERNAME>}:{<YOUR_PASSWORD>}")

# Set proxy type to https
c.setopt(pycurl.PROXYTYPE, 2)

Diese Optionen können an beliebiger Stelle in einen der zuvor beschriebenen Codeschnipsel eingefügt werden, um die Anfrage über den Proxyserver umzuleiten.

Fazit

In diesem Artikel wurde die Kombination von curl und Python im Einzelnen erklärt, und es wurde herausgearbeitet, warum Sie sie zusammen verwenden sollten, wenn Sie komplexe Anfragen für das Web Scraping und Anwendungstests generieren. Anhand mehrerer Beispiele wurde die Vielseitigkeit von PycURL bei der Erstellung einer Vielzahl von Netzwerkanfragen aufgezeigt.

Alternativ können Sie auch das Proxy-Netzwerk von Bright Data und dessen Web Scraper IDE verwenden, die speziell dafür entwickelt wurden, Entwicklern die gesamte Arbeit abzunehmen. So können Sie sich auf die Arbeit mit den gescrapten Daten konzentrieren, anstatt sich Gedanken darüber zu machen, wie Sie die Anti-Scraping-Mechanismen umgehen können.