A maioria dos sites de alto valor usa CAPTCHAs como parte de sua defesa anti-bot. Este guia aborda estratégias para raspar esses sites de maneira confiável usando CaptchaAI, incluindo como identificar tipos de CAPTCHA, resolvê-los automaticamente e construir raspadores resilientes.
Implementações comuns de CAPTCHA
| CAPTCHA | Onde usado | Método CaptchaAI |
|---|---|---|
| reCAPTCHA v2 | Formulários de login, páginas de pesquisa | method=userrecaptcha |
| reCAPTCHA v3 | Pontuação em segundo plano em qualquer página | method=userrecaptcha&version=v3 |
| Cloudflare Turnstile | Sites por trás do Cloudflare | method=turnstile |
| Cloudflare Turnstile em staging | Bloco Cloudflare de página inteira | method=turnstile_staging |
| Imagem/OCR CAPTCHA | Sites legados, Amazon | method=base64 |
| hCaptcha | Sites com foco na privacidade | method=hcaptcha |
Estratégia 1: Detectar e resolver sob demanda
A abordagem mais confiável – raspar normalmente e resolver CAPTCHAs somente quando eles aparecerem:
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")
Estratégia 2: Pré-solução para páginas CAPTCHA conhecidas
Se você sabe quais páginas sempre possuem CAPTCHAs, resolva preventivamente:
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
Estratégia 3: Sites protegidos pela Cloudflare
Os sites por trás do Cloudflare geralmente exigem um cookie cookie_qa_validacao:
def get_cloudflare_clearance(url, proxy):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "turnstile_staging",
"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 "cookie_qa_validacao" in result.text:
# Parse cookie_qa_validacao and user_agent from response
return result.text
raise TimeoutError()
Padrão de raspagem de várias páginas
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
Solução de problemas
| Problema | Correção |
|---|---|
| CAPTCHA aparece em todas as páginas | Utilize proxies; reduzir a taxa de solicitação |
| Token rejeitado após resolução | O token pode ter expirado; usar dentro de 120s |
| Cloudflare bloqueia apesar da autorização | Use o mesmo proxy e agente de usuário para todas as solicitações |
| Site retorna página diferente após resolução | Verifique se há redirecionamentos ou cookies adicionais |
Perguntas frequentes
Quais sites são mais difíceis de raspar?
Sites que usam Cloudflare Enterprise, PerimeterX ou Akamai Bot Manager são os mais desafiadores. CaptchaAI lida com seus componentes CAPTCHA; combine com navegadores controle de QAs e proxies para obter mais adequado resultados.
Posso raspar sites que exigem login?
Sim. Faça login primeiro (resolvendo qualquer CAPTCHA de login), mantenha os cookies da sessão e, em seguida, limpe as páginas autenticadas. CaptchaAI lida com CAPTCHAs em qualquer estágio.
Como lidar com páginas renderizadas em JavaScript?
Use Selenium, Puppeteer ou Playwright para renderizar JavaScript, depois extraia os parâmetros CAPTCHA e resolva via CaptchaAI. VerManipulação de selênio CAPTCHA.