CaptchaNo
[ INTÉGRATION ]

Solveur de captcha pour
Scrapy

Résolvez le défi pendant l'exécution au lieu de faire échouer la tâche. Un exemple Python fonctionnel, et les trois points qui décident si votre token est accepté.

Scrapy · Python
# middlewares.py
import time
import requests

CAPTCHANO_KEY = "cn-YOUR_API_KEY"
HEADERS = {"Authorization": f"Bearer {CAPTCHANO_KEY}"}

def solve(task: dict) -> dict:
    """Block until solved; returns e.g. {"token": "...", "userAgent": "..."}."""
    r = requests.post(
        "https://api.captchano.com/v1/solve",
        params={"wait": 60},
        json=task,
        headers=HEADERS,
        timeout=75,
    )
    data = r.json()
    # A solve can outlast the 60 s wait: poll the task until it finishes.
    while data.get("status") in ("queued", "solving"):
        time.sleep(5)
        data = requests.get(
            f"https://api.captchano.com/v1/task/{data['id']}",
            headers=HEADERS,
            timeout=30,
        ).json()
    if data.get("status") != "ready":
        raise RuntimeError(data.get("error") or data)
    return data["solution"]

class CaptchaNoMiddleware:
    def process_response(self, request, response, spider):
        sitekey = response.css("[data-sitekey]::attr(data-sitekey)").get()
        if not sitekey:
            return response
        solution = solve({"type": "recaptcha_v2", "sitekey": sitekey, "url": response.url})
        return request.replace(
            method="POST",
            body=f"g-recaptcha-response={solution['token']}",
            headers={"Content-Type": "application/x-www-form-urlencoded"},
            dont_filter=True,
        )

Ce qui décide si le token est accepté

  1. Transmettez votre proxy. Le token doit être généré derrière la même IP de sortie que celle qui le soumet. Pour les systèmes qui notent la session, c'est obligatoire, pas une simple optimisation.
  2. Utilisez le même user agent. Turnstile et plusieurs systèmes anti-bot lient le token à un user agent. Nous renvoyons celui utilisé pour que vous puissiez le reproduire exactement.
  3. Demandez-le au dernier moment. Les tokens expirent au bout d'environ 120 secondes. Demandez-en un quand vous êtes prêt à soumettre.

Appel bloquant ou polling

L'exemple utilise ?wait=60 : l'appel renvoie la résolution terminée et votre étape Scrapy reste linéaire. Si vous préférez ne pas garder une connexion ouverte, retirez le paramètre, conservez l'id renvoyé et interrogez GET /v1/task/{id} toutes les cinq secondes. Un token que vous avez payé reste récupérable pendant dix minutes : une connexion interrompue ne vous fait donc pas perdre la résolution.

Coût

$0.00598 par résolution réussie de reCAPTCHA v2, les résolutions échouées n'étant jamais facturées. Consultez les tarifs pour chaque type de défi, ou la référence de l'API pour le format complet des requêtes.

[ INTÉGRATION DANS LE FLUX ]

Comment la résolution s'intègre à Scrapy

Scrapy n'a pas de navigateur : le captcha est donc géré dans un downloader middleware. Détectez le défi dans la réponse, résolvez-le, puis relancez la requête avec le token ou le cookie.

  1. 01
    Détecter dans process_response

    Cherchez un data-sitekey ou une page de défi connue dans le corps de la réponse.

  2. 02
    Résoudre

    Appelez l'API avec la sitekey, response.url et le proxy de request.meta.

  3. 03
    Relancer avec le token

    Retournez une FormRequest contenant le token, ou la requête d'origine avec le cookie obtenu.

  4. 04
    Conserver le cookie jar

    Laissez le middleware de cookies de Scrapy conserver la session validée pour les requêtes suivantes.

Injecter le token dans la page

Le middleware ajoute le token aux données du formulaire ou définit le cookie renvoyé, puis retourne une nouvelle Request.

[ PIÈGES ]

Là où les intégrations échouent le plus souvent

Bloquer le reactor

Un appel HTTP synchrone dans un middleware bloque toutes les requêtes. Utilisez un client asynchrone ou un thread pour la résolution.

Rotation des proxies

Si un middleware de proxy change d'IP à chaque requête, fixez l'IP pour la nouvelle tentative afin qu'elle corresponde à la résolution.

Boucles de nouvelles tentatives

Limitez le nombre de nouvelles tentatives par URL. Une page qui présente un défi à chaque fois vous indique de ralentir.

[ FAQ ]

FAQ captcha Scrapy

Scrapy peut-il résoudre des défis JavaScript ?

Scrapy n'exécute pas de JavaScript. Pour les défis à token, vous n'avez besoin que de la sitekey et de l'URL ; pour les systèmes qui évaluent la session comme DataDome, vous envoyez l'URL du défi et recevez un cookie que Scrapy peut rejouer.

Dois-je plutôt utiliser scrapy-playwright ?

Uniquement si la page a besoin de JavaScript pour afficher son contenu. Pour les captchas à token, l'approche par middleware est plus légère et plus rapide que lancer un navigateur par requête.

Où placer le middleware ?

Après le middleware de proxy et avant le middleware de retry, pour qu'il voie le proxy qui sera utilisé et que ses propres nouvelles tentatives ne soient pas comptées deux fois.

Comment éviter de payer des résolutions répétées ?

Conservez les cookies entre les requêtes et régulez le rythme du crawl. Une session validée le reste souvent sur de nombreuses pages, et vous n'êtes facturé que pour les résolutions réussies.

[ À LIRE ENSUITE ]

Guides utiles

Prêt à développer ?

Commencez par un essai gratuit de 3 jours, puis payez par résolution réussie à mesure que votre trafic augmente. Aucune carte requise pour l'essai.

Voir nos offres
Vous êtes un agent IA ? Voir les options de configuration →