Navegador headless detectado: causas e soluções (2026)
Um site exibe "headless browser detected", ou serve discretamente uma página diferente para o seu navegador automatizado. Os sites fazem isso porque um navegador headless roda sem janela e, muitas vezes, se diferencia de um navegador de desktop comum em pequenos detalhes mensuráveis. Este guia explica quais sinais os sites observam, como diagnosticar o que o seu próprio navegador está expondo e como é uma correção sensata. Também cobre o ponto em que a resposta certa é parar, ou tratar a verificação como uma etapa de captcha.
Por que os sites verificam navegadores headless
Ferramentas de automação controlam um motor de navegador real, então a maior parte da página funciona do mesmo jeito. As diferenças aparecem nas bordas:
- Flags de automação. Navegadores controlados por ferramentas de automação historicamente expõem a propriedade
navigator.webdrivercom valortrue, e alguns frameworks deixam outros rastros na página. - Recursos do navegador ausentes ou estranhos. Um build headless pode não informar plugins, uma lista de idiomas incomum ou um tamanho de janela que não corresponde a uma tela real.
- Diferenças de renderização. A saída de canvas e WebGL pode variar entre um ambiente headless e um com interface, principalmente em um servidor sem GPU.
- Tempo. Cliques automatizados e carregamentos de página costumam ter um ritmo que nenhuma pessoa produziria.
- Comportamento de rede. Os cabeçalhos da requisição, a ordem deles e o handshake TLS podem denunciar um cliente que não é um navegador.
Os sites combinam esses sinais em uma pontuação. Uma pontuação baixa pode significar um rebaixamento silencioso, um conjunto de verificações extras ou um bloqueio.
Passo 1: veja o que o seu navegador expõe
Antes de mudar qualquer coisa, veja o que uma página consegue ler da sua automação. O script abaixo abre uma página que você controla e imprime os sinais que importam. É um diagnóstico: use-o em páginas de teste suas, não para sondar sistemas de terceiros.
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") # substitua por uma página sua
print(page.evaluate(CHECK))
browser.close()
Execute o mesmo script com headless=False e compare as duas saídas. As diferenças são as coisas que um site poderia notar.
Passo 2: corrija as inconsistências, não só as flags
Esconder uma flag e deixar as outras intactas é o erro mais comum. Um user agent que diz Windows, enquanto as fontes, o fuso horário e o tamanho da tela descrevem um servidor Linux, é um sinal mais forte do que uma única propriedade. Busque um ambiente internamente consistente:
- Use um navegador com interface sempre que possível, ou um modo headless que corresponda a um navegador de desktop atual.
- Defina um viewport e um idioma que combinem entre si.
- Mantenha o fuso horário e a localidade consistentes com o endereço IP que você usa.
- Reutilize um perfil e os cookies dele para uma mesma identidade, em vez de começar do zero a cada execução.
O Playwright permite definir vários desses itens em um só lugar:
context = browser.new_context(
locale="en-US",
timezone_id="America/New_York",
viewport={"width": 1366, "height": 768},
)
page = context.new_page()
Passo 3: desacelere e aja como um visitante
A automação fica óbvia quando é mais rápida do que uma pessoa conseguiria ser. Adicione pausas realistas entre os carregamentos de página, evite clicar no mesmo elemento em um ritmo perfeito e não abra centenas de páginas em paralelo a partir de um mesmo endereço. Fazer menos requisições, e mais lentas, também reduz a carga sobre o site, o que de qualquer forma é o certo a fazer.
Passo 4: saiba quando a verificação é um captcha
Alguns fluxos de detecção terminam em um desafio, e não em um bloqueio. Você verá um widget de captcha, e essa etapa precisa de um token de um solver. O tipo de captcha ativo na Scarnox hoje é o PopularCaptcha. O guia de PopularCaptcha em Python mostra como o token é solicitado e enviado. Outros widgets, como o Cloudflare Turnstile, estão no roteiro, mas ainda não estão ativos, então confira tipos de captcha explicados antes de planejar em cima de um deles.
Uma etapa de captcha não significa que o resto da sua configuração está correto. Se o mesmo site bloqueia toda sessão headless, não importa como você a configure, isso é um sinal claro de que o dono não quer acesso automatizado. Respeite isso.
O que não fazer
Não tente esconder a automação de um site que a proíbe, e não use ferramentas de evasão de detecção para passar por controles de acesso. Isso é um tipo de projeto diferente dos testes e da coleta de dados públicos que este guia cobre. Se o seu projeto precisa de um acesso que você não recebeu, peça autorização ao dono do site ou procure uma API oficial ou um feed de dados.
Faça scraping com responsabilidade
- Verifique o
robots.txte os termos do site antes de automatizá-lo. - Mantenha as taxas de requisição baixas e guarde em cache as páginas que você já baixou.
- Trate um bloqueio como uma resposta, não como um quebra-cabeça para contornar.
- Não colete dados pessoais sem uma base legal para isso.
Onde seguir a partir daqui
Se a sua automação serve para testes end-to-end, a abordagem é outra: veja captcha em testes automatizados. Se você usa Playwright ou Puppeteer, tratamento de captcha com Playwright e Puppeteer explica para onde o token vai.
Comece com crédito de teste grátis, sem cartão: crie uma conta e teste o fluxo do PopularCaptcha em uma página sua. Para as tarifas atuais, veja a página de preços.