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:
- envía peticiones más rápido de lo que cualquier persona podría hacer clic,
- repite la misma ruta sin ninguna pausa,
- llega desde una dirección de centro de datos en lugar de una red doméstica,
- envía cabeceras que no coinciden con las de un navegador habitual, o
- no conserva cookies ni estado de sesión entre peticiones.
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:
- ¿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.
- **¿Permite el
robots.txtesa ruta?** Si no, sáltala. No resuelvas un captcha en una página que te pidieron dejar en paz. - ¿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.
- ¿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.
- ¿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
- No rotes muchas direcciones IP para evitar los límites de un sitio. Eso es evasión, y convierte una petición de ir más despacio en una pelea.
- No scrapees páginas tras un inicio de sesión con credenciales que no estás autorizado a usar.
- No resuelvas captchas para crear cuentas, publicar spam o comprar artículos limitados.
Scrapea de forma responsable
- Lee el
robots.txtdel sitio y sus términos de servicio antes de empezar. Respeta las rutas no permitidas y cualquier retardo de rastreo indicado. - Identifica tu bot de forma honesta en el User-Agent, con una forma de contactarte.
- Mantén bajo el ritmo de peticiones. Un captcha suele ser el sitio pidiéndote que vayas más despacio.
- Detente si el sitio te lo pide, y no sigas trabajando alrededor de un bloqueo del que te han avisado.
- Gestiona los datos personales según las normas de privacidad que te apliquen, y recopila solo lo que necesitas.