Sans KYC — pas d’ID, pas de selfie, pas de documents. Payer en crypto : BTC, USDT, USDC, ETH, SOL, LTC
Langue: Français
Commencez

Guide · crawl responsable · 2026

403, 429 et CAPTCHA : répondre, ne pas contourner

Un 403, un 429 ou un CAPTCHA signifie qu'un site s'adresse à votre crawler. La bonne réponse est presque toujours de ralentir, lire les règles ou demander ; la mauvaise est de déguiser le crawler. Voici comment intégrer la bonne réponse dans le code.

Dernière mise à jour: · 7 min de lecture

Réponse rapide

Comment un scraper doit-il gérer les réponses 403, 429 et CAPTCHA ?

Considérez-les comme des signaux, pas des obstacles. Sur un 429, attendez Retry-After et réduisez votre fréquence sur cet hôte. Sur un 403, réessayez une fois après une pause, puis arrêtez-vous et vérifiez les règles du site. Sur un CAPTCHA, stoppez cet hôte : ne le résolvez pas automatiquement. CrawlRelay proxies résidentiels, disponibles chez 0,50 $US/GB, répartissent la charge et définissent la localisation ; ils ne contournent pas la décision d'un site. Sans KYC. Payer en crypto.

Les trois signaux en un coup d’œil

429 Trop de RequêtesVous êtes trop rapide. Respectez Retry-After, reculez, réduisez la concurrence par hôte
403 ForbiddenCette requête est refusée. Un réessai après pause, puis arrêt et vérification
CAPTCHA ou page de défiLe site veut vérifier que vous êtes humain. Arrêtez l'hôte et ralentissez
Norme pour règles de crawlrobots.txt, RFC 9309 ; Crawl-delay est une extension courante
Ce que nous ne supportons pasRésolution de CAPTCHA, plugins furtifs, usurpation d'empreinte

Que signifie chaque signal pour mon crawler ?

  • 429 est le plus poli : le contenu est disponible mais pas à votre rythme. RFC 6585 le définit, souvent avec un en-tête Retry-After indiquant quand revenir.
  • 403 est un refus de cette requête. Cela peut être corrigible (mauvais pays, en-têtes manquants, trop rapide) ou définitif (le site interdit l'accès automatisé à ce contenu).
  • Un CAPTCHA ou une page de défi, souvent accompagnés d’un statut 403 ou 503, signifient que la gestion des bots du site doute de votre trafic. C’est une escalade : l’étape après avoir ignoré les 429.

Ces trois signaux augmentent. Les sites voyant leurs 429 ignorés passent aux 403, aux défis, puis à des blocages longs sur des plages IP, ce qui pénalise tous les utilisateurs de ces plages.

Que doit faire mon crawler pour chaque signal ?

SignalPremière réponseSi ça continueArrêtez quand
429Attendez Retry-After ou baissez exponentiellement avec jitterDivisez par deux la concurrence sur cet hôteRetry-After grandit ou les 429 persistent en requêtant une à une
403Un réessai après pause, même paysComparez avec un navigateur du même pays ; contrôlez robots.txt et les conditionsUn second 403 sur le même pattern d’URL
CAPTCHA / défiMettez l'hôte en pause plusieurs minutesReprenez à un rythme bien inférieurLe défi revient même à faible rythme : le site interdit l’accès automatisé
503 avec Retry-AfterAttendez comme demandéMettez en pause l'hôteLa plupart des requêtes échouent plus de quelques minutes

Comment construire un crawler qui répond correctement ?

Mettez les règles dans le fetcher, pas dans chaque spider. Celui-ci envoie une requête à la fois par hôte, respecte robots.txt et son Crawl-delay, attend Retry-After, et stoppe un hôte après trois refus consécutifs. Il traite un 4xx robots.txt comme une permission et un 5xx comme un refus total, conformément au RFC 9309.

Python : un fetcher poli
import time
import urllib.robotparser
from urllib.parse import urlsplit

import requests

PROXY = "http://USERNAME-country-us:[email protected]:7777"
USER_AGENT = "ExampleCrawler/1.0 (+https://example.com/crawler-info)"


class PoliteFetcher:
    """One request at a time per host; robots.txt, Crawl-delay and Retry-After honoured."""

    def __init__(self, min_interval=1.0, max_refusals=3):
        self.min_interval, self.max_refusals = min_interval, max_refusals
        self.http = requests.Session()
        self.http.proxies = {"http": PROXY, "https": PROXY}
        self.http.headers["User-Agent"] = USER_AGENT
        self.robots, self.next_time, self.refusals = {}, {}, {}

    def _robots(self, root):
        if root not in self.robots:
            rp = urllib.robotparser.RobotFileParser(root + "/robots.txt")
            try:
                r = self.http.get(root + "/robots.txt", timeout=(10, 30))
                if r.status_code >= 500:
                    rp.parse(["User-agent: *", "Disallow: /"])  # unreachable: assume disallow
                else:
                    rp.parse(r.text.splitlines() if r.status_code == 200 else [])  # 4xx: allowed
            except requests.RequestException:
                rp.parse(["User-agent: *", "Disallow: /"])
            self.robots[root] = rp
        return self.robots[root]

    def get(self, url):
        scheme, host = urlsplit(url)[:2]
        if self.refusals.get(host, 0) >= self.max_refusals:
            return None  # this host said no: stop asking
        rp = self._robots("%s://%s" % (scheme, host))
        if not rp.can_fetch(USER_AGENT, url):
            return None
        delay = max(self.min_interval, rp.crawl_delay(USER_AGENT) or 0)
        wait = self.next_time.get(host, 0) - time.monotonic()
        if wait > 0:
            time.sleep(wait)
        r = self.http.get(url, timeout=(10, 30))
        pause = delay
        if r.status_code in (429, 503):
            retry_after = r.headers.get("Retry-After", "")
            pause = max(delay, int(retry_after) if retry_after.isdigit() else 60)
        refused = r.status_code in (403, 429) or "captcha" in r.text[:5000].lower()
        self.refusals[host] = self.refusals.get(host, 0) + 1 if refused else 0
        self.next_time[host] = time.monotonic() + pause
        return r


fetcher = PoliteFetcher()
resp = fetcher.get("https://example.com/")
print(resp.status_code if resp is not None else "skipped")

Qu'est-ce qui corrige légitimement un 403 ?

Plusieurs causes de 403 sont de votre côté, et y remédier est légitime :

  • Mauvais pays. Beaucoup de sites ciblent une région. Ciblez le pays avec un -country-<code>.
  • En-têtes incomplets. Envoyez Accept, Accept-Language et un user agent honnête avec URL de contact. Un user agent ressemblant à un navigateur sur un client HTTP basique est incohérent et souvent refusé.
  • Votre rythme. Un 403 qui arrive après N requêtes est un problème de fréquence ; ralentissez.

Ce qui n’est pas une correction : changer de user agent pour simuler plusieurs personnes, usurper les empreintes du navigateur, ou changer d’IP pour contourner un blocage volontaire du site. Si un site filtre des plages d’hébergement pour interdire le trafic automatisé, un IP résidentiel ne rend pas cet accès autorisé.

Pourquoi ne pas simplement résoudre les CAPTCHA ?

Parce qu'un CAPTCHA est une question posée par le site à laquelle vous répondriez faussement. La résolution automatisée transforme un crawler respectueux en un outil conçu pour contourner un contrôle d'accès, ce qui augmente votre risque juridique : les affaires américaines de 2026 sur le scraping de recherche, Google contre SerpApi et Reddit contre SerpApi, entre autres, reposent sur des allégations selon lesquelles les défendeurs ont contourné un système anti-bot en vertu de la règle anti-contournement du DMCA. Les tribunaux n'ont pas tranché la question, mais le risque est réel.

CrawlRelay ne supporte pas la résolution de CAPTCHA ni l’évasion de détection de bot, et sa Politique d’Utilisation Acceptable les interdit à travers la passerelle. Si vous avez besoin de données protégées par un défi, demandez l'accès au site, utilisez son API, ou obtenez une licence pour les données.

Quand devrais-je contacter le site à la place ?

Quand vous avez besoin de plus que ce que ses paramètres par défaut permettent. De nombreux sites offrent une API, un flux de données, un programme partenaire ou simplement une limite plus élevée pour un crawler qui s'identifie et explique son but. Mettez une URL de contact dans votre user agent, gardez une page qui décrit votre crawler et comment se désinscrire, et répondez rapidement aux rapports d'abus. Un crawler que l'on peut joindre reçoit des avertissements avant les blocages.

403, 429 et CAPTCHA : questions

Les proxies résidentiels empêchent-ils les CAPTCHA ?

Ne comptez pas dessus. Un proxy résidentiel change l'adresse IP vue par un site, pas ce que fait votre crawler : les CAPTCHA causés par votre rythme ou comportement restent, et c'est fait pour ça. Si les défis continuent à un faible taux de requêtes, le site ne veut pas d'accès automatisé à ce contenu.

Combien de temps devrais-je attendre après un 429 sans Retry-After ?

Commencez par quelques secondes et doublez le temps d'attente après chaque nouveau 429, avec un supplément aléatoire et un plafond d'environ une minute. Quand les requêtes réussissent à nouveau, reprenez à un rythme plus bas que celui qui a causé le 429, et augmentez-le lentement tant que le taux d'erreur reste stable.

Est-il permis de faire tourner les IP pour éviter les limites de débit ?

La rotation répartit la charge entre les sorties et vous permet de choisir des emplacements, ce qui est normal. Utiliser la rotation pour rester sous une limite par IP tout en maintenant un rythme que le site a refusé est une forme d'évasion. La plupart des conditions d’utilisation l’interdisent, tout comme notre Politique d’Utilisation Acceptable.

Quel user agent mon scraper doit-il envoyer ?

Le vôtre : un nom, une version et une URL expliquant le crawler et comment vous contacter, comme ExampleCrawler/1.0 (+https://example.com/crawler-info). N’utilisez pas les noms d’autres crawlers comme Googlebot ou GPTBot.

Sources (4)
  1. RFC 9309 : Protocole d’exclusion des robots — IETF (2022-09)
  2. RFC 6585 : Codes d’état HTTP additionnels (429) — IETF (2012-04)
  3. Reddit contre SerpApi LLC — Loeb & Loeb (2026-08)
  4. Google contre SerpApi : le tribunal a accepté notre requête en rejet — SerpApi (2026-07-21)

Proxies résidentiels pour crawlers respectueux

1,50 $US pour 1 GB, 0,50 $US/GB à partir de 50 GB.

À partir de 0,50 $US/GB · sans KYC

Commencez