Casos de Uso

Eliminación de sitios web protegidos por CAPTCHA

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
Los comentarios están deshabilitados para este artículo.