Comment scraper un site protégé par Cloudflare (guide 2026)
Cloudflare se trouve devant une grande part du web public, donc un scraper qui fonctionne sur un site se heurtera souvent à un mur sur le suivant. Vous le remarquez généralement par une erreur HTTP 403 ou 503, une page intermédiaire « Just a moment... », ou une case Turnstile sur la page. Ce guide explique ce que Cloudflare vérifie, les solutions qui fonctionnent sans toucher à ce que vous ne devriez pas toucher, et la place de la résolution de captcha dans tout cela. En résumé : vérifiez que vous avez le droit de scraper le site, ralentissez, envoyez des requêtes qui ressemblent à celles d'un client normal, utilisez un vrai navigateur lorsque la page exige JavaScript, et ce n'est qu'ensuite que vous traitez un captcha. Turnstile est le captcha le plus souvent utilisé par Cloudflare. La prise en charge de Turnstile par Scarnox est bientôt disponible. Le type de captcha actuellement disponible est PopularCaptcha.
Ce que vérifie Cloudflare
Cloudflare évalue chaque requête selon plusieurs signaux :
- Réputation de l'IP. Les adresses issues de centres de données cloud partent avec un score plus bas que les adresses de connexions domestiques.
- Rythme et schéma des requêtes. Des centaines de requêtes par seconde depuis une même adresse ressemblent à un bot, quels que soient les en-têtes.
- En-têtes et empreinte TLS. Une bibliothèque HTTP nue envoie souvent des en-têtes, un ordre d'en-têtes et une négociation TLS qu'aucun navigateur courant n'envoie.
- Exécution de JavaScript. La page de défi exécute des scripts et vérifie qu'un vrai environnement de navigateur est présent.
- Cookies. Une fois le défi réussi, Cloudflare émet un cookie de validation lié à cette session.
Un score élevé passe sans rien remarquer. Un score moyen déclenche un défi interactif. Un score bas entraîne un blocage. La plus grande partie du travail consiste à faire monter votre score en vous comportant comme un client bien élevé, et non en combattant la vérification.
Étape 1 : vérifier que vous avez le droit de scraper le site
Avant tout travail technique, lisez le robots.txt du site et ses conditions d'utilisation. Un blocage est souvent le propriétaire qui vous signale quelque chose. Scraper des pages publiques lentement et dans un but clair est une chose. Forcer le passage d'un blocage pour atteindre des données que le propriétaire a restreintes en est une autre, et c'est un usage que Scarnox ne prend pas en charge. L'aperçu juridique couvre les questions générales.
Étape 2 : bien faire la requête simple
De nombreux scrapers qui semblent « bloqués » envoient simplement de mauvaises requêtes. Corrigez d'abord ces points :
- Envoyez un User-Agent à jour et les en-têtes qu'enverrait un navigateur, comme
AcceptetAccept-Language. - Gardez un seul objet de session pour que les cookies persistent entre les requêtes, comme le ferait un navigateur.
- Ajoutez un délai entre les requêtes, avec un peu de gigue aléatoire.
- Reculez sur les réponses
429et503au lieu de réessayer dans une boucle serrée.
import random
import time
import requests
session = requests.Session()
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/124.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
})
def polite_get(url: str, attempts: int = 4) -> requests.Response:
r = None
for attempt in range(attempts):
r = session.get(url, timeout=30)
if r.status_code not in (429, 503):
return r
# Recul exponentiel avec gigue : environ 1, 2, 4 secondes plus du bruit.
time.sleep(2 ** attempt + random.uniform(0, 1))
return r
Si cela vous permet de passer, c'est terminé. Gardez le délai en place.
Étape 3 : identifier le défi auquel vous êtes confronté
La réponse vous en dit beaucoup :
- Une page « Just a moment... ». C'est un défi JavaScript. Un vrai navigateur le passe généralement seul après quelques secondes. Le cookie de validation peut ensuite être réutilisé pour les requêtes suivantes de la même session.
- Un widget Turnstile sur un formulaire ou une page. C'est un captcha. Il faut un jeton issu du widget avant que le formulaire n'accepte l'envoi.
- Une page de blocage avec un code d'erreur. L'adresse ou la requête a été refusée net. Modifier votre rythme et corriger vos requêtes aide généralement davantage que tout le reste. La résolution ne transforme pas un blocage dur en données.
Savoir lequel de ces cas vous rencontrez évite beaucoup d'efforts inutiles.
Étape 4 : utiliser un vrai navigateur lorsque la page en a besoin
Si la page n'affiche son contenu qu'après exécution de JavaScript, un client HTTP simple ne le verra jamais. Pilotez alors un navigateur complet avec Playwright ou Selenium. Un navigateur headless est détectable, donc lisez la détection des navigateurs headless avant de vous y fier, et réglez-le pour qu'il corresponde à l'environnement d'un vrai visiteur. Le guide des sites JavaScript présente un exemple complet.
Étape 5 : surveiller la réputation de votre IP
Les adresses de centres de données cloud sont la cause la plus fréquente d'un score bas pour une requête pourtant propre. Les adresses résidentielles obtiennent généralement de meilleurs scores, au prix d'une vitesse et d'un coût plus élevés. Le compromis est expliqué dans proxys résidentiels ou de datacenter.
La rotation a ses propres pièges. Changer d'adresse à chaque requête semble artificiel, car un vrai visiteur garde une même adresse pendant toute sa visite. Les sessions persistantes, où une même adresse est conservée pour un ensemble de requêtes liées, s'en sortent souvent mieux qu'une rotation rapide. Proxys rotatifs pour le scraping détaille le sujet.
Étape 6 : où se place la résolution de captcha
Le widget apparaît parfois, sur un formulaire que vous testez ou sur une page que vous êtes autorisé à automatiser. Un jeton Turnstile devient alors une étape obligatoire du flux. La prise en charge de Turnstile par Scarnox est bientôt disponible, donc ne construisez pas de code de production dessus pour l'instant. Le type de captcha disponible aujourd'hui est PopularCaptcha, qui utilise un widget différent.
Le workflow général pour tout captcha à jeton est le même. Vous lisez la sitekey dans la page, demandez un jeton, et placez le jeton dans le champ de formulaire attendu par le site. Les jetons ont une durée de vie courte, donc envoyez-les immédiatement. Le guide Python PopularCaptcha montre ce workflow de bout en bout, et les types de captcha expliqués compare les widgets que vous rencontrerez.
Si vous voulez être prêt lorsque la prise en charge de Turnstile sera disponible, vous pouvez commencer un essai gratuit dès maintenant. Commencez avec un crédit d'essai gratuit, sans carte bancaire : créez un compte. Pour les tarifs actuels du type de captcha disponible, consultez la page tarifs.
Scraper de manière responsable
- Lisez le
robots.txtet respectez les conditions d'utilisation du site que vous scrapez. - Limitez le débit de votre crawler, et lancez-le en heures creuses lorsque c'est possible.
- Mettez les réponses en cache pour ne jamais récupérer deux fois la même page sans raison.
- Évitez de collecter des données personnelles sans base légale.
- Si un site a restreint l'accès, arrêtez-vous. N'essayez pas de contourner la restriction.