Browser-fingerprinting uitgelegd voor scrapers
Browser-fingerprinting is het identificeren van een bezoeker aan de hand van de gecombineerde kenmerken van zijn browser, niet via een cookie of een account. Sites gebruiken het om terugkerende bezoekers te herkennen, fraude op te sporen en automatisering te herkennen. Als je het web scraped, kom je er vroeg of laat mee in aanraking. Deze gids legt uit wat er wordt gemeten, waarom één afwijking problemen veroorzaakt, en hoe je één consistent, goed gedragend profiel houdt voor het verzamelen van publieke data. Hij legt ook de grenzen uit van wat het afstemmen van een fingerprint kan en mag doen.
Waaruit een fingerprint bestaat
Geen enkele waarde identificeert een browser op zich, maar veel kleine waarden samen vaak wel. Veelvoorkomende invoer zijn:
- User-agent en client hints. De browsernaam, versie en het besturingssysteem die de browser meldt.
- Scherm- en vensterafmetingen. Schermgrootte, kleurdiepte, device pixel ratio en de grootte van de viewport.
- Taal en tijdzone. De
Accept-Language-header,navigator.languagesen de tijdzone die de browser meldt. - Geïnstalleerde lettertypen. De lettertypen die de pagina kan detecteren, die verschillen tussen besturingssystemen en geïnstalleerde software.
- Canvas-, WebGL- en audio-output. Kleine verschillen in hoe de grafische of audiostack een testafbeelding of geluid tekent of verwerkt.
- Netwerkkenmerken. De TLS-handshake, HTTP/2-instellingen en de volgorde van de requestheaders. Die zijn zichtbaar voor de server nog voordat er JavaScript draait.
Fingerprinting-scripts combineren deze tot een hash of een score. Hoe meer signalen stabiel en ongebruikelijk zijn, hoe identificerender het resultaat.
Waarom een afwijking opvalt
Een echte browser is intern consistent. Het besturingssysteem past bij de lettertypen, de tijdzone past bij de taalinstelling, en de schermgrootte past bij het apparaat waarop hij draait. Scrapers breken die consistentie vaak zonder dat ze het willen:
- Een user-agent die van een desktopbrowser is gekopieerd, verstuurd door een server zonder geïnstalleerde lettertypen.
- Een Duitse
Accept-Language-header bij een verzoek waarvan het IP-adres in een ander land ligt, met een tijdzone die bij geen van beide past. - Een headless omgeving die een vensterformaat meldt dat geen echte monitor gebruikt.
- Een gloednieuw profiel bij elke run, zodat de cookies en geschiedenis nooit doen denken aan een terugkerende bezoeker.
Elke afwijking is een klein signaal. Samen kunnen ze een verzoek verschuiven van "gewone bezoeker" naar "moet nader bekeken worden".
Stap 1: meet je eigen opzet
Je kunt zien wat een pagina over je client te weten komt door een fingerprinttestpagina te laden die je beheert, of een diagnosepagina die je lokaal draait. Bekijk de waarden en vraag je af of ze één coherente machine beschrijven. Hier is een minimaal Playwright-voorbeeld dat er enkele afdrukt:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context(locale="en-GB", timezone_id="Europe/London")
page = context.new_page()
page.goto("https://example.com") # vervang door een pagina die je beheert
print(page.evaluate("""() => ({
language: navigator.language,
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
platform: navigator.platform,
viewport: [innerWidth, innerHeight]
})"""))
browser.close()
Stap 2: houd één identiteit per profiel
De nuttigste gewoonte is om elke scrape-identiteit als één profiel te behandelen. Geef het één set kenmerken en houd die voor de hele levensduur:
- Eén browserbuild, één user-agent en één besturingssysteem.
- Een locale, taal en tijdzone die passen bij de regio waar het verkeer vandaan komt.
- Een viewport en device scale factor die passen bij een echt scherm.
- Een persistent cookiebestand, zodat het profiel zich gedraagt als een terugkerende bezoeker.
Eén van deze kenmerken voor elk verzoek veranderen is verdachter dan ze stabiel houden. Consistentie is wat een profiel gewoon laat lijken.
Stap 3: laat het profiel zich gedragen als een bezoeker
Fingerprinting is maar één input. Sites letten ook op hoe snel één profiel door de site beweegt. Een profiel dat in een minuut tweehonderd productpagina's laadt, is geen mens, wat de fingerprint ook zegt. Spreid verzoeken, cache resultaten, en stop wanneer een pagina aangeeft dat je moet stoppen. De checklist scrapen zonder geblokkeerd te worden behandelt het tempo in meer detail.
Stap 4: ken de grenzen
Het afstemmen van fingerprints kan een geautomatiseerd profiel niet laten lijken op een persoon die er niet is. Sites die op fingerprinting vertrouwen, combineren het meestal met snelheidslimieten, accountcontroles en soms een captcha. Wanneer een captcha verschijnt, heb je een token van een solver nodig en niet nog meer fingerprint-aanpassingen. Het live captchatype bij Scarnox is PopularCaptcha; de PopularCaptcha Python-gids laat het verzoek zien. Voor het bredere beeld van welke widgets bestaan, lees je soorten captcha uitgelegd.
Belangrijker nog: fingerprint-omzeiling is geen vergunning om de regels van een site te negeren. Als de eigenaar automatische toegang heeft beperkt, is het juiste om te stoppen, niet om je profiel moeilijker op te laten vallen. Fingerprinting is ook een privacykwestie. Sommige sites gebruiken het om mensen over bezoeken heen te volgen, en dat is een reden te meer om alleen te verzamelen wat je project nodig heeft.
Scrape verantwoord
- Lees
robots.txten de voorwaarden voordat je een site scrapet. - Gebruik minder, langzamere verzoeken, en cache wat je al hebt verzameld.
- Bouw geen profielen om echte mensen na te doen of om een blokkade te omzeilen.
- Sla geen persoonsgegevens op die je niet nodig hebt, en behandel wat je wel opslaat zorgvuldig.
Waar je hierna naartoe gaat
Als je doel achter een controle op browserniveau zit, begin dan met headless-browserdetectie, die de signalen behandelt die specifiek zijn voor geautomatiseerde browsers. Pagina's die JavaScript nodig hebben om hun inhoud te tonen, worden behandeld in JavaScript-websites scrapen.
Begin met gratis proefcredit, zonder creditcard: maak een account aan en probeer de PopularCaptcha-flow op een pagina die je beheert. Voor actuele tarieven zie de prijzenpagina.