cURL est le moyen le plus rapide d'extraire une page web depuis un terminal. Il gère HTTP, HTTPS, FTP et bien d'autres protocoles, il est disponible sur presque toutes les machines que vous utiliserez, et il fait exactement une chose bien : envoyer une requête et vous restituer la réponse brute. Cela fait de cURL pour le web scraping un premier outil naturel, que vous sondiez un point de terminaison manuellement, prototypiez une requête avant d'écrire du vrai code, ou l'intégriez en une ligne dans un script shell.
Ce guide est une présentation pratique en ligne de commande. Vous allez récupérer une page, l'enregistrer sur disque, suivre des redirections, définir des en-têtes et un User-Agent, envoyer des cookies, transmettre des données de formulaire et JSON, router via un proxy, et lire le code de statut HTTP. Nous verrons ensuite où cURL seul atteint ses limites (pages rendues par JavaScript et blocages anti-bot) et comment obtenir du HTML complet via la Crawling API et le Smart AI Proxy de Crawlbase sans quitter le terminal.
Pourquoi utiliser cURL pour le scraping
La plupart des scripts de scraping finissent en Python ou Node, alors pourquoi commencer en ligne de commande ? Parce que cURL est le chemin le plus court entre « je me demande ce que renvoie cette URL » et une réponse. Rien à installer, aucun script à écrire, pas de dépendances à gérer. Vous tapez une commande et voyez les octets exacts que le serveur a envoyés, en-têtes compris. Quand un scraper se comporte mal, reproduire la requête dans cURL est la façon la plus rapide de déterminer si le problème vient de votre code ou du serveur.
cURL est aussi composable. Comme il écrit la sortie brute sur stdout, vous pouvez la diriger directement vers un parseur, un grep, ou un fichier, et itérer sur une liste d'URLs en quelques lignes de bash. Pour les petits travaux, ce modèle suffit souvent. Pour les plus grands, cURL reste l'outil vers lequel vous vous tournez pour déboguer la requête avant de passer à l'échelle.
Récupérer une page avec une requête GET
Le scrape le plus simple possible est un GET brut. Pointez cURL sur une URL et il affiche le corps de la réponse dans votre terminal.
curl https://example.com
Par défaut, cURL effectue une requête GET, il n'y a donc aucun indicateur à ajouter. Le HTML inonde votre terminal, ce qui convient pour un coup d'œil rapide, mais pas pour quelque chose de plus volumineux. Les étapes suivantes concernent le contrôle de cette sortie : l'enregistrer, réduire le bruit et lire les métadonnées autour du corps. Pour un approfondissement du côté requête, voir comment envoyer des requêtes GET avec cURL.
Enregistrer la réponse dans un fichier
Deux indicateurs gèrent l'enregistrement. Utilisez -o pour écrire dans un nom de fichier que vous choisissez, ou -O (O majuscule) pour conserver le nom de fichier distant de l'URL.
# Write the body to a named file curl -o page.html https://example.com # Keep the remote filename (saves as report.pdf) curl -O https://example.com/files/report.pdf
Enregistrer sur disque est la base de tout scrape par lots : récupérer une fois, analyser plus tard, et éviter de solliciter à nouveau le serveur pendant que vous affinez votre logique d'extraction. Cela conserve aussi une copie brute que vous pouvez comparer lorsque le balisage d'une page change sous vos pieds.
Suivre les redirections avec -L
Par défaut, cURL ne suit pas les redirections. Si une URL renvoie un 301 ou 302, vous obtenez la réponse de redirection elle-même, pas la page vers laquelle elle pointe, ce qui est une raison classique pour laquelle un scrape revient vide. L'indicateur -L demande à cURL de suivre l'en-tête Location jusqu'à la destination finale.
curl -L https://example.com/old-path
La plupart des sites en production redirigent HTTP vers HTTPS, normalisent les slashs finaux ou déplacent des pages, donc -L est un indicateur que vous voudrez presque toujours activer. Si vous avez besoin d'inspecter une chaîne de redirections plutôt que de la suivre aveuglément, omettez -L et lisez directement la ligne de statut et l'en-tête Location.
Définir un User-Agent et d'autres en-têtes
cURL s'annonce avec un User-Agent comme curl/8.4.0, que de nombreux sites signalent immédiatement comme un non-navigateur. Envoyer un User-Agent réaliste est l'en-tête le plus précieux que vous puissiez définir. Utilisez -H pour ajouter n'importe quel en-tête, ou l'indicateur dédié -A pour le User-Agent.
# Set a browser-like User-Agent with -A curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" https://example.com # Add multiple headers with repeated -H flags curl https://example.com \ -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)" \ -H "Accept-Language: en-US,en;q=0.9" \ -H "Referer: https://www.google.com/"
Des en-têtes réalistes font passer votre requête pour celle d'un navigateur plutôt que d'un script. Un jeu d'en-têtes sensé par défaut comprend un User-Agent courant, une paire Accept et Accept-Language, et parfois un Referer. Pour le tableau complet de quels en-têtes comptent et pourquoi, voir comment envoyer des en-têtes HTTP avec cURL.
Envoyer et stocker des cookies
Certaines pages nécessitent une session avant de renvoyer du contenu : un cookie de consentement, une sélection de région, ou un état connecté. cURL gère les cookies avec deux indicateurs. Utilisez -b pour envoyer des cookies et -c pour enregistrer les cookies définis par un serveur dans un fichier (un cookie jar) afin qu'une requête ultérieure puisse les réutiliser.
# Send a cookie inline curl -b "consent=1; region=us" https://example.com # First request: save cookies the server sets into a jar curl -c cookies.txt https://example.com/start # Second request: replay the saved cookies curl -b cookies.txt https://example.com/dashboard
Le modèle enregistrer-puis-rejouer permet à un flux en deux étapes de fonctionner depuis la ligne de commande : accéder à la page d'entrée pour collecter les cookies, puis les porter dans la page voulue. Vous pouvez combiner -b et -c dans une seule requête pour à la fois charger et mettre à jour le jar au fur et à mesure que la session évolue.
Envoyer des données de formulaire et JSON via POST
Le scraping n'est pas toujours un GET. Les formulaires de recherche, les filtres et les API attendent souvent un POST. L'indicateur -d envoie des données et bascule implicitement la méthode vers POST. Par défaut, il envoie des données encodées en formulaire ; définissez Content-Type: application/json pour envoyer un corps JSON.
# Form-encoded POST (application/x-www-form-urlencoded) curl -d "query=laptops&page=2" https://example.com/search # JSON POST: set the method and content type explicitly curl -X POST https://example.com/api/search \ -H "Content-Type: application/json" \ -d '{"query": "laptops", "page": 2}'
Pour les données de formulaire, séparez les champs avec & comme le ferait un navigateur. Pour JSON, encadrez le corps entre guillemets simples pour que le shell laisse les guillemets doubles intacts, et envoyez toujours le Content-Type correspondant, sinon le serveur pourrait rejeter ou mal lire le contenu. Appeler directement une API JSON de cette façon est souvent plus propre que de scraper le HTML rendu, lorsque le point de terminaison est disponible.
Router cURL via un proxy
Scraper depuis une seule IP à volume entraîne la limitation ou le blocage de cette IP. Router via un proxy place une adresse différente devant votre requête. L'indicateur -x définit le proxy, avec des identifiants optionnels user:pass@.
# Plain HTTP proxy curl -x http://proxy.example.com:8080 https://example.com # Authenticated proxy curl -x http://user:[email protected]:8080 https://example.com
Un seul proxy statique ne fait que déplacer le problème vers une nouvelle IP. Ce qui maintient un vrai scrape en vie, c'est la rotation sur de nombreuses adresses pour qu'aucune ne dépasse une limite. Les mécanismes complets pour pointer cURL vers un proxy, y compris SOCKS et les points de terminaison rotatifs, sont couverts dans comment utiliser cURL avec un proxy.
Mode silencieux, mode verbeux, et lecture du code de statut
Pour les scripts, vous voulez généralement que cURL soit silencieux, sauf quand quelque chose se casse, auquel cas vous voulez tout voir. L'indicateur -s supprime la jauge de progression ; -v affiche la requête et la réponse complètes, en-têtes inclus, ce qui est précieux pour déboguer un blocage. Pour lire uniquement le code de statut HTTP, utilisez un modèle de sortie.
# Silent: no progress meter, just the body curl -s https://example.com -o page.html # Verbose: see the full request/response exchange curl -v https://example.com # Print only the HTTP status code, discard the body curl -s -o /dev/null -w "%{http_code}\n" https://example.com
Cette dernière commande est un cheval de bataille : elle jette le corps, n'affiche que le code de statut, et fournit un signal clair pour qu'un script puisse s'orienter. Un 200 signifie continuer ; un 403 ou 429 signifie que vous êtes challengé ou limité et devez vous retirer ou changer de tactique. La lecture des codes de statut est ce qui distingue une exécution saine d'une exécution bloquée.
Diriger cURL vers un parseur
cURL récupère ; il ne parse pas. La réponse Unix consiste à diriger sa sortie vers un outil qui le fait. Pour une extraction rapide de champ, dirigez vers grep ou un court one-liner Python ; pour un vrai requêtage HTML, un outil comme htmlq (sélecteurs CSS en ligne de commande) est difficile à battre.
# Grab the <title> with grep curl -s https://example.com | grep -o '<title>[^<]*</title>' # Parse properly with htmlq (CSS selectors) curl -s https://example.com | htmlq 'h1' --text # Hand the HTML to Python for structured extraction curl -s https://example.com | python3 -c \ "import sys; from bs4 import BeautifulSoup; \ print(BeautifulSoup(sys.stdin.read(), 'html.parser').title.text)"
Regex avec grep convient pour un champ ponctuel, mais est fragile sur du vrai balisage ; passez à un parseur HTML-aware dès que la structure devient imbriquée. Le pipe Python évolue naturellement vers un script BeautifulSoup complet une fois que votre extraction dépasse un seul sélecteur.
Boucler sur une liste d'URLs en bash
Une URL, c'est un test ; un scrape, c'est une liste. Une courte boucle bash lit les URLs depuis un fichier, récupère chacune, vérifie le statut et enregistre les bonnes. Ménager un délai entre les requêtes évite de surcharger le serveur.
while read url; do slug=$(echo "$url" | md5sum | cut -c1-8) code=$(curl -s -L -o "out_$slug.html" -w "%{http_code}" "$url") echo "$code $url" sleep 2 done < urls.txt
Ce modèle couvre un terrain surprenant : un fichier d'URLs, une récupération par URL, les redirections suivies, le statut journalisé, la sortie enregistrée sous un nom stable, et une pause de deux secondes entre les accès. Ajustez sleep à la tolérance de la cible, et vous avez un crawler poli et redémarrable en six lignes.
Où cURL seul atteint ses limites
cURL est un client HTTP, pas un navigateur. Cette distinction est toute l'histoire de l'endroit où il cesse de fonctionner pour le scraping moderne, et elle se manifeste de deux façons.
Il ne peut pas exécuter JavaScript. cURL récupère le HTML brut que le serveur envoie, rien de plus. Sur un site rendu côté client (la plupart des applications React, Vue et Angular), ce HTML initial est une coquille presque vide ; le contenu réel est peint par des scripts qui s'exécutent dans un navigateur. cURL ne les exécute jamais, donc vous obtenez le squelette sans aucune donnée. Aucun indicateur ne corrige cela, car il n'y a pas de moteur JavaScript à activer.
Il se fait bloquer. Même sur les pages rendues côté serveur, les systèmes anti-bot lisent la requête : une IP de datacenter, un User-Agent manquant ou par défaut, pas d'ensemble d'en-têtes de type navigateur, et pas d'empreinte TLS correspondant à un vrai navigateur. cURL brut échoue à la plupart de ces vérifications et se voit attribuer un 403, un CAPTCHA, ou une page leurre silencieuse. Vous pouvez masquer une partie de cela avec des en-têtes et un proxy, mais sur les cibles difficiles c'est une course aux armements perdante. Le plan de jeu complet se trouve dans comment scraper des sites web sans se faire bloquer.
Un scrape fonctionnel d'un site moderne nécessite deux choses à la fois : un navigateur qui rende réellement la page, et une IP que le site perçoit comme un vrai visiteur. cURL ne fournit ni l'un ni l'autre. Vous pouvez assembler vous-même un navigateur headless plus un pool de proxies résidentiels rotatifs, mais maintenir cette infrastructure en bonne santé représente l'essentiel du travail. La section suivante regroupe les deux dans un seul appel cURL.
Obtenir du HTML complet avec la Crawling API
La façon la plus propre de continuer à utiliser cURL tout en résolvant le rendu et le blocage est d'appeler la Crawling API de Crawlbase depuis la ligne de commande. Vous passez votre token et l'URL cible ; l'API récupère la page derrière une IP résidentielle de confiance et renvoie le HTML. Ajoutez &javascript=true et elle rend d'abord la page dans un vrai navigateur, de sorte que le contenu côté client est présent dans ce que vous récupérez.
# Static fetch through the Crawling API curl "https://api.crawlbase.com/?token=YOUR_TOKEN&url=https://example.com" # JavaScript-rendered fetch for client-side pages curl "https://api.crawlbase.com/?token=YOUR_JS_TOKEN&javascript=true&url=https://example.com"
L'URL que vous souhaitez scraper est placée dans le paramètre url et doit être encodée en URL si elle contient sa propre chaîne de requête. Utilisez votre token normal pour les pages statiques et le token JavaScript avec javascript=true pour les pages rendues. Comme la réponse est simplement du HTML sur stdout, toutes les techniques de pipe et d'analyse vues précédemment s'appliquent toujours : redirigez-le dans un fichier, dirigez-le vers htmlq, ou remettez-le à un parseur Python. Vous conservez le flux de travail cURL et externalisez les problèmes de rendu et d'IP.
cURL brut se fait bloquer et ne peut pas exécuter JavaScript. La Crawling API prend votre token et une URL, récupère la page derrière une IP résidentielle rotative, la rend optionnellement dans un vrai navigateur, et renvoie le HTML complet sur stdout, pour qu'il s'intègre directement dans vos pipes et boucles cURL existants. Commencez sur le niveau gratuit et conservez le même flux de travail en ligne de commande.
Router cURL via le Smart AI Proxy
Si vous préférez conserver votre propre logique de requête et seulement changer le chemin réseau, le Smart AI Proxy (également appelé AI Proxy) vous offre des IPs résidentielles rotatives derrière un seul point de terminaison proxy. C'est un remplacement direct pour l'indicateur -x que vous connaissez déjà, de sorte que votre commande cURL existante change à peine.
curl -x http://YOUR_TOKEN:@smartproxy.crawlbase.com:8012 -k \ https://example.com
Ici, votre token est le nom d'utilisateur du proxy (le mot de passe est laissé vide), et chaque requête via le point de terminaison est automatiquement rotée sur le pool résidentiel. L'indicateur -k demande à cURL d'accepter l'interception TLS du proxy. C'est le bon choix quand votre scraper est déjà construit autour de cURL ou du support proxy d'une bibliothèque et que vous n'avez besoin que de la rotation IP, plutôt que d'un rendu complet côté serveur. Pour les pages rendues côté client, préférez la Crawling API avec javascript=true.
Points clés
-
cURL est l'outil de récupération et de débogage le plus rapide. Un
curl URLbrut affiche la réponse ;-o/-Ol'enregistre,-Lsuit les redirections, et-s/-vcontrôlent le bruit. -
Les en-têtes et les cookies vous font passer pour un navigateur. Définissez un vrai User-Agent avec
-Aou-H, et utilisez-b/-cpour envoyer et stocker des cookies au fil d'une session. -
POST et proxies couvrent le reste des bases.
-denvoie des données de formulaire ou JSON (avec le bonContent-Type), et-xroute via un proxy. -
Pipe et boucle pour monter en charge. Dirigez la sortie de cURL vers
grep,htmlq, ou Python, et encapsulez une boucle bash avec vérification de statut et espacement sur une liste d'URLs. -
cURL brut ne peut pas rendre le JS et se fait bloquer. Appelez la Crawling API (ajoutez
javascript=truepour les pages rendues) ou routez via le Smart AI Proxy pour obtenir du HTML complet tout en conservant le flux de travail cURL.
Foire aux questions
Peut-on utiliser cURL pour le web scraping ?
Oui. cURL effectue des requêtes HTTP et renvoie la réponse brute, que vous pouvez enregistrer dans un fichier ou diriger vers un parseur comme grep, htmlq, ou un script Python. Il est excellent pour les pages statiques rendues côté serveur et pour déboguer des requêtes. Ses limites sont qu'il ne peut pas exécuter JavaScript et est facilement bloqué par les systèmes anti-bot, donc pour les sites rendus côté client ou protégés, vous le combinez avec un service de rendu et de proxy.
Pourquoi cURL renvoie-t-il une page vide ou partielle ?
En général, l'une de deux raisons. Soit le site est rendu côté client, de sorte que le contenu réel est peint par JavaScript que cURL n'exécute jamais et vous n'obtenez que la coquille HTML, soit le site a détecté une requête non-navigateur et a servi une page de blocage ou leurre. Vérifiez le code de statut avec -w "%{http_code}" : un 200 sans données pointe vers le rendu JavaScript, tandis qu'un 403 ou 429 pointe vers un blocage.
Comment définir un User-Agent dans cURL ?
Utilisez l'indicateur -A avec une chaîne ressemblant à un navigateur, par exemple curl -A "Mozilla/5.0 (...)" https://example.com, ou définissez-le comme en-tête avec -H "User-Agent: ...". L'identifiant par défaut curl/x.y.z révèle immédiatement que la requête n'est pas un navigateur, donc un User-Agent réaliste est le premier en-tête à corriger quand une page vous bloque.
Comment envoyer des données POST avec cURL ?
Utilisez -d, qui envoie les données et bascule automatiquement la méthode vers POST. Par défaut, il envoie des données encodées en formulaire (-d "a=1&b=2"). Pour JSON, ajoutez -H "Content-Type: application/json" et passez le corps en tant que chaîne JSON entre guillemets simples pour que le shell ne déforme pas les guillemets.
Comment utiliser un proxy avec cURL ?
Utilisez l'indicateur -x : curl -x http://host:port https://example.com, en ajoutant user:pass@ avant le host pour un proxy authentifié. Un seul proxy statique ne change votre IP qu'une fois ; pour scraper à volume, vous avez besoin d'une rotation sur de nombreuses IPs, ce qu'un service comme le Smart AI Proxy fournit derrière un seul point de terminaison.
Comment scraper des pages lourdes en JavaScript avec cURL ?
Vous ne pouvez pas le faire avec cURL seul, car cURL n'a pas de moteur JavaScript et n'exécute jamais les scripts qui rendent le contenu. La solution pratique est d'appeler un service de rendu depuis cURL : envoyez l'URL à la Crawling API avec javascript=true et elle rend la page dans un vrai navigateur, puis renvoie le HTML complet sur stdout, où votre pipe et parsing cURL habituels fonctionnent toujours.
Crawlez n'importe quel site à grande échelle, sans combattre l'infrastructure.
Crawlbase gère les proxies, les empreintes et les CAPTCHA afin que votre équipe livre des pipelines de données au lieu de maintenir la plomberie de crawl. 1 000 requêtes gratuites, sans carte requise.
