Headless browser gedetecteerd: oorzaken en oplossingen (2026)
Een site meldt "headless browser gedetecteerd", of hij toont stilletjes een andere pagina aan je geautomatiseerde browser. Sites doen dit omdat een headless browser zonder venster draait en zich op kleine, meetbare punten vaak anders gedraagt dan een gewone desktopbrowser. Deze gids legt uit welke signalen sites bekijken, hoe je nagaat wat je eigen browser prijsgeeft, en hoe een verstandige oplossing eruitziet. Ook behandelt hij het punt waarop het juiste antwoord is om te stoppen, of om de controle als captchastap te behandelen.
Waarom sites op headless browsers controleren
Automatiseringsframeworks sturen een echte browsermotor aan, dus het grootste deel van de pagina werkt hetzelfde. De verschillen zitten aan de randen:
- Automatiseringsvlaggen. Browsers die via automatiseringstools worden aangestuurd, lieten van oudsher een
navigator.webdriver-eigenschap zien die optruestaat, en sommige frameworks laten andere sporen achter in de pagina. - Ontbrekende of afwijkende browserfuncties. Een headless build kan geen plugins melden, een ongewone lijst talen, of een vensterformaat dat niet overeenkomt met een echt scherm.
- Verschillen in weergave. Canvas- en WebGL-uitvoer kan verschillen tussen een headless en een headed omgeving, vooral op een server zonder GPU.
- Timing. Geautomatiseerde klikken en paginalaadacties gebeuren vaak in een ritme dat een mens nooit zou maken.
- Netwerkgedrag. De requestheaders, hun volgorde en de TLS-handshake kunnen een niet-browserclient verraden.
Sites combineren deze signalen tot een score. Een lage score kan betekenen dat de site stilletjes een mindere versie toont, extra controles uitvoert, of blokkeert.
Stap 1: zie wat je browser blootgeeft
Kijk voordat je iets verandert na wat een pagina kan uitlezen van je automatisering. Het onderstaande script opent een pagina die jij beheert en print de signalen die ertoe doen. Het is een diagnostische tool: gebruik hem op je eigen testpagina's, niet om andermans systemen te onderzoeken.
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") # vervang door een pagina die van jou is
print(page.evaluate(CHECK))
browser.close()
Voer hetzelfde script opnieuw uit met headless=False en vergelijk de twee uitvoer. De verschillen zijn de dingen die een site zou kunnen opmerken.
Stap 2: los de inconsistenties op, niet alleen de vlaggen
Eén vlag verbergen terwijl de rest onveranderd blijft, is de meest voorkomende fout. Een user agent die Windows zegt, terwijl de lettertypen, tijdzone en schermgrootte een Linux-server beschrijven, is een sterker signaal dan één eigenschap. Streef naar een omgeving die van binnen klopt:
- Gebruik een headed browser waar dat kan, of een headless-modus die past bij een actuele desktopbrowser.
- Stel een viewport en een taal in die bij elkaar passen.
- Houd de tijdzone en de locale in lijn met het IP-adres dat je gebruikt.
- Hergebruik één profiel en de bijbehorende cookies voor één identiteit, in plaats van bij elke run opnieuw te beginnen.
Playwright laat je meerdere van deze instellingen op één plek zetten:
context = browser.new_context(
locale="en-US",
timezone_id="America/New_York",
viewport={"width": 1366, "height": 768},
)
page = context.new_page()
Stap 3: vertraag en gedraag je als een bezoeker
Automatisering valt op zodra ze sneller is dan een mens kan zijn. Voeg realistische pauzes toe tussen paginaladingen, vermijd het klikken op hetzelfde element in een perfect ritme, en open niet honderden pagina's tegelijk vanaf één adres. Minder en rustigere requests belasten de site ook minder, wat sowieso het juiste is.
Stap 4: weet wanneer de controle een captcha is
Sommige detectiestromen eindigen in een uitdaging in plaats van een blokkade. Je ziet dan een captchawidget, en voor die stap heb je een token van een solver nodig. Het live captchatype bij Scarnox is vandaag PopularCaptcha. De PopularCaptcha-gids voor Python laat zien hoe het token wordt aangevraagd en ingediend. Andere widgets, zoals Cloudflare Turnstile, staan op de roadmap maar zijn nog niet live. Bekijk daarom eerst de captchatypen uitgelegd voordat je ergens op vooruit plant.
Een captchastap betekent niet dat de rest van je opzet deugt. Als dezelfde site elke headless-sessie blokkeert, ongeacht hoe je alles instelt, dan is dat een duidelijk signaal dat de eigenaar geen geautomatiseerde toegang wil. Respecteer dat.
Wat je niet moet doen
Probeer niet om automatisering te verbergen voor een site die dat verbiedt, en gebruik geen tooling voor het omzeilen van detectie om toegangscontroles te passeren. Dat is een ander soort project dan het testen en het verzamelen van openbare data waar deze gids over gaat. Heb je toegang nodig die je niet hebt gekregen, vraag het dan aan de eigenaar van de site, of zoek naar een officiële API of datafeed.
Scrape verantwoord
- Controleer
robots.txten de voorwaarden van de site voordat je iets automatiseert. - Houd het aantal requests laag en cache pagina's die je al hebt opgehaald.
- Behandel een blokkade als een antwoord, niet als een puzzel om omheen te werken.
- Verzamel geen persoonsgegevens zonder rechtmatige grondslag.
Waar je verder kunt
Als je automatisering voor end-to-end tests is, is de aanpak anders: zie captcha in geautomatiseerde tests. Gebruik je een Playwright- of Puppeteer-opzet, dan legt captchaafhandeling met Playwright en Puppeteer uit waar het token terechtkomt.
Start met gratis proefkrediet, zonder creditcard: maak een account aan en test de PopularCaptcha-flow op je eigen pagina. Voor de actuele tarieven zie de prijspagina.