cURL ist das Kommandozeilen-Werkzeug zum Übertragen von Daten über das Netzwerk. Es spricht HTTP, HTTPS und eine lange Liste weiterer Protokolle und ist auf fast jeder Maschine vorinstalliert. Deshalb greifen die meisten Entwickler zuerst darauf zurück, wenn sie einen Endpunkt inspizieren, eine API testen oder eine Seite herunterladen möchten. Die GET-Methode steht dabei im Mittelpunkt: So fragen Sie einen Server nach einer Ressource und lesen, was zurückkommt.
Dieser Leitfaden ist eine fokussierte Anleitung zum Senden von GET-Anfragen mit cURL. Sie beginnen mit dem einfachsten Befehl und schichten dann Query-Parameter, Request-Header, Weiterleitungen, JSON-Verarbeitung und Flags hinzu, mit denen Sie genau sehen, was der Server gesendet hat. Am Ende wissen Sie, wie Sie cURL gut genug für echtes Debugging und kleine Scraping-Jobs einsetzen und wann ein reines GET nicht mehr ausreicht.
Was eine GET-Anfrage tatsächlich tut
GET ist die einfachste und häufigste HTTP-Methode. Wenn Sie eine URL im Browser öffnen, sendet der Browser eine GET-Anfrage an den Server, und der Server antwortet mit der Ressource: HTML, ein Bild, eine JSON-Payload, was auch immer unter dieser Adresse liegt. GET liest nur. Es sendet keinen Body zum Erstellen oder Ändern von etwas, wie es POST oder PUT tun, was es zur richtigen Methode für das Abrufen von Seiten, Read-Only-API-Endpunkten und statischen Assets macht.
cURL verwendet standardmäßig GET, daher müssen Sie die Methode für einen einfachen Abruf nie angeben. Die kürzestmögliche Anfrage ist der Programmname gefolgt von einer URL:
curl https://httpbin.org/get
Das gibt den Response-Body in Ihrem Terminal aus. httpbin.org ist ein kostenloser Request-Inspection-Dienst, der alles zurückspiegelt, was er empfängt, was ihn ideal zum Lernen macht: Jedes Beispiel unten verwendet ihn, damit Sie die Befehle ausführen und genau sehen können, was cURL gesendet hat. Wenn Sie die Methode explizit angeben möchten, buchstabiert -X GET oder --request GET dies aus, aber bei einem normalen GET ist es redundant.
Query-String-Parameter übergeben
Die meisten echten Endpunkte erwarten Parameter. Ein Query-String ist der Teil einer URL nach dem ?, geschrieben als key=value-Paare, verbunden durch &. Der direkteste Weg, sie zu senden, ist, sie direkt in die URL zu schreiben, in Anführungszeichen gesetzt, damit Ihre Shell das & nicht als Hintergrundjob interpretiert:
curl 'https://httpbin.org/get?city=Berlin&page=2'
Die einfachen Anführungszeichen sind wichtig. Ohne sie sieht die Shell das & und teilt den Befehl auf, also setzen Sie immer eine URL in Anführungszeichen, die &, ? oder Leerzeichen enthält.
cURL kann den Query-String auch für Sie mit -G und -d zusammenstellen. Das Flag -d erstellt normalerweise einen POST-Body, aber das Hinzufügen von -G weist cURL an, diese Daten zu nehmen und als GET-Query-String an die URL anzuhängen:
curl -G \ -d "city=Berlin" \ -d "page=2" \ https://httpbin.org/get
Beide Befehle erzeugen dieselbe Anfrage. Die -G-Form ist besser lesbar, wenn Sie mehrere Parameter haben oder diese in einem Skript erzeugen, da jedes Paar ein eigenes Flag ist und Sie den ?key=value&key=value-String nicht manuell aufbauen müssen.
Parameter-Werte URL-kodieren
Einfaches -d kodiert nichts, daher bricht ein Wert mit einem Leerzeichen, einem Ampersand oder einem Schrägstrich den Query-String. Wenn der Wert nicht bereits sicher ist, verwenden Sie --data-urlencode zusammen mit -G. cURL kodiert den Wert für Sie und hängt ihn trotzdem als Query-Parameter an:
curl -G \ --data-urlencode "q=web scraping & data" \ --data-urlencode "sort=date desc" \ https://httpbin.org/get
In der gespiegelten Antwort sehen Sie, wie Leerzeichen in %20 und das Ampersand in %26 umgewandelt werden, was genau das ist, was ein Server erwartet. Greifen Sie auf --data-urlencode zurück, wenn ein Wert aus Benutzereingaben stammt oder etwas anderes als Buchstaben, Zahlen und grundlegende Interpunktion enthält. Das erspart Ihnen schwer auffindbare Kodierungsfehler.
Request-Header hinzufügen
Header tragen Metadaten über Ihre Anfrage: welchen Content-Type Sie akzeptieren, was für einen User-Agent Sie angeben, ein Autorisierungstoken und mehr. Das Flag -H setzt einen Header pro Verwendung, und Sie können es so oft wiederholen, wie Sie benötigen:
curl \ -H "Accept: application/json" \ -H "User-Agent: my-script/1.0" \ -H "Authorization: Bearer YOUR_TOKEN" \ https://httpbin.org/headers
Der /headers-Endpunkt spiegelt jeden empfangenen Header zurück, sodass Sie bestätigen können, dass cURL genau das gesendet hat, was Sie beabsichtigt haben. Einen realistischen User-Agent und einen expliziten Accept-Header zu setzen ist auch der erste kleine Schritt, um automatisierte Anfragen weniger nach einem Standard-cURL-Skript aussehen zu lassen, was wichtig wird, sobald Sie echte Seiten abrufen. Eine tiefere Behandlung der Header-Handhabung finden Sie unter wie man HTTP-Header mit cURL sendet.
Den Body in einer Datei speichern
Standardmäßig streamt cURL die Antwort zur Standardausgabe. Um sie stattdessen in eine Datei zu schreiben, verwenden Sie -o mit einem Dateinamen Ihrer Wahl oder -O, um den Remote-Dateinamen aus der URL zu übernehmen:
# write to a name you pick curl -o page.html https://httpbin.org/html # keep the remote filename curl -O https://httpbin.org/image/png
Verwenden Sie -O für Downloads, bei denen der Server die Datei bereits sinnvoll benennt, und -o, wenn Sie kontrollieren möchten, wo die Bytes landen. Fügen Sie -s (silent) hinzu, um den Fortschrittsbalken zu unterdrücken, wenn Sie skripten, und -f (fail), damit cURL bei HTTP-Fehlern einen Nicht-Null-Exit-Code zurückgibt, anstatt fröhlich eine Fehlerseite zu speichern.
Header und Status sehen, nicht nur den Body
Beim Debugging ist der Body oft der uninteressanteste Teil. cURL gibt Ihnen mehrere Möglichkeiten, die Response-Metadaten zu inspizieren. -i fügt die Response-Header dem Body voran, -I sendet eine HEAD-Anfrage und zeigt nur die Header, und -D - schreibt die Header in ein Ziel (hier steht - für die Standardausgabe), während der Body dorthin geht, wohin -o ihn sendet:
# body with headers on top curl -i https://httpbin.org/get # headers only (HEAD request) curl -I https://httpbin.org/get # headers to stdout, body to a file curl -D - -o body.html https://httpbin.org/html
Greifen Sie auf -I zurück, wenn Sie nur Metadaten interessieren, wie Content-Type, Content-Length, Caching-Header oder die Statuszeile, ohne die gesamte Payload herunterzuladen. Das ist der schnelle Weg, um zu prüfen, ob eine Ressource existiert oder von welchem Typ sie ist, bevor Sie sich zum Abrufen verpflichten.
Weiterleitungen folgen
Server antworten auf eine GET-Anfrage häufig mit einer 301- oder 302-Weiterleitung, die auf eine andere Adresse verweist. cURL folgt Weiterleitungen nicht von sich aus, daher gibt eine einfache Anfrage gegen eine weiterleitende URL die kurze Redirect-Antwort zurück, nicht die endgültige Seite. Fügen Sie -L (location) hinzu, damit cURL der Weiterleitung zu ihrem Ziel folgt:
curl -L "https://httpbin.org/redirect-to?url=https://httpbin.org/get"
Ohne -L erhalten Sie die Weiterleitung selbst; damit erhalten Sie den Inhalt unter der endgültigen URL. Wenn Sie begrenzen möchten, wie vielen Hops cURL folgt, fügen Sie --max-redirs mit einer Zahl hinzu, damit eine Weiterleitungsschleife nicht ewig laufen kann.
Den Statuscode und das Timing ausgeben
Bei Health-Checks und Skripten möchten Sie oft nur eine einzige Information, wie den HTTP-Statuscode oder die Dauer der Anfrage, nicht die gesamte Antwort. Das Flag -w (write-out) gibt nach der Übertragung ausgewählte Variablen aus. Kombinieren Sie es mit -o /dev/null, um den Body zu verwerfen, und -s, um still zu bleiben:
# just the status code curl -s -o /dev/null -w "%{http_code}\n" https://httpbin.org/get # status plus total time in seconds curl -s -o /dev/null \ -w "status=%{http_code} time=%{time_total}s\n" \ https://httpbin.org/get
Der erste Befehl gibt so etwas wie 200 und nichts weiter aus, was perfekt für eine Shell-Bedingung oder einen Monitoring-Cron-Job ist. Weitere nützliche -w-Variablen sind %{size_download}, %{num_redirects} und %{url_effective}, wobei letztere praktisch ist, um zu sehen, wo eine Kette von Weiterleitungen tatsächlich endet.
JSON-API-Antworten verarbeiten
Viele GET-Endpunkte geben JSON zurück. Um zu signalisieren, dass Sie JSON möchten, setzen Sie den Accept-Header, und um das Ergebnis komfortabel zu lesen, leiten Sie cURLs Ausgabe in jq weiter, den Befehlszeilen-JSON-Prozessor. jq gibt die Payload formatiert aus und ermöglicht es Ihnen, Felder mit einer kleinen Abfragesprache auszuwählen:
# pretty-print the whole JSON response curl -s -H "Accept: application/json" https://httpbin.org/get | jq . # pull a single field out of the response curl -s https://httpbin.org/get | jq '.headers["User-Agent"]'
Das Flag -s ist beim Pipen wichtig: Es entfernt den Fortschrittsbalken, sodass nur sauberes JSON jq erreicht. Von dort aus können Sie genau die Werte extrahieren, die Sie benötigen, was cURL plus jq zu einem schnellen, skriptfähigen API-Client macht, ohne eine einzige Zeile Programmcode zu schreiben.
Verbose-Modus zum Debuggen
Wenn sich eine Anfrage auf eine Weise verhält, die Sie nicht erklären können, zeigt -v (verbose) die vollständige Kommunikation: die DNS- und TLS-Einrichtung, die genaue Anfragezeile und Header, die cURL gesendet hat (mit > vorangestellt), und den Antwortstatus und die Header, die es empfangen hat (mit < vorangestellt):
curl -v https://httpbin.org/get
Die Verbose-Ausgabe ist der schnellste Weg, Fragen zu beantworten wie "Wurde mein Header tatsächlich gesendet?" oder "Wohin geht diese Weiterleitung?" Wenn Sie die rohen Bytes für einen Fehlerbericht erfassen müssen, schreibt --trace-ascii trace.txt ein noch detaillierteres Protokoll in eine Datei.
Denken Sie an GET-Anfragen in zwei Schichten. Die erste ist was zu senden: die URL, Query-Parameter und Header. Die zweite ist was zu sehen: der Body, die Header, der Statuscode und das Timing. Fast jedes cURL-Flag oben gehört zu einer dieser beiden Schichten, was die lange Optionsliste viel leichter beherrschbar macht.
Wo ein reines GET nicht mehr ausreicht
Eine GET-Anfrage ist das Fundament des Web-Scrapings: Eine Seite abzurufen ist im Kern nichts anderes als ein GET zu senden und das zurückkommende HTML zu lesen. Bei statischen Seiten und freundlichen APIs erledigt cURL allein die Aufgabe. Die Grenzen zeigen sich, sobald Sie es auf moderne kommerzielle Seiten richten. Zwei Einschränkungen tauchen schnell auf.
Erstens ruft cURL das rohe HTML ab und nichts weiter. Es führt kein JavaScript aus, daher liefert jede Seite, die ihren Inhalt im Browser aufbaut, cURL eine nahezu leere Shell. Zweitens achten Seiten, die keine Bots möchten, auf scraper-ähnlichen Traffic: Ein Standard-User-Agent, eine Datacenter-IP und ein Anfrageburst von einer Adresse werden oft mit einem CAPTCHA herausgefordert oder blockiert, bevor Sie überhaupt etwas Nützliches gesammelt haben. Sie können einen Teil davon durch das Rotieren von IPs und das selbst Rendern von Seiten überbrücken. Lesen Sie cURL für Web-Scraping und wie man cURL mit einem Proxy verwendet für diese Techniken, aber eine Headless-Browser-Flotte und einen gesunden Proxy-Pool zu unterhalten wird schnell zum Großteil der Arbeit.
Wenn ein einfaches GET auf JavaScript-Rendering oder Anti-Bot-Sperren trifft, vereint die Crawling API Rendering, Residential-IP-Rotation und CAPTCHA-Handling in einer Anfrage. Sie senden ein GET mit Ihrem Token und der Ziel-URL, die Seite wird hinter einer vertrauenswürdigen IP gerendert und fertiges HTML zum Parsen zurückgegeben. Die gleichen cURL-Kenntnisse übertragen sich direkt. Starten Sie zuerst mit dem kostenlosen Tarif.
Da die API ein normales GET entgegennimmt, überträgt sich Ihr vorhandenes cURL-Wissen direkt darauf. Sie rufen ihren Endpunkt mit zwei Query-Parametern auf, Ihrem Token und der gewünschten URL, und das gerenderte HTML kommt im Response-Body zurück:
curl -G https://api.crawlbase.com/ \ --data-urlencode "token=YOUR_CRAWLBASE_TOKEN" \ --data-urlencode "url=https://www.example.com"
Dies ist dasselbe -G-plus---data-urlencode-Muster von früher, weshalb es wichtig ist, die Kodierung richtig zu machen: Die Ziel-URL ist selbst ein Wert im Query-String, muss also sauber kodiert werden. Tauschen Sie das JavaScript-Token gegen das normale aus, wenn das Ziel clientseitig rendert, und die API führt die Seite in einem echten Browser aus, bevor sie das HTML zurückgibt.
Wichtigste Erkenntnisse
-
GET ist der Standard.
curl URLsendet ein GET, daher geben Sie die Methode für einen einfachen Abruf nie an;-X GETist optional. -
Parameter auf zwei Arten. Setzen Sie sie in Anführungszeichen in die URL oder bauen Sie sie mit
-Gund-d, und verwenden Sie--data-urlencodeimmer dann, wenn ein Wert Leerzeichen oder Sonderzeichen enthält. -
Kontrollieren Sie, was Sie sehen.
-Hsetzt Header,-ound-Ospeichern den Body,-i,-Iund-Dzeigen Header, und-wgibt den Statuscode und das Timing aus. -
Folgen und inspizieren. Fügen Sie
-Lhinzu, um Weiterleitungen zu folgen, leiten Sie JSON injqweiter und verwenden Sie-v, wenn Sie den gesamten Austausch debuggen müssen. - Die Grenzen kennen. Ein reines GET kann kein JavaScript rendern und wird bei Skalierung blockiert; die Crawling API nimmt dieselbe GET-Form an und gibt gerendertes, entsperrtes HTML zurück.
Häufig gestellte Fragen
Muss ich die Methode angeben, um eine GET-Anfrage mit cURL zu senden?
Nein. cURL verwendet standardmäßig GET, daher sendet curl https://example.com bereits eine GET-Anfrage. Sie können es als curl -X GET https://example.com ausschreiben, wenn Sie explizit sein möchten, aber das ändert nichts bei einem normalen Abruf. Sie benötigen -X nur, wenn Sie eine andere Methode möchten, beispielsweise -X POST oder -X DELETE.
Wie übergebe ich Query-Parameter in einer cURL-GET-Anfrage?
Auf zwei Arten. Setzen Sie sie direkt in Anführungszeichen in die URL, wie curl 'https://example.com/data?a=1&b=2', oder lassen Sie cURL den Query-String aufbauen mit curl -G -d "a=1" -d "b=2" https://example.com/data. Beide senden dieselbe Anfrage. Wenn ein Wert Leerzeichen, Ampersands oder andere Sonderzeichen enthält, wechseln Sie die -d-Flags zu --data-urlencode, damit cURL sie korrekt kodiert.
Wie sehe ich nur den HTTP-Statuscode?
Verwenden Sie das Write-Out-Flag bei gleichzeitigem Verwerfen des Body: curl -s -o /dev/null -w "%{http_code}\n" https://example.com. Das -s blendet den Fortschrittsbalken aus, -o /dev/null verwirft den Response-Body, und -w "%{http_code}\n" gibt nur den numerischen Status aus. Das ist der Standard-Einzeiler für Health-Checks und Shell-Bedingungen.
Warum folgt cURL einer Weiterleitung nicht?
cURL folgt Weiterleitungen nur, wenn Sie darum bitten. Wenn ein Server eine 301 oder 302 zurückgibt, zeigt eine einfache Anfrage diese kurze Redirect-Antwort statt des Ziels. Fügen Sie -L (oder --location) hinzu und cURL folgt der Weiterleitung zur endgültigen URL. Verwenden Sie --max-redirs, um zu begrenzen, wie vielen Hops es folgt.
Wie rufe ich JSON von einer API mit cURL ab und lese es?
Setzen Sie den Accept-Header und leiten Sie die Ausgabe in jq weiter. Zum Beispiel gibt curl -s -H "Accept: application/json" https://example.com/api | jq . die Payload formatiert aus, und jq '.field' extrahiert einen bestimmten Wert. Das Flag -s hält den Fortschrittsbalken aus der Pipeline, damit nur sauberes JSON jq erreicht.
Kann ich eine JavaScript-lastige Seite mit einem cURL-GET scrapen?
Nicht direkt. cURL ruft das rohe HTML ab, führt aber kein JavaScript aus, sodass Seiten, die Inhalte im Browser rendern, nahezu leer zurückkommen, und Anti-Bot-Systeme blockieren Standard-cURL-Traffic schnell. Um solche Ziele zu verarbeiten, senden Sie das GET über einen Rendering-Dienst wie die Crawling API, die die Seite in einem echten Browser hinter einer rotierenden Residential-IP ausführt und das fertige HTML zum Parsen zurückgibt.
Crawlen Sie jede Website im großen Maßstab, ohne gegen die Infrastruktur zu kämpfen.
Crawlbase übernimmt Proxys, Fingerprints und CAPTCHAs, damit Ihr Team Datenpipelines ausliefert, statt Crawl-Infrastruktur zu pflegen. 1.000 Anfragen kostenlos, keine Karte erforderlich.
