Scarnox · Blog

Captchas en el web scraping: por qué aparecen y qué hacer

Un captcha aparece durante el scraping cuando un sitio decide que una petición parece automatizada. Los desencadenantes habituales son demasiadas peticiones en poco tiempo, una dirección IP con mala reputación, señales del navegador que faltan, o un acceso a una página que el sitio protege más que el resto. La respuesta práctica tiene tres pasos, en este orden: reducir los desencadenantes, detectar el captcha en el código y resolver el captcha que no puedas evitar. Esta guía cubre cada paso y apunta a las guías detalladas para el resto.

Por qué los sitios muestran captchas a los scrapers

Un sitio tiene poca forma de distinguir a una persona de un script en el momento en que se pide una página, así que se fija en patrones. Un scraper suele destacar porque:

Cualquiera de estas puede bastar. El captcha es la forma que tiene el sitio de pedir un paso parecido al humano antes de servir más páginas. Reducir el patrón suele reducir los captchas, lo cual sale más barato que resolverlos.

Detecta el captcha en el código

Antes de resolver nada, comprueba si la página que recibiste es realmente la página de captcha. Una prueba sencilla busca el marcado del widget y lee la sitekey:

import re
import requests

SITEKEY_RE = re.compile(r'data-sitekey="([0-9a-f-]{36})"')

def fetch(url: str) -> dict:
    resp = requests.get(
        url,
        timeout=30,
        headers={"User-Agent": "ExampleBot/1.0 (+https://example.com/bot)"},
    )
    html = resp.text
    if "h-captcha" in html or "g-recaptcha" in html:
        match = SITEKEY_RE.search(html)
        return {"captcha": True, "sitekey": match.group(1) if match else None, "html": html}
    return {"captcha": False, "sitekey": None, "html": html}

page = fetch("https://example.com/search?q=shoes")
if page["captcha"]:
    print("captcha found, sitekey:", page["sitekey"])

Las cadenas h-captcha y g-recaptcha son solo el marcado que usa una página, así que esto es una señal y no una garantía. Si falta la sitekey, consulta cómo encontrar la sitekey de un captcha.

Resuélvelo cuando no puedas evitarlo

Cuando hay un widget de PopularCaptcha en la página y tienes su sitekey, puedes pedir un token a la API de Scarnox con una sola petición POST y enviarlo en el campo h-captcha-response. La función completa, con gestión de errores, está en resolver un captcha desde Python con una sola petición. Usa el token de inmediato, porque caduca en unos dos minutos. Los detalles de tiempos están en el token de captcha ha caducado.

El soporte activo de Scarnox hoy es PopularCaptcha, sin proxy y con tu propio proxy. reCAPTCHA v2 y v3, Cloudflare Turnstile, GeeTest, AWS WAF y Arkose llegarán pronto. Si tu objetivo usa alguno de esos, las guías de captcha explican las opciones generales, pero no construyas un flujo de producción sobre una resolución que todavía no está activa.

Una decisión para cada página bloqueada

Cuando tu scraper se encuentra con un captcha, un orden de decisión sencillo mantiene el trabajo honesto y el volumen de peticiones bajo:

  1. ¿Hay una fuente de datos que puedas usar en su lugar? Si una API, un feed o una exportación cubre los campos que necesitas, cámbiate a ella y deja de pedir esa página.
  2. **¿Permite el robots.txt esa ruta?** Si no, sáltala. No resuelvas un captcha en una página que te pidieron dejar en paz.
  3. ¿Enviaste demasiado y demasiado rápido? Haz una pausa más larga, reduce tu ritmo y vuelve a comprobar más tarde. Muchos captchas desaparecen con un ritmo más lento.
  4. ¿Es el captcha un tipo activo? Si es PopularCaptcha, se aplica la resolución de esta guía. Si es un tipo que llegará pronto, deja el trabajo en pausa y vigila el lanzamiento.
  5. ¿Es la página una que tienes permiso para automatizar? Si la respuesta no está clara, pregunta al propietario del sitio antes de continuar.

El cuarto paso es el que más se suele saltar. Un solver solo es útil cuando el tipo de captcha está soportado, y un trabajo que reintenta un tipo no soportado malgasta tiempo y peticiones.

Gestiona el captcha dentro de un trabajo, no en un bucle

Pon la resolución dentro del camino de código que necesita el token, para que el trabajo pueda registrar cada captcha, parar cuando una página falle repetidamente y seguir adelante. Un bucle sin límite que sigue pidiendo una página con captcha es la forma más rápida de que el cortafuegos de un sitio bloquee tu dirección para siempre.

Monitoriza lo que falla

Lleva un recuento de las páginas que devuelven un captcha, agrupado por URL y por hora del día. Un captcha que aparece solo en una sección del sitio, o solo después de cierto número de peticiones, te indica dónde está el desencadenante. Esa información es más útil que un solver más rápido, porque te muestra qué cambiar.

Lo que no debes hacer

Scrapea de forma responsable

Próximos pasos