Explicado
Um headless browser é um navegador normal (Chrome, Firefox, WebKit) que roda sem uma janela visível, expondo uma API programática para navegação, interação com o DOM e renderização. Ele executa JavaScript, aplica CSS, lida com cookies e se comporta de forma indistinguível de um navegador comum; a única diferença é que não há janela de UI nem entrada humana.
Para scraping, headless browsers são necessários sempre que os dados que você deseja são renderizados no lado do cliente por JavaScript. Aplicações web modernas (SPAs de React, Vue, Angular) costumam retornar um shell HTML vazio que é preenchido após a execução do JS; um cliente HTTP simples como `requests` ou `axios` veria apenas o shell vazio. Um headless browser executa o ciclo de vida completo da página e entrega o DOM totalmente renderizado.
Os principais drivers são Playwright (Microsoft, multi-navegador), Puppeteer (Google, Chrome/Firefox) e Selenium (baseado no WebDriver mais antigo, com o suporte mais amplo a linguagens). Cada um oferece métodos para navegar, clicar, digitar, aguardar elementos, interceptar requisições de rede e extrair conteúdo. Para trabalhos de automação que precisam parecer humanos, headless browsers combinados com plugins stealth e proxies residenciais formam o stack padrão.
Como Funciona
Quando você inicia um navegador headless via Playwright/Puppeteer/Selenium, o driver inicia um processo real do Chromium (ou Firefox/WebKit) com a flag `--headless` e se conecta a ele por meio de um protocolo de depuração (Chrome DevTools Protocol para Playwright/Puppeteer, WebDriver para Selenium). Seu script envia comandos por esse protocolo (`page.goto`, `page.click`, `page.evaluate`) e o navegador os executa como se um usuário humano estivesse no controle.
O navegador cuida de tudo o que um navegador real faz: handshake TLS (com sua própria fingerprint), negociação de HTTP/2 ou HTTP/3, armazenamento de cookies, execução de JavaScript, layout, renderização (paint) e solicitações de rede para sub-recursos. Seu script pode interceptar qualquer uma dessas etapas, modificar solicitações/respostas, injetar scripts e extrair dados do DOM renderizado.