Navegador headless detectado: causas y soluciones (2026)
Un sitio muestra "navegador headless detectado", o sirve discretamente otra página a tu navegador automatizado. Los sitios hacen esto porque un navegador headless se ejecuta sin ventana y a menudo se diferencia de un navegador de escritorio normal en pequeños detalles medibles. Esta guía explica qué señales miran los sitios, cómo diagnosticar lo que expone tu propio navegador y cómo es una solución sensata. También cubre el punto en el que la respuesta correcta es parar, o tratar la comprobación como un paso de captcha.
Por qué los sitios comprueban los navegadores headless
Los frameworks de automatización controlan un motor de navegador real, así que la mayor parte de la página funciona igual. Las diferencias aparecen en los bordes:
- Marcas de automatización. Los navegadores controlados por herramientas de automatización han expuesto históricamente una propiedad
navigator.webdrivercon el valortrue, y algunos frameworks dejan otras huellas en la página. - Funciones del navegador ausentes o extrañas. Un build headless puede no informar de plugins, mostrar una lista de idiomas poco habitual o un tamaño de ventana que no coincide con una pantalla real.
- Diferencias de renderizado. La salida de Canvas y WebGL puede diferir entre un entorno headless y uno con interfaz, sobre todo en un servidor sin GPU.
- Tiempos. Los clics y las cargas de página automatizados a menudo siguen un ritmo que ninguna persona produciría.
- Comportamiento de red. Las cabeceras de la petición, su orden y el handshake TLS pueden delatar a un cliente que no es un navegador.
Los sitios combinan estas señales en una puntuación. Una puntuación baja puede significar una degradación silenciosa, un conjunto de comprobaciones adicionales o un bloqueo.
Paso 1: mira qué expone tu navegador
Antes de cambiar nada, mira qué puede leer una página desde tu automatización. El script siguiente abre una página que controlas e imprime las señales que importan. Es un diagnóstico: úsalo en tus propias páginas de prueba, no para sondear los sistemas de otras personas.
from playwright.sync_api import sync_playwright
CHECK = """() => ({
webdriver: navigator.webdriver,
languages: navigator.languages,
plugins: navigator.plugins.length,
userAgent: navigator.userAgent,
screen: [screen.width, screen.height],
viewport: [window.innerWidth, window.innerHeight],
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
})"""
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://example.com") # cambia por una página que sea tuya
print(page.evaluate(CHECK))
browser.close()
Ejecuta el mismo script con headless=False y compara las dos salidas. Las diferencias son las cosas que un sitio podría notar.
Paso 2: corrige las incoherencias, no solo las marcas
Ocultar una marca y dejar las demás sin cambios es el error más común. Un user agent que dice Windows mientras las fuentes, la zona horaria y el tamaño de pantalla describen un servidor Linux es una señal más fuerte que una sola propiedad. Busca un entorno internamente coherente:
- Usa un navegador con interfaz cuando puedas, o un modo headless que coincida con un navegador de escritorio actual.
- Configura un viewport y un idioma que encajen entre sí.
- Mantén la zona horaria y la configuración regional coherentes con la dirección IP que usas.
- Reutiliza un mismo perfil y sus cookies para una misma identidad, en lugar de empezar desde cero en cada ejecución.
Playwright permite configurar varios de estos valores en un solo lugar:
context = browser.new_context(
locale="en-US",
timezone_id="America/New_York",
viewport={"width": 1366, "height": 768},
)
page = context.new_page()
Paso 3: ve más despacio y actúa como un visitante
La automatización se hace obvia cuando va más rápido de lo que puede ir una persona. Añade pausas realistas entre cargas de página, evita hacer clic en el mismo elemento con un ritmo perfecto y no abras cientos de páginas en paralelo desde una misma dirección. Hacer menos peticiones, y más lentas, también reduce la carga sobre el sitio, que es lo correcto de todas formas.
Paso 4: sabe cuándo la comprobación es un captcha
Algunos flujos de detección terminan en un desafío en lugar de en un bloqueo. Verás un widget de captcha, y ese paso necesita un token de un solver. El tipo de captcha activo en Scarnox hoy es PopularCaptcha. La guía de PopularCaptcha en Python muestra cómo se solicita y se envía el token. Otros widgets, como Cloudflare Turnstile, están en la hoja de ruta pero aún no están activos, así que consulta tipos de captcha explicados antes de planificar en torno a uno.
Que haya un paso de captcha no significa que el resto de tu configuración sea correcta. Si el mismo sitio bloquea cada sesión headless sin importar cómo la configures, es una señal clara de que el propietario no quiere acceso automatizado. Respétalo.
Qué no hacer
No intentes ocultar la automatización a un sitio que la prohíbe, y no uses herramientas de evasión de detección para saltarte controles de acceso. Eso es un tipo de proyecto distinto de las pruebas y la recopilación de datos públicos que cubre esta guía. Si tu proyecto necesita un acceso que no te han concedido, pide permiso al propietario del sitio o busca una API oficial o un feed de datos.
Scrapea de forma responsable
- Revisa el
robots.txty los términos del sitio antes de automatizarlo. - Mantén los ritmos de petición bajos y guarda en caché las páginas que ya has descargado.
- Trata un bloqueo como una respuesta, no como un rompecabezas que hay que rodear.
- No recopiles datos personales sin una base legal para hacerlo.
Dónde seguir
Si tu automatización es para pruebas end-to-end, el enfoque es diferente: consulta captcha en pruebas automatizadas. Si usas una configuración de Playwright o Puppeteer, gestión de captcha con Playwright y Puppeteer explica dónde va el token.
Empieza con crédito de prueba gratis, sin tarjeta: crea una cuenta y prueba el flujo de PopularCaptcha en tu propia página. Para ver las tarifas actuales, consulta la página de precios.