Scarnox · Blog

Cómo scrapear un sitio protegido por Cloudflare (guía 2026)

Cloudflare está delante de una gran parte de la web pública, así que un scraper que funciona en un sitio a menudo chocará con un muro en el siguiente. Normalmente lo notas como un HTTP 403 o 503, una página intersticial de "Just a moment...", o un checkbox de Turnstile en la página. Esta guía explica qué comprueba Cloudflare, las soluciones que funcionan sin tocar nada que no debas tocar, y dónde encaja la resolución de captchas. La respuesta corta: confirma que puedes scrapear el sitio, ve más despacio, envía peticiones que parezcan las de un cliente normal, usa un navegador real cuando la página necesite JavaScript, y solo entonces trata un captcha. Turnstile es el captcha que Cloudflare usa con más frecuencia. El soporte de Turnstile en Scarnox llegará pronto. El tipo de captcha activo hoy es PopularCaptcha.

Qué comprueba Cloudflare

Cloudflare puntúa cada petición según varias señales:

Una puntuación alta pasa en silencio. Una puntuación media recibe un desafío interactivo. Una puntuación baja recibe un bloqueo. La mayor parte del trabajo consiste en subir tu puntuación comportándote como un cliente bien educado, no en pelearte con la comprobación.

Paso 1: comprueba que puedes scrapear el sitio

Antes de cualquier trabajo técnico, lee el robots.txt del sitio y sus términos de servicio. Un bloqueo suele ser el propietario diciéndote algo. Scrapear páginas públicas despacio y con un propósito claro es una cosa. Forzar el paso de un bloqueo para llegar a datos que el propietario ha restringido es otra, y es un uso que Scarnox no soporta. La visión general legal cubre las preguntas generales.

Paso 2: haz bien la petición básica

Muchos scrapers que parecen "bloqueados" simplemente envían malas peticiones. Corrige primero estas:

import random
import time
import requests

session = requests.Session()
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                  "(KHTML, like Gecko) Chrome/124.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
})

def polite_get(url: str, attempts: int = 4) -> requests.Response:
    r = None
    for attempt in range(attempts):
        r = session.get(url, timeout=30)
        if r.status_code not in (429, 503):
            return r
        # Retroceso exponencial con variación: unos 1, 2, 4 segundos más ruido.
        time.sleep(2 ** attempt + random.uniform(0, 1))
    return r

Si con esto consigues pasar, ya está. Mantén el retardo.

Paso 3: averigua a qué desafío te enfrentas

La respuesta te dice mucho:

Comprobar cuál de estos ves te ahorra mucho esfuerzo inútil.

Paso 4: usa un navegador real cuando la página lo necesite

Si la página solo muestra contenido después de que se ejecute JavaScript, un cliente HTTP simple nunca lo verá. Controla un navegador completo con Playwright o Selenium. Un navegador headless es detectable, así que lee detección de navegadores headless antes de depender de uno, y configúralo para que coincida con el entorno en el que estaría un visitante real. La guía de sitios con JavaScript muestra un ejemplo completo.

Paso 5: revisa la reputación de tu IP

Las direcciones de los centros de datos en la nube son la razón más común por la que una petición limpia recibe una puntuación baja. Las direcciones residenciales suelen puntuar mejor, a costa de más velocidad y más dinero. El compromiso se explica en proxies residenciales frente a datacenter.

La rotación tiene sus propias trampas. Cambiar la dirección en cada petición resulta poco natural, porque un visitante real mantiene una dirección durante toda su visita. Las sesiones fijas, en las que se mantiene una dirección para un conjunto de peticiones relacionadas, suelen funcionar mejor que la rotación rápida. Proxies rotatorios para scraping entra en los detalles.

Paso 6: dónde encaja la resolución de captchas

A veces el widget sí aparece, en un formulario que estás probando o en una página que tienes permiso para automatizar. Un token de Turnstile es entonces un paso obligatorio de ese flujo. El soporte de Turnstile en Scarnox llegará pronto, así que no construyas código de producción sobre él todavía. El tipo de captcha activo hoy es PopularCaptcha, que usa un widget distinto.

El flujo general para cualquier captcha basado en tokens es el mismo. Lees la sitekey de la página, solicitas un token y colocas el token en el campo del formulario que espera el sitio. Los tokens son de vida corta, así que envíalos en cuanto los tengas. La guía de PopularCaptcha en Python muestra ese flujo de principio a fin, y tipos de captcha explicados compara los widgets con los que te encontrarás.

Si quieres estar listo cuando llegue el soporte de Turnstile, puedes empezar una prueba gratuita ahora. Empieza con crédito de prueba gratis, sin tarjeta: crea una cuenta. Para las tarifas actuales del tipo de captcha activo, consulta la página de precios.

Scrapea de forma responsable

Próximos pasos