Scarnox · Blog

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 :

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 :

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 :

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

Prochaines étapes