Um das Ziel dieses Artikels zu erreichen, nämlich zu lernen, wie man cURL in Python verwendet, müssen wir zunächst cURL vorstellen. Client URL (cURL) ist, kurz gesagt, eine benutzerfreundliche Befehlszeile, die für Entwickler entwickelt wurde, um Daten von einem Server abzurufen.
Was ist cURL?
Wie verwendet man cURL?
Wie ich oben bereits erwähnt habe, ist die Verwendung von cURL ziemlich unkompliziert und ermöglicht das Abrufen von Informationen mit nur einem einzeiligen Befehl. Zunächst musst du ein Terminal öffnen und „curl“ gefolgt von einem Website-Link eingeben, zum Beispiel:
$ curl 'https://www.webscrapingapi.com/'
Herzlichen Glückwunsch, Sie haben Ihre erste Anfrage mit cURL gestellt. Dieser einfache Befehl fordert Informationen vom Server an, genau wie es ein herkömmlicher Browser tut, und gibt den HTML-Code der Seite zurück. Nicht jede Website gibt HTML zurück; es gibt Endpunkte, die Daten als JSON-Objekt zurücksenden. Nehmen wir dieses Beispiel:
$ curl 'https://jsonplaceholder.typicode.com/todos/1'
Geben Sie diesen Befehl in Ihr Terminal ein, und Sie sollten folgende Antwort erhalten:
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
}Die meisten APIs geben entweder HTML oder JSON zurück, wenn Sie cURL-Befehle gegen sie ausführen. Nun, das ist noch nicht alles, was cURL für uns tun kann. In Wirklichkeit ist es ein sehr ausgeklügeltes Tool. Wenn Sie mehr über cURL erfahren möchten, empfehle ich Ihnen dringend, einen Blick in die cURL-Dokumentation zu werfen, um ein besseres Verständnis für die Parameter zu erhalten. Alternativ können Sie den folgenden Befehl ausführen:
$ curl --help
Dadurch werden Ihnen einige Optionen angezeigt, die Sie für cURL festlegen können:
Usage: curl [options...] <url>
-d, --data <data> HTTP POST data
-f, --fail Fail silently (no output at all) on HTTP errors
-h, --help <category> Get help for commands
-i, --include Include protocol response headers in the output
-o, --output <file> Write to file instead of stdout
-O, --remote-name Write output to a file named as the remote file
-s, --silent Silent mode
-T, --upload-file <file> Transfer local FILE to destination
-u, --user <user:password> Server user and password
-A, --user-agent <name> Send User-Agent <name> to server
-v, --verbose Make the operation more talkative
-V, --version Show version number and quit
This is not the full help, this menu is stripped into categories.
Use "--help category" to get an overview of all categories.For all options use the manual or "--help all".
Wie du wahrscheinlich sehen kannst, sind dies nicht einmal alle Optionen, die du für cURL festlegen kannst; es handelt sich um ein in Kategorien unterteiltes Menü. Du hast wahrscheinlich schon erraten, dass du, um alle Optionen anzuzeigen, die du ausführen möchtest:
$ curl --help all
Wie verwendet man cURL in Python?
Für diesen Schritt gibt es zwei Voraussetzungen. Die erste ist ziemlich offensichtlich: Sie sollten Python auf Ihrem Rechner installieren. Dazu navigieren Sie zur offiziellen Python-Website und installieren die für Ihr Betriebssystem passende Version. Achten Sie darauf, dass es sich um eine neue Version handelt, da ältere Versionen wahrscheinlich kein pip enthalten, das für die meisten Pakete, die wir verwenden wollen, erforderlich ist. Führen Sie anschließend den folgenden Befehl aus:
$ pip --version
Nach erfolgreicher Installation sollte dir die Version von pip angezeigt werden, die du installiert hast.
Andernfalls erhalten Sie höchstwahrscheinlich folgende Meldung:
"pip" is not considered to be an external or internal command. A batch file is a program to operate.
Es ist sehr wichtig, dass Sie pip installiert haben, um fortfahren zu können, da Sie es zur Installation von Paketen benötigen.
Die zweite Voraussetzung ist, dass Sie mit der Python-Syntax vertraut sind oder zumindest über Anfängerkenntnisse in einer anderen Programmiersprache verfügen.
Warum cURL in Python verwenden?
Sie fragen sich wahrscheinlich: Reicht es nicht aus, cURL einfach über die Befehlszeile zu verwenden? Wir führen nur eine einzige Befehlszeile aus und die API liefert uns die Informationen zurück. Das ist richtig, aber in der Praxis wollen wir die Daten, die wir vom Server zurückerhalten, irgendwie verarbeiten, und dafür benötigen wir eine Programmiersprache. An dieser Stelle kommt Python ins Spiel.
Warum Python verwenden?
Python ist eine höhere Programmiersprache, die für viele Zwecke verwendet wird. Dank ihrer einfachen Syntax und Einfachheit ist sie für Anfänger sehr leicht zu erlernen. Darüber hinaus gibt es eine riesige Community, die bereit ist, Ihnen zu helfen. Sollten Sie also auf Probleme stoßen, zögern Sie nicht, eine Frage zu stellen. Ein großartiger Ort, an dem Sie einsteigen und eine Frage stellen können, ist StackOverflow, und jemand wird sich sicherlich bei Ihnen melden.
Wie man cURL in Python integriert
Genau wie zuvor ist auch cURL in Python sehr unkompliziert. Erinnern Sie sich daran, als wir einen Einzeiler geschrieben haben, um die Daten vom Server abzurufen. Der Unterschied besteht darin, dass Sie nun zwei Zeilen Code für diesen einfachen Aufruf schreiben müssen, zum Beispiel:
import osos.system(f'curl "https://www.webscrapingapi.com/product/"')
Sehen wir uns nun den eigentlichen Vorteil der Verwendung einer Programmiersprache an. Wir können eine Funktion erstellen, die eine benutzerdefinierte URL entgegennimmt und den cURL-Befehl darauf anwendet:
import os
def cURL(url):
return os.system(f'curl "{url}"')cURL('https://www.webscrapingapi.com/blog/')
Sie können https://www.webscrapingapi.com/blog/ durch jede andere Website ersetzen, von der Sie Daten abrufen möchten. Herzlichen Glückwunsch, Sie haben nun ein Skript erstellt, das eine URL entgegennimmt, den cURL-Befehl ausführt und das Ergebnis in der Konsole anzeigt. Sie können Python direkt in Ihrem Terminal ausführen, aber für ein besseres Programmiererlebnis empfehle ich Ihnen dringend, eine integrierte Entwicklungsumgebung (IDE) zu verwenden. Es gibt viele Möglichkeiten, aber für Python empfehle ich PyCharm, das Sie hier herunterladen können
Wie ich oben bereits erwähnt habe, ist cURL keineswegs darauf beschränkt. Es kann neben dem Senden von GET-Anfragen eine Vielzahl weiterer Aufgaben ausführen. Es kann auch Dateien herunterladen oder POST-, PUT- oder DELETE-Anfragen senden. Hier ist ein Beispiel für eine Python-Funktion, die eine POST-Anfrage an https://httpbin.org/post sendet:
import os
def cURL(method,url,data):
return os.system(f'curl -X "{method}" --url "{url}" --data {data} ')
data = '{"foo":"bar"}'cURL('POST', 'https://httpbin.org/post', data)
Wie Sie wahrscheinlich gesehen haben, unterscheidet sich der Befehl beim Senden einer POST-Anfrage ein wenig. Bei der vorherigen Anfrage mussten Sie die Parameter -X und –data nicht verwenden, da die Standardmethode von cURL GET ist. Nach Ausführung dieses Befehls sollten Sie von der httpbin-API eine Antwort erhalten, die Ihre Anfrage, Ihre IP-Adresse, die Parameter und den von Ihnen übermittelten Body enthält, was in etwa so aussehen würde.
{
"args": {},
"data": "",
"files": {},
"form": {
"{foo:bar}": ""
},
"headers": {
"Accept": "*/*",
"Content-Length": "9",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "curl/X.XX.X",
"X-Amzn-Trace-Id": "Root=X-XXXXX-XXXXXX"
},
"json": null,
"origin": "0.0.0.0",
"url": "https://httpbin.org/post"
}Zu diesem Zeitpunkt haben Sie bereits ein einfaches Tool erstellt, das GET-, POST-, PUT-, PATCH-, DELETE- usw. Anfragen senden kann, um Daten von einer API abzurufen. Wir können nun die URL, die Methode und den Body direkt in unserem Python-Skript festlegen, anstatt sie manuell einzugeben. Dies ist jedoch nur ein kleiner Vorteil, den wir durch die Verwendung von cURL in Python haben. Der größte Vorteil besteht darin, dass wir die Daten nun so verarbeiten können, wie wir es möchten, selbst wenn die API uns keine Möglichkeit bietet, sie in der gewünschten Form abzurufen. Nehmen wir zum Beispiel an, wir erhalten eine Liste aller Benutzer, möchten diese jedoch in zwei Gruppen aufteilen und die Benutzer aus der zweiten Gruppe abrufen.
Dank Python ist dies möglich, indem wir die Antwort in einer Variablen namens `users` speichern, die wir mithilfe der Methode `json.loads()` in ein Array von JSON-Objekten umwandeln können – weitere Informationen dazu finden Sie hier. Danach können wir das `users`-Array durchlaufen und nur die Benutzer in der zweiten Hälfte der Liste oder mit ID-Nummern anzeigen, die größer sind als die Mitte der Liste. Zum besseren Verständnis sieht das im Code wie folgt aus:
import subprocess
import json
def cURL(url):
return subprocess.check_output(['curl',url])
users = json.loads(cURL('https://jsonplaceholder.typicode.com/users'))
for user in users:
if(user['id'] > len(users) / 2): print(user)Ihnen ist wahrscheinlich aufgefallen, dass wir statt „os“ nun die Bibliotheken „subprocess“ und „json“ verwenden. Wir nutzen die „subprocess“-Bibliothek, weil wir die Ausgabe des Befehls speichern möchten – im Gegensatz zum „os“-Modul, das den Befehl lediglich ausführt, ohne ihn zu speichern. Der Code ist eine einfache GET-Anfrage an eine API, die uns eine Liste von Benutzern in Form von JSON-Objekten zurückgibt. Die Ausgabe sollte wie folgt aussehen:
{'id': 6, 'name': 'Mrs. Dennis Schulist', 'username': 'Leopoldo_Corkery', 'email': 'Karley_Dach@jasper.info', 'address': {'street': 'Norberto Crossing', 'suite': 'Apt. 950', 'city': 'South Christy', 'zipcode': '23505-1337', 'geo': {'lat': '-71.4197', 'lng': '71.7478'}}, 'phone': '1-477-935-8478 x6430', 'website': 'ola.org', 'company': {'name': 'Considine-Lockman', 'catchPhrase': 'Synchronised bottom-line interface', 'bs': 'e-enable innovative applications'}}
{'id': 7, 'name': 'Kurtis Weissnat', 'username': 'Elwyn.Skiles', 'email': 'Telly.Hoeger@billy.biz', 'address': {'street': 'Rex Trail', 'suite': 'Suite 280', 'city': 'Howemouth', 'zipcode': '58804-1099', 'geo': {'lat': '24.8918', 'lng': '21.8984'}}, 'phone': '210.067.6132', 'website': 'elvis.io', 'company': {'name': 'Johns Group', 'catchPhrase': 'Configurable multimedia task-force', 'bs': 'generate enterprise e-tailers'}}
{'id': 8, 'name': 'Nicholas Runolfsdottir V', 'username': 'Maxime_Nienow', 'email': 'Sherwood@rosamond.me', 'address': {'street': 'Ellsworth Summit', 'suite': 'Suite 729', 'city': 'Aliyaview', 'zipcode': '45169', 'geo': {'lat': '-14.3990', 'lng': '-120.7677'}}, 'phone': '586.493.6943 x140', 'website': 'jacynthe.com', 'company': {'name': 'Abernathy Group', 'catchPhrase': 'Implemented secondary concept', 'bs': 'e-enable extensible e-tailers'}}
{'id': 9, 'name': 'Glenna Reichert', 'username': 'Delphine', 'email': 'Chaim_McDermott@dana.io', 'address': {'street': 'Dayna Park', 'suite': 'Suite 449', 'city': 'Bartholomebury', 'zipcode': '76495-3109', 'geo': {'lat': '24.6463', 'lng': '-168.8889'}}, 'phone': '(775)976-6794 x41206', 'website': 'conrad.com', 'company': {'name': 'Yost and Sons', 'catchPhrase': 'Switchable contextually-based project', 'bs': 'aggregate real-time technologies'}}
{'id': 10, 'name': 'Clementina DuBuque', 'username': 'Moriah.Stanton', 'email': 'Rey.Padberg@karina.biz', 'address': {'street': 'Kattie Turnpike', 'suite': 'Suite 198', 'city': 'Lebsackbury', 'zipcode': '31428-2261', 'geo': {'lat': '-38.2386', 'lng': '57.2232'}}, 'phone': '024-648-3804', 'website': 'ambrose.net', 'company': {'name': 'Hoeger LLC', 'catchPhrase': 'Centralized empowering task-force', 'bs': 'target end-to-end models'}}Dies ist nur eine der Anwendungsmöglichkeiten von cURL in Python. Wir sind nicht mehr darauf angewiesen, dass die API Daten in der von uns gewünschten Form zurücksendet; wir können sie auf vielfältige Weise verarbeiten, beispielsweise um anhand von Name, E-Mail-Adresse, Telefonnummer oder einer anderen eindeutigen Eigenschaft einer Person anzuzeigen, ob diese in einer Antwortliste enthalten ist.
Nehmen wir zum Beispiel an, wir möchten überprüfen, ob ein bestimmter Name in einer Liste vorhanden ist. Dazu können wir eine Funktion erstellen, die die Antwort entgegennimmt, die wir in ein JSON-Array konvertiert haben, das Python parsen kann.
import subprocess
import json
def cURL(url):
return subprocess.check_output(['curl',url])
users = json.loads(cURL('https://jsonplaceholder.typicode.com/users'))
def check_if_user_exists(users,name):
for user in users:
if(user['name'] == name): print(f'An user called {name} exists in the list and has the id of {user["id"]}')
check_if_user_exists(users,'Clementina DuBuque')Dieser Code-Block liefert uns dann folgende Ausgabe:
An user called Clementina DuBuque exists in the list and has the id of 10
Herzlichen Glückwunsch. Sie haben ein Skript erstellt, das Daten von einem Server abruft, speichert und anschließend parst. Die Vorteile der Verwendung von Python hören hier noch nicht auf: Python verfügt sogar über eine spezielle Schnittstelle für die Verwendung von cURL, die PycURL heißt, und darüber werden wir nun sprechen.
Was ist PycURL?
Wie bereits erwähnt, ist PycURL, kurz gesagt, ein Python-Tool, das uns hilft, cURL auf natürlichere Weise zu nutzen. Ein großer Vorteil ist, dass PycURL stark optimiert ist und Parallelität unterstützt, was bedeutet, dass es sehr schnell ist (schneller als die beliebte Python-Bibliothek „request“). Andererseits ist die Verwendung von PycURL nicht so einfach wie das, was wir zuvor gesehen haben, da es sich um ein Tool handelt, das sich an fortgeschrittene Entwickler richtet. Sie sollten sich davon jedoch nicht einschüchtern lassen, denn letztendlich werden Sie ein tieferes Verständnis für Netzwerke gewinnen und sich mit Python wohler fühlen.
Wie installiert man es?
Genau wie jedes andere Paket können Sie es mit pip installieren:
$ pip install pycurl
Aus Sicherheitsgründen sollten Sie bei der Verwendung von pycurl diesmal auch certifi installieren. Certifi ist ein Tool, das SSL-Zertifikate validiert und gleichzeitig die Identität des TLS-Hosts überprüft. Um mehr über certifi zu erfahren, empfehle ich Ihnen dringend, die Dokumentation zu lesen. Sie können es auf die gleiche Weise installieren:
$ pip install certifi
Sie können nun die erfolgreiche Installation testen, indem Sie das folgende Skript ausführen:
import certifiprint(certifi.where())
Die Ausgabe sollte den Speicherort angeben, an dem das Paket installiert wurde:
/usr/local/lib/python3.10/site-packages/certifi/cacert.pem
Wie verwendet man pycURL?
Der Unterschied zu dem, was wir zuvor gemacht haben, besteht darin, dass wir jetzt nur Code schreiben, ohne Befehle direkt auszuführen. Kurz gesagt: Wir erstellen eine Instanz der Klasse pycurl.Curl(), rufen die Daten ab und schreiben sie in einen Puffer, den wir später dekodieren, um die empfangenen Daten lesen zu können:
import pycurl
import certifi
from io import BytesIO
buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.URL, 'https://docs.webscrapingapi.com/')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())
c.perform()
c.close()
body = buffer.getvalue()print(body.decode('iso-8859-1'))
Sie haben es erraten: Genau wie in unseren vorherigen Beispielen ruft dies den HTML-Inhalt der WebScrapingAPI-Webseite ab und gibt ihn in der Befehlszeile aus.
Eine POST-Anfrage unterscheidet sich nicht wesentlich davon, außer dass du deiner Instanz der Klasse pycurl.Curl() mitteilen musst, dass du die POST-Methode verwenden wirst, und gegebenenfalls deinen Body und deine Header festlegen musst. So sieht das aus:
import pycurl
import certifi
import json
from io import BytesIO
buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.URL, 'https://httpbin.org/post')
c.setopt(pycurl.HTTPHEADER, [ 'Content-Type: application/json' , 'Accept: application/json'])
data = json.dumps({"foo": "bar"})
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())
c.perform()
c.close()
body = buffer.getvalue()print(body.decode('iso-8859-1'))
Und wir sollten, genau wie zuvor, eine Antwort erhalten, die Ihre Anfrage, IP-Adresse, Parameter und den Body enthält:
{
"args": {},
"data": "",
"files": {},
"form": {
"{foo:bar}": ""
},
"headers": {
"Accept": "*/*",
"Content-Length": "9",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "curl/X.XX.X",
"X-Amzn-Trace-Id": "Root=X-XXXXX-XXXXXX"
},
"json": null,
"origin": "0.0.0.0",
"url": "https://httpbin.org/post"
}Wie ich bereits erwähnt habe, sind dies nur einige grundlegende Dinge, die pycURL für uns tun kann. Es ist ein sehr komplexes und ausgefeiltes Tool, über das wir viele Artikel schreiben könnten. Wenn Sie mehr darüber erfahren möchten, was Sie damit alles machen können, empfehle ich Ihnen dringend, die Dokumentation zu lesen.
Zusammenfassung
Zusammenfassend lässt sich sagen, dass die Verwendung von cURL in Python sehr effektiv ist, viel Zeit spart und darüber hinaus ein Ausgangspunkt für einige interessante Projekte in Bereichen wie Datenanalyse oder Web-Scraping sein kann. Ich empfehle, sich zunächst mit cURL und Python vertraut zu machen und dann zu pycURL überzugehen. Ich hoffe, du fandest diese Anleitung nützlich, um den Umgang mit cURL in Python zu erlernen, und dass du damit experimentieren und einige Skripte erstellen wirst.




