Browser headless rilevato: cause e soluzioni (2026)
Un sito mostra "headless browser detected", oppure serve in silenzio una pagina diversa al tuo browser automatizzato. I siti lo fanno perché un browser headless gira senza finestra e spesso differisce da un normale browser desktop in piccoli dettagli misurabili. Questa guida spiega quali segnali osservano i siti, come capire cosa espone il tuo browser e che aspetto ha una correzione sensata. Tratta anche il punto in cui la risposta giusta è fermarsi, oppure trattare il controllo come un passaggio captcha.
Perché i siti controllano i browser headless
Gli strumenti di automazione pilotano un vero motore di browser, quindi gran parte della pagina funziona allo stesso modo. Le differenze emergono ai margini:
- Flag di automazione. I browser pilotati da strumenti di automazione hanno storicamente esposto la proprietà
navigator.webdriverimpostata atrue, e alcuni framework lasciano altre tracce nella pagina. - Funzionalità del browser mancanti o anomale. Una build headless può non riportare plugin, un elenco insolito di lingue o una finestra di dimensioni che non corrispondono a uno schermo reale.
- Differenze di rendering. L'output di canvas e WebGL può differire tra un ambiente headless e uno con finestra, soprattutto su un server senza GPU.
- Tempi. I clic e i caricamenti automatici avvengono spesso con un ritmo che nessuna persona produrrebbe.
- Comportamento di rete. Le intestazioni delle richieste, il loro ordine e l'handshake TLS possono tradire un client che non è un browser.
I siti combinano questi segnali in un punteggio. Un punteggio basso può significare un declassamento silenzioso, una serie di controlli aggiuntivi o un blocco.
Passo 1: verifica cosa espone il tuo browser
Prima di cambiare qualsiasi cosa, guarda cosa può leggere una pagina dalla tua automazione. Lo script qui sotto apre una pagina che controlli e stampa i segnali che contano. È una diagnostica: usala sulle tue pagine di test, non per sondare sistemi altrui.
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") # sostituisci con una pagina di tua proprietà
print(page.evaluate(CHECK))
browser.close()
Esegui lo stesso script con headless=False, poi confronta i due output. Le differenze sono ciò che un sito potrebbe notare.
Passo 2: correggi le incoerenze, non solo i flag
Nascondere un solo flag lasciando invariati gli altri è l'errore più comune. Un user agent che dichiara Windows, mentre i font, il fuso orario e le dimensioni dello schermo descrivono un server Linux, è un segnale più forte di una singola proprietà. Punta a un ambiente internamente coerente:
- Usa un browser con finestra dove puoi, oppure una modalità headless che corrisponda a un browser desktop attuale.
- Imposta una finestra e una lingua che siano coerenti tra loro.
- Mantieni fuso orario e locale coerenti con l'indirizzo IP che usi.
- Riutilizza un solo profilo e i suoi cookie per una stessa identità, invece di ripartire da zero a ogni esecuzione.
Playwright ti permette di impostarne diversi in un solo punto:
context = browser.new_context(
locale="en-US",
timezone_id="America/New_York",
viewport={"width": 1366, "height": 768},
)
page = context.new_page()
Passo 3: rallenta e comportati come un visitatore
L'automazione diventa evidente quando è più veloce di quanto una persona possa essere. Aggiungi pause realistiche tra un caricamento di pagina e l'altro, evita di cliccare lo stesso elemento con un ritmo perfetto e non aprire centinaia di pagine in parallelo dallo stesso indirizzo. Fare meno richieste, più lente, riduce anche il carico sul sito, che è la cosa giusta da fare comunque.
Passo 4: riconosci quando il controllo è un captcha
Alcuni flussi di rilevamento finiscono in una sfida anziché in un blocco. Vedrai un widget captcha, e quel passaggio richiede un token da un solver. Il tipo di captcha attivo oggi su Scarnox è PopularCaptcha. La guida Python per PopularCaptcha mostra come il token viene richiesto e inviato. Altri widget, come Cloudflare Turnstile, sono nella roadmap ma non ancora attivi, quindi verifica i tipi di captcha spiegati prima di pianificare su uno di essi.
Un passaggio captcha non significa che il resto della configurazione sia corretta. Se lo stesso sito blocca ogni sessione headless qualunque sia la configurazione, è un segnale chiaro che il titolare non vuole accesso automatizzato. Rispettalo.
Cosa non fare
Non cercare di nascondere l'automazione a un sito che la vieta, e non usare strumenti di evasione del rilevamento per superare controlli di accesso. È un progetto diverso dai test e dalla raccolta di dati pubblici trattati in questa guida. Se il tuo progetto richiede un accesso che non ti è stato concesso, chiedi al titolare del sito oppure cerca un'API ufficiale o un feed di dati.
Scraping responsabile
- Controlla
robots.txte i termini del sito prima di automatizzarlo. - Mantieni basse le frequenze di richiesta e memorizza in cache le pagine già scaricate.
- Considera un blocco una risposta, non un enigma da aggirare.
- Non raccogliere dati personali senza una base giuridica valida.
Dove andare da qui
Se la tua automazione serve per test end-to-end, l'approccio è diverso: vedi captcha nei test automatizzati. Se usi una configurazione Playwright o Puppeteer, gestione dei captcha con Playwright e Puppeteer spiega dove va il token.
Inizia con il credito di prova gratuito, senza carta: crea un account e testa il flusso PopularCaptcha su una tua pagina. Per le tariffe attuali, consulta la pagina dei prezzi.