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