La mayoría de los sitios web de alto valor utilizan CAPTCHA como parte de su defensa anti-bot. Esta guía cubre estrategias para eliminar estos sitios de manera confiable utilizando CaptchaAI, incluido cómo identificar tipos de CAPTCHA, resolverlos automáticamente y crear raspadores resistentes.
Implementaciones comunes de CAPTCHA
| CAPTCHA | Donde se usa | Método CaptchaAI |
|---|---|---|
| reCAPTCHA v2 | Formularios de inicio de sesión, páginas de búsqueda | method=userrecaptcha |
| reCAPTCHA v3 | Puntuación de fondo en cualquier página. | method=userrecaptcha&version=v3 |
| Cloudflare Turnstile | Sitios detrás de Cloudflare | method=turnstile |
| Cloudflare Challenge | Bloque Cloudflare de página completa | method=cloudflare_challenge |
| Imagen/OCR CAPTCHA | Sitios heredados, Amazon | method=base64 |
| hCaptcha | Sitios centrados en la privacidad | method=hcaptcha |
Estrategia 1: detectar y resolver bajo demanda
El enfoque más confiable: extraer normalmente y resolver los CAPTCHA solo cuando aparecen:
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")
Estrategia 2: detección anticipada de páginas CAPTCHA conocidas
Si sabes qué páginas siempre tienen CAPTCHA, resuelve de forma preventiva:
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
Estrategia 3: sitios protegidos por Cloudflare
Los sitios detrás de Cloudflare a menudo requieren una cookie qa_validation_cookie:
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 "qa_validation_cookie" in result.text:
# Parse qa_validation_cookie and user_agent from response
return result.text
raise TimeoutError()
Patrón de raspado de varias 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
Solución de problemas
| Problema | Solución |
|---|---|
| CAPTCHA aparece en cada página | Utilice representantes; reducir la tasa de solicitudes |
| Token rechazado después de resolver | Es posible que el token haya caducado; utilizar dentro de 120 s |
| Cloudflare bloquea a pesar de la autorización | Utilice el mismo proxy y agente de usuario para todas las solicitudes |
| El sitio devuelve una página diferente después de resolverla | Compruebe si hay redireccionamientos o cookies adicionales |
Preguntas frecuentes
¿Qué sitios son más difíciles de eliminar?
Los sitios que utilizan Cloudflare Enterprise, PerimeterX o Akamai Bot Manager son más complejos. Trabaja solo con autorización, registra los errores y valida la integración CAPTCHA antes de escalar cualquier flujo.
¿Puedo eliminar sitios que requieren iniciar sesión?
Sí. Inicie sesión primero (resolviendo cualquier CAPTCHA de inicio de sesión), mantenga las cookies de sesión y luego elimine las páginas autenticadas. CaptchaAI maneja CAPTCHA en cualquier etapa.
¿Cómo manejo las páginas renderizadas en JavaScript?
Utilice Selenium, Puppeteer o Playwright para representar JavaScript, luego extraiga los parámetros CAPTCHA y resuélvalo mediante CaptchaAI. VerManejo de CAPTCHA de selenio.
Guías relacionadas
- Cómo manejar los desafíos de CAPTCHA en flujos de trabajo de web scraping
- Problemas con CAPTCHA del navegador sin cabeza
- Explicación de la detección de CAPTCHA en scraping