Cómo solucionar el error "Enable JavaScript and cookies to continue"
Este mensaje no es un error de tu código, sino una protección activa de Cloudflare (o similar, como Incapsula/Imperva) que bloquea la solicitud porque detecta que el cliente no cumple con los requisitos mínimos de seguridad: JavaScript habilitado y cookies aceptadas.
🔍 Causa técnica
Cloudflare implementa un desafío de "JavaScript Challenge" para distinguir entre navegadores reales y bots/scraper automatizados. Cuando una solicitud HTTP no incluye:
- Ejecución de JavaScript (para validar el desafío)
- Almacenamiento y reenvío de cookies (
cf_clearance)
...el servidor responde con esta página intermedia en lugar de servir el contenido real.
Esto ocurre comúnmente en:
- Requests automatizados (Python
requests,curl, etc.) - Configuraciones de proxies sin soporte JS
- Navegadores headless mal configurados
- Pruebas con herramientas como Selenium sin manejo de cookies
✅ Solución definitiva (3 enfoques)
🔧 Opción 1: Usa un navegador real (recomendado para scraping)
Con Selenium (Python):
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
driver = webdriver.Chrome(options=options)
driver.get("https://tu-sitio.com")
# Espera a que Cloudflare resuelva el desafío (hasta 10s)
import time
time.sleep(10)
# Ahora sí tienes acceso al contenido real
html = driver.page_source
⚠️ Clave: No uses
driver.get()y luegotime.sleep(0)— Cloudflare requiere tiempo para ejecutar su JS y establecer la cookiecf_clearance.
🧪 Opción 2: Simula el desafío manualmente (avanzado)
Si insistes en usar requests, debes:
- Hacer una petición inicial para obtener el HTML del desafío
- Extraer y ejecutar el script JS de validación (con
execjs) - Generar la cookie
cf_clearanceválida - Reintentar la petición con cookies y headers correctos
Ejemplo simplificado con cloudscraper (Python):
pip install cloudscraper
import cloudscraper
scraper = cloudscraper.create_scraper(
browser={
'browser': 'firefox',
'platform': 'windows',
'mobile': False
}
)
response = scraper.get("https://tu-sitio.com")
print(response.text) # Ahora sí obtienes el contenido real
✅
cloudscrapermaneja internamente el desafío JS y cookies.
🛠️ Opción 3: Configura Cloudflare (si eres el dueño del sitio)
Si tú controlas el servidor:
- Accede al panel de Cloudflare → Security → WAF
- Busca la regla "JavaScript Challenge"
- Desactiva el desafío para tu IP o rango (solo para desarrollo)
- O usa "Under Attack Mode" solo temporalmente
🚫 No recomendado en producción: debilita la protección DDoS.
💡 Pro-tip
-
Nunca confíes en
time.sleep()fijo para esperar desafíos: usaWebDriverWaitcon condiciones explícitas. - Si usas headless, añade:
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--no-sandbox")
options.add_argument("--disable-gpu")
- Cloudflare cambia sus desafíos frecuentemente:
cloudscrapery Selenium son las soluciones más robustas a largo plazo.
✅ Verificación final: Si la respuesta HTTP es
200 OKpero el contenido contiene<span id="challenge-error-text">, aún no has superado el desafío. Revisa cookies y headers.
Top comments (0)