Explicado
Un navegador headless es un navegador normal (Chrome, Firefox, WebKit) que se ejecuta sin ventana visible, exponiendo una API programática para navegación, interacción con el DOM y renderizado. Ejecuta JavaScript, aplica CSS, gestiona cookies y se comporta de forma indistinguible de un navegador normal: la única diferencia es que no hay ventana de interfaz de usuario ni entrada humana.
Para el scraping, los navegadores headless son necesarios cuando los datos que se desean obtener se renderizan en el lado del cliente mediante JavaScript. Las aplicaciones web modernas (SPAs de React, Vue, Angular) a menudo devuelven una estructura HTML vacía que se rellena después de que se ejecuta el JS; un cliente HTTP simple como `requests` o `axios` solo vería la estructura vacía. Un navegador headless ejecuta el ciclo de vida completo de la página y le proporciona el DOM completamente renderizado.
Los principales drivers son Playwright (Microsoft, multi-navegador), Puppeteer (Google, Chrome/Firefox) y Selenium (basado en WebDriver, más antiguo, con mayor soporte de lenguajes). Cada uno ofrece métodos para navegar, hacer clic, escribir, esperar elementos, interceptar solicitudes de red y extraer contenido. Para trabajos de automatización que necesitan parecer humanos, los navegadores headless combinados con plugins de sigilo y proxies residenciales son el stack estándar.
Cómo funciona
Cuando lanza un navegador headless mediante Playwright, Puppeteer o Selenium, el driver inicia un proceso real de Chromium (o Firefox/WebKit) con el flag `--headless` y se conecta a él a través de un protocolo de depuración (Chrome DevTools Protocol para Playwright/Puppeteer, WebDriver para Selenium). Su script envía comandos a través de ese protocolo: `page.goto`, `page.click`, `page.evaluate`, y el navegador los ejecuta como si un usuario humano lo estuviera controlando.
El navegador gestiona todo lo que hace un navegador real: handshake TLS (con su propia huella digital), negociación HTTP/2 o HTTP/3, almacenamiento de cookies, ejecución de JavaScript, maquetación, pintado, solicitudes de red para subrecursos. Su script puede interceptar cualquiera de ellos, modificar solicitudes y respuestas, inyectar scripts y extraer datos del DOM renderizado.