Cas d'Usage

Supprimer des sites Web protégés par CAPTCHA

La plupart des sites Web de grande valeur utilisent des CAPTCHA dans le cadre de leur défense anti-bot. Ce guide couvre les stratégies pour supprimer ces sites de manière fiable à l'aide de CaptchaAI, y compris comment identifier les types CAPTCHA, les résoudre automatiquement et créer des scrapers résilients.

Implémentations courantes de CAPTCHA

CAPTCHA Où utilisé Méthode CaptchaAI
reCAPTCHA v2 Formulaires de connexion, pages de recherche method=userrecaptcha
reCAPTCHA v3 Notation d'arrière-plan sur n'importe quelle page method=userrecaptcha&version=v3
Cloudflare Turnstile Sites derrière Cloudflare method=turnstile
Cloudflare Challenge Bloc Cloudflare pleine page method=cloudflare_challenge
Image/OCR CAPTCHA Sites hérités, Amazon method=base64
hCaptcha Sites axés sur la confidentialité method=hcaptcha

Stratégie 1 : Détecter et résoudre à la demande

L'approche la plus fiable : grattez normalement et résolvez les CAPTCHA uniquement lorsqu'ils apparaissent :

import requests
import time
from bs4 import BeautifulSoup

API_KEY = "YOUR_API_KEY"

class ProtectedScraper:
    def __init__(self):
        self.session = requests.Session()
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
        })

    def scrape(self, url):
        resp = self.session.get(url)

        # Check for CAPTCHA
        if self._has_captcha(resp.text):
            resp = self._handle_captcha(resp.text, url)

        return resp.text

    def _has_captcha(self, html):
        indicators = ["g-recaptcha", "cf-turnstile", "h-captcha", "captcha"]
        return any(ind in html.lower() for ind in indicators)

    def _handle_captcha(self, html, url):
        soup = BeautifulSoup(html, "html.parser")

        # reCAPTCHA v2
        rc = soup.find("div", class_="g-recaptcha")
        if rc:
            token = self._solve_recaptcha(rc["data-sitekey"], url)
            return self.session.post(url, data={"g-recaptcha-response": token})

        # Cloudflare Turnstile
        ts = soup.find("div", class_="cf-turnstile")
        if ts:
            token = self._solve_turnstile(ts["data-sitekey"], url)
            return self.session.post(url, data={"cf-turnstile-response": token})

        raise Exception("Unknown CAPTCHA type")

    def _solve_recaptcha(self, site_key, page_url):
        resp = requests.get("https://ocr.captchaai.com/in.php", params={
            "key": API_KEY, "method": "userrecaptcha",
            "googlekey": site_key, "pageurl": page_url
        })
        return self._poll(resp.text.split("|")[1])

    def _solve_turnstile(self, site_key, page_url):
        resp = requests.get("https://ocr.captchaai.com/in.php", params={
            "key": API_KEY, "method": "turnstile",
            "sitekey": site_key, "pageurl": page_url
        })
        return self._poll(resp.text.split("|")[1])

    def _poll(self, task_id):
        for _ in range(60):
            time.sleep(5)
            result = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": API_KEY, "action": "get", "id": task_id
            })
            if result.text == "CAPCHA_NOT_READY": continue
            if result.text.startswith("OK|"): return result.text.split("|")[1]
            raise Exception(result.text)
        raise TimeoutError()

# Usage
scraper = ProtectedScraper()
html = scraper.scrape("https://example.com/data")

Stratégie 2 : Pré-résoudre les pages CAPTCHA connues

Si vous savez quelles pages contiennent toujours des CAPTCHA, résolvez de manière préventive :

def scrape_known_captcha_page(url, site_key):
    # Solve before even loading the page
    token = solve_recaptcha(site_key, url)

    # Submit directly with token
    resp = requests.post(url, data={
        "g-recaptcha-response": token,
        "query": "search term"
    })
    return resp.text

Stratégie 3 : Sites protégés par Cloudflare

Les sites derrière Cloudflare nécessitent souvent un cookie cf_clearance :

def get_cloudflare_clearance(url, proxy):
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY,
        "method": "cloudflare_challenge",
        "pageurl": url,
        "proxy": proxy,
        "proxytype": "HTTP"
    })
    task_id = resp.text.split("|")[1]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY": continue
        if "cf_clearance" in result.text:
            # Parse cf_clearance and user_agent from response
            return result.text
    raise TimeoutError()

Modèle de grattage multipage

def scrape_multiple_pages(base_url, site_key, pages):
    scraper = ProtectedScraper()
    results = []

    for page in pages:
        url = f"{base_url}?page={page}"
        try:
            html = scraper.scrape(url)
            soup = BeautifulSoup(html, "html.parser")
            items = soup.find_all("div", class_="item")
            results.extend([item.text.strip() for item in items])
            print(f"Page {page}: {len(items)} items")
        except Exception as e:
            print(f"Page {page} failed: {e}")

        time.sleep(random.uniform(2, 5))

    return results

Dépannage

Problème Corriger
CAPTCHA apparaît sur chaque page Utiliser des proxys ; réduire le taux de demande
Jeton rejeté après résolution Le jeton a peut-être expiré ; utiliser dans les 120s
Cloudflare se bloque malgré l'autorisation Utilisez le même proxy et le même agent utilisateur pour toutes les demandes
Le site renvoie une page différente après la résolution Rechercher des redirections ou des cookies supplémentaires

FAQ

Quels sites sont les plus difficiles à gratter ?

Les sites utilisant Cloudflare Enterprise, PerimeterX ou Akamai Bot Manager sont les plus difficiles. CaptchaAI gère leurs composants CAPTCHA ; combinez-le avec des navigateurs furtifs et des proxys pour de meilleurs résultats.

Puis-je supprimer les sites qui nécessitent une connexion ?

Oui. Connectez-vous d'abord (en résolvant tout CAPTCHA de connexion), conservez les cookies de session, puis grattez les pages authentifiées. CaptchaAI gère les CAPTCHA à tout moment.

Comment gérer les pages rendues en JavaScript ?

Utilisez Selenium, Puppeteer ou Playwright pour afficher JavaScript, puis extrayez les paramètres CAPTCHA et résolvez via CaptchaAI. VoirGestion des CAPTCHA au sélénium.

Guides connexes

  • Comment gérer les défis CAPTCHA dans les flux de travail de Web Scraping
  • Problèmes CAPTCHA du navigateur sans tête
  • Détection CAPTCHA dans Scraping expliquée
Les commentaires sont désactivés pour cet article.