Captchas et web scraping : pourquoi ils apparaissent et que faire
Un captcha apparaît pendant le scraping lorsqu'un site considère qu'une requête a l'air automatisée. Les déclencheurs habituels sont trop de requêtes en peu de temps, une adresse IP à mauvaise réputation, des signaux de navigateur manquants, ou une requête sur une page que le site protège plus étroitement que le reste. La réponse pratique comporte trois étapes, dans cet ordre : réduire les déclencheurs, détecter le captcha dans le code, et résoudre le captcha que vous ne pouvez pas éviter. Ce guide couvre chaque étape et renvoie vers les guides détaillés pour le reste.
Pourquoi les sites affichent des captchas aux scrapers
Un site a peu de moyens de distinguer une personne d'un script au moment où une page est demandée, il observe donc des schémas. Un scraper se démarque souvent parce qu'il :
- envoie des requêtes plus vite que n'importe quelle personne ne cliquerait ;
- répète le même chemin sans aucune pause ;
- arrive depuis une adresse de datacenter plutôt que d'un réseau domestique ;
- envoie des en-têtes qui ne correspondent pas à un navigateur courant, ou
- ne conserve aucun cookie ni état de session entre les requêtes.
Un seul de ces éléments peut suffire. Le captcha est la façon dont le site demande une étape à la manière humaine avant de servir d'autres pages. Réduire le schéma diminue généralement les captchas, ce qui revient moins cher que de les résoudre.
Détecter le captcha dans le code
Avant de résoudre quoi que ce soit, vérifiez si la page obtenue est bien une page de captcha. Un test simple cherche le balisage du widget et lit la sitekey :
import re
import requests
SITEKEY_RE = re.compile(r'data-sitekey="([0-9a-f-]{36})"')
def fetch(url: str) -> dict:
resp = requests.get(
url,
timeout=30,
headers={"User-Agent": "ExampleBot/1.0 (+https://example.com/bot)"},
)
html = resp.text
if "h-captcha" in html or "g-recaptcha" in html:
match = SITEKEY_RE.search(html)
return {"captcha": True, "sitekey": match.group(1) if match else None, "html": html}
return {"captcha": False, "sitekey": None, "html": html}
page = fetch("https://example.com/search?q=shoes")
if page["captcha"]:
print("captcha found, sitekey:", page["sitekey"])
Les chaînes h-captcha et g-recaptcha ne sont que le balisage qu'utilise une page, donc ce test est un indice et non une garantie. Si la sitekey est absente, voir comment trouver la sitekey d'un captcha.
Résoudre lorsque vous ne pouvez pas l'éviter
Lorsqu'un widget PopularCaptcha est présent sur la page et que vous avez sa sitekey, vous pouvez demander un jeton à l'API Scarnox avec une seule requête POST, et le soumettre dans le champ h-captcha-response. La fonction complète, avec la gestion des erreurs, se trouve dans résoudre un captcha en Python avec une seule requête. Utilisez le jeton immédiatement, car il expire au bout d'environ deux minutes. Les détails de timing sont dans jeton de captcha expiré.
La prise en charge actuelle de Scarnox concerne PopularCaptcha, sans proxy et avec votre propre proxy. reCAPTCHA v2 et v3, Cloudflare Turnstile, GeeTest, AWS WAF et Arkose arrivent bientôt. Si votre cible utilise l'un de ceux-là, les guides sur les captchas expliquent les options générales, mais ne bâtissez pas un flux de production sur une résolution qui n'est pas encore disponible.
Une procédure de décision pour chaque page bloquée
Lorsque votre scraper tombe sur un captcha, un ordre de décision simple garde le travail honnête et limite le volume de requêtes :
- Existe-t-il une source de données que vous pouvez utiliser à la place ? Si une API, un flux ou un export couvre les champs dont vous avez besoin, passez-y et arrêtez de demander cette page.
- **Le
robots.txtautorise-t-il ce chemin ?** Sinon, passez-le. Ne résolvez pas un captcha sur une page dont on vous a demandé de vous écarter. - Avez-vous envoyé trop de requêtes trop vite ? Faites une pause plus longue, baissez votre rythme et revérifiez plus tard. Beaucoup de captchas disparaissent avec un rythme plus lent.
- Le captcha est-il un type disponible ? S'il s'agit de PopularCaptcha, la résolution de ce guide s'applique. S'il s'agit d'un type bientôt disponible, mettez le travail en pause et surveillez la sortie.
- La page est-elle une page que vous avez le droit d'automatiser ? Si la réponse n'est pas claire, demandez au propriétaire du site avant de continuer.
La quatrième étape est celle qu'on oublie le plus souvent. Un solveur n'est utile que si le type de captcha est pris en charge, et un travail qui réessaie un type non pris en charge gaspille du temps et des requêtes.
Gérer le captcha dans une tâche, pas dans une boucle
Placez la résolution dans le chemin de code qui a besoin du jeton, afin que la tâche puisse journaliser chaque captcha, s'arrêter lorsqu'une page échoue en continu, et passer à la suite. Une boucle sans limite qui redemande une page de captcha est le moyen le plus rapide de voir le pare-feu d'un site bloquer votre adresse définitivement.
Surveiller les échecs
Tenez le compte des pages qui renvoient un captcha, regroupées par URL et par heure de la journée. Un captcha qui n'apparaît que sur une section du site, ou seulement après un certain nombre de requêtes, vous indique où se trouve le déclencheur. Cette information est plus utile qu'un solveur plus rapide, car elle vous montre ce qu'il faut modifier.
Ce qu'il ne faut pas faire
- Ne faites pas tourner de nombreuses adresses IP pour éviter les limites d'un site. C'est de l'évasion, et cela transforme une demande de ralentir en bras de fer.
- Ne scrapez pas des pages derrière une connexion avec des identifiants que vous n'êtes pas autorisé à utiliser.
- Ne résolvez pas de captchas pour créer des comptes, publier du spam ou acheter des articles en quantité limitée.
Scraper de manière responsable
- Lisez le
robots.txtet les conditions d'utilisation du site avant de commencer. Respectez les chemins interdits et tout délai d'exploration demandé. - Identifiez honnêtement votre bot dans le User-Agent, avec un moyen de vous contacter.
- Gardez un rythme de requêtes bas. Un captcha est souvent le site qui vous demande de ralentir.
- Arrêtez-vous si le site vous le demande, et ne contournez pas un blocage dont on vous a signalé le caractère contraignant.
- Traitez les données personnelles selon les règles de confidentialité qui vous sont applicables, et ne collectez que ce dont vous avez besoin.