Terug naar blog

Webscraping beperkt? Oplossingen voor fingerprinting, IP-blokkades, CAPTCHA's en multi-account login

Vanuit 403/429, fingerprinting, CAPTCHA's, dynamische pagina's en inlogsessies legt dit artikel de echte redenen uit waarom webscraping wordt beperkt, en biedt het een aanpak die geautoriseerde API's, rate limiting, backoff, incrementele cache en een conforme accountomgeving vooropstelt.

Wanneer een scrapingklus 403, 429, een CAPTCHA of steeds terugkerende loginfouten oplevert, is de juiste reactie niet om IP's te roteren, fingerprints te maskeren of een "echt persoon" na te doen. Deze signalen betekenen meestal dat de vraagfrequentie, de reikwijdte van de toegang, de authenticatie of het geautomatiseerde gedrag een grens heeft overschreden die de site bereid is te accepteren. Door de blokkade te omzeilen escaleert de beperking vaak en kunnen tegelijk de gebruiksvoorwaarden, contracten, auteursrecht of regels voor gegevensbescherming worden overtreden.

Een stabieler pad is om eerst autorisatie en beschikbare interfaces te controleren, daarna het verkeer te verminderen, cache en backoff in te zetten waar nodig, en browserautomatisering alleen te gebruiken voor pagina's die echt JavaScript-rendering of een menselijke login vereisen. Behandel een CAPTCHA als een signaal om te pauzeren, niet als een technische horde die je moet slopen.

Begin bij het symptoom en spits de oorzaak toe

SymptoomVeelvoorkomende oorzaakConforme reactie
429 Too Many RequestsAanvragen te snel, te parallel of herhalendVerlaag de rate, volg Retry-After, gebruik exponentiële backoff
403 ForbiddenOngeautoriseerd pad, beleidsblokkering, ontbrekende sessieControleer rechten, voorwaarden, robots.txt en authenticatie
CAPTCHA verschijntSite vraagt om menselijke verificatie of blokkeert automatiseringPauzeer de taak, voer hem handmatig uit of vraag een API aan
Login blijft falenVerlopen cookies, overschreven sessies, mislukte authenticatieGebruik officiële OAuth of service-accounts, regel sessie-overdrachten netjes
Pagina heeft inhoud maar script leest hem nietJavaScript-rendering, asynchrone API-ladingGebruik de officiële API; met toestemming in browser renderen en DOM lezen
Selectors werken plotseling nietDOM-herontwerp, A/B-test, taalwijzigingGebruik semantische locators, structuurtests en waarschuwingen, vermijd hardcoded hiërarchieën
Dubbele of ontbrekende dataPaginering, cursors, tijdzones, updatevensterBouw unieke sleutels, incrementele watermark en herstartmechanisme

Verander één variabele tegelijk en houd logs bij. Als je tegelijk IP, User-Agent, account en parser aanpast, lukt het misschien toevallig, maar weet je niet welke wijziging het probleem echt heeft opgelost.

Stap 1: bevestig dat je deze gegevens mag verzamelen

Beantwoord vooraf vier vragen:

  1. Zijn de gegevens openbaar, of pas beschikbaar na login, betaling of voor bepaalde rollen?
  2. Biedt de site een API, export, feed, webhook of partnerinterface voor gegevens?
  3. Staan gebruiksvoorwaarden, robots.txt, contracten en lokale wetgeving het beoogde gebruik toe?
  4. Bevatten de gegevens persoonsgegevens, auteursrechtelijk beschermde inhoud of andere gevoelige velden?

robots.txt is het standaardmechanisme waarmee een site aan geautomatiseerde clients laat weten welke paden zijn toegestaan en welke niet. RFC 9309 beschrijft de syntaxis en matchregels van het Robots Exclusion Protocol en maakt duidelijk dat robots.txt geen toegangsautorisatie is. Met andere woorden, toestemming in robots.txt geeft je niet het volledige recht om de gegevens te kopiëren, verwerken of commercieel te gebruiken; verboden paden mogen niet via een andere ingang worden omzeild.

Enterprise-projecten documenteren gegevensbronnen, toegangsgrondslag, doel, velden, bewaartermijn en verwijdermechanisme. Wanneer geaggregeerde gegevens het probleem oplossen, vermijd dan het verzamelen van persoonsherkenbare informatie.

Stap 2: geef stabiele gegevensingangen voorrang

De gebruikelijke volgorde:

  1. Officiële API's, webhooks of data-exports;
  2. Openbare feeds, sitemaps of batchbestanden;
  3. Toegestane gewone HTTP-pagina's;
  4. Browserautomatisering alleen wanneer JavaScript echt gerenderd moet worden;
  5. Pagina's die een menselijk account en interactie vereisen, als laatste.

API's bieden meestal velddefinities, paginering, rate limits en foutcodes, wat goedkoper is in onderhoud dan het parsen van een UI. Een webpagina is een oppervlak voor menselijke ogen; hij kan op elk moment veranderen en mag niet als stabiele database worden behandeld.

Als de site geen geschikte interface heeft, neem dan eerst contact op met de eigenaar van de gegevens en leg het doel, de frequentie, de velden en de commerciële omvang uit. Een duidelijke gegevenslicentie is meestal goedkoper dan een lang gevecht tegen beperkingen.

Stap 3: pak 429 en IP-blokkades aan door de belasting te verlagen, niet door de bron te verbergen

Stel limieten in voor snelheid en gelijktijdigheid

Begin met één worker en een ruim interval, en observeer reactietijd en foutpercentage. Geeft de server Retry-After terug, wacht dan precies die tijd. Zo niet, gebruik dan exponentiële backoff met willekeurige jitter zodat meerdere taken niet tegelijk opnieuw proberen.

Eenvoudig beleid:

wacht = min(limiet, basis × 2^pogingen) + jitter

Bereik je het maximale aantal pogingen, stop dan en geef een waarschuwing. Geen eindeloze lussen.

Cache en incrementele updates

Cache dezelfde URL en stuur, waar mogelijk, conditionele verzoeken met ETag of Last-Modified. Leg het tijdstip van de laatste update of een cursor vast zodat je alleen nieuwe en gewijzigde inhoud ophaalt. Door volledige en dagelijkse incrementele taken te scheiden, daalt het verzoekvolume aanzienlijk.

Identificeer je cliënt eerlijk

Een conforme crawler gebruikt een stabiele, echte User-Agent, vermeldt zijn doel en biedt een contactpagina of e-mail. Doe je je voor als een gewone browser en wissel je vaak van identiteit, dan kan de site goed en slecht verkeer minder goed onderscheiden, waardoor de kans op blokkering toeneemt.

Als een specifiek IP wordt beperkt, pauzeer dan de taak en kijk naar de oorzaak. Proxies blijven roteren om de toegang te behouden kan worden gezien als omzeiling van toegangscontroles, niet als oplossing.

Stap 4: omgaan met fingerprinting en gedragsanalyse

Browserfingerprints combineren signalen als User-Agent, besturingssysteem, taal, tijdzone, resolutie, Canvas en WebGL. Een site kan ook het verzoekritme, navigatiepaden en sessiegedrag analyseren. OWASP noemt Fingerprinting, Scraping, CAPTCHA Defeat, Credential Stuffing en dergelijke als afzonderlijke categorieën geautomatiseerde bedreigingen — dat verklaart waarom een site vaak meerdere signalen combineert om het automatiseringsrisico in te schatten.

Voor geautoriseerd werk is het doel niet om massaal 'menselijke' identiteiten aan te maken, maar om de omgeving stabiel en verklaarbaar te houden:

  • één vast account met vaste omgeving en reguliere authenticatie;
  • browserparameters die aansluiten op de werkelijke regio en het werkelijke apparaat;
  • geen willekeurige wijzigingen van fingerprints om blokkades te ontwijken;
  • leg de verzamelfrequentie, taak-ID en verantwoordelijke vast in logs;
  • spreek met de site het toegestane aantal accounts, de mate van gelijktijdigheid en het datavolume af.

Als de site een geautoriseerde taak toch verkeerd classificeert, deel dan tijdstempels, User-Agent, egress-IP en voorbeeldverzoeken met de site en vraag om plaatsing op een whitelist of een speciale interface.

Stap 5: stop de automatisering zodra een CAPTCHA verschijnt

Een CAPTCHA dient om een mens te bevestigen of om verdachte automatisering te blokkeren. Gebruik geen OCR, CAPTCHA-oplossingsdiensten, CAPTCHA-kraakplug-ins of andere middelen om hem automatisch te omzeilen.

De juiste volgorde is:

  1. zet het huidige account en de taakwachtrij meteen op pauze;
  2. bewaar verzoekfrequentie, paden en foutenlog vlak voor de trigger;
  3. een gemachtigd persoon voert de benodigde verificatie uit op de officiële pagina;
  4. controleer of verzoeken te snel waren, de sessie verlopen was of een niet-toegestaan pad werd gebruikt;
  5. voor langdurige automatisering: vraag de site om een API, service-account of whitelist.

Ook al lost een mens de CAPTCHA één keer op, dat geeft niet het recht om daarna onbeperkt automatische verzoeken te blijven sturen. Herstel eerst de oorzaak.

Stap 6: beheer logins en multi-account met formele rechten

Gegevens achter een login zijn gevoeliger dan openbare pagina's. Geef de voorkeur aan OAuth, service-accounts, API-tokens of rechten die door het officiële team van het platform zijn verleend. Laat een script nooit iemands hoofdwachtwoord opslaan.

Wanneer een browsersessie echt nodig is:

  • één legitiem zakelijk account koppelt aan één stabiele omgeving;
  • cookies versleuteld opslaan, met verloop en mogelijkheid tot intrekking;
  • MFA aanzetten; automatisering mag de tweede factor niet omzeilen;
  • verbieden dat meerdere personen tegelijk wachtwoorden resetten of cookies kopiëren;
  • vastleggen wie welke taak en wanneer is gestart;
  • bij vertrek, einde van een project of rolwijziging direct de toegang intrekken.

Multi-account is alleen toegestaan voor accounts die je daadwerkelijk bezit of waarvoor je toestemming hebt. Wanneer een site een entiteit tot één account beperkt, mag omgevingsisolatie niet worden gebruikt om die beperking te omzeilen.

Stap 7: maak dynamische paginaparsing beter bestand tegen herontwerp

Gebruik semantische en stabiele attributen

Kies voor titels, koppen, toegankelijkheidsattributen en door de site gepubliceerde testidentificatoren. Vermijd broze hiërarchieën als div:nth-child(7). Lees het DOM opnieuw nadat de pagina is vernieuwd; ga er niet vanuit dat een oud knooppunt nog bestaat.

Scheid extractie van bedrijfslogica

De verzamellaag zet de pagina alleen om in gestructureerde velden. De validatielaag controleert typen, bereiken, unieke sleutels en verplichte velden. Bij die splitsing raakt een herontwerp alleen de parser, niet de analyse erachter.

Bouw steekproeven en waarschuwingen

Bewaar een klein aantal conforme HTML- of structuursnapshots als teststeekproeven. Sla geen volledige accountpagina's of gevoelige gegevens op. Monitor percentages ontbrekende velden, aantal records, duplicaten en paginatitels; stop het schrijven naar productie zodra de waarden afwijken.

De juiste rol van PurpleMark in geautoriseerde scraping

Wanneer een team meerdere geautoriseerde accounts, verschillende klantomgevingen of meerdere regio's tegelijk moet beheren, kan het in de PurpleMark web app per zakelijk account een onafhankelijke browseromgeving aanmaken en daar de bijbehorende cookies, de pagina die standaard na het inloggen opent, en de gebruikelijke netwerkconfiguratie bij elkaar bewaren. Wordt die omgeving later opnieuw geopend, dan keert de browser terug naar de laatste sessie en werkpagina, zodat meerdere personen niet één set cookies delen en niet steeds opnieuw hoeven in te loggen.

Moeten accounts per klant, platform of regio worden gesplitst, dan kunnen omgevingsgroepen zakelijke accounts in verschillende mappen onderbrengen, en ledenrechten, delen en overdracht bepalen wie welke omgeving mag openen. Het operatielogboek houdt bij wanneer en door wie een omgeving is geopend of aangepast. Bij vragen over geautoriseerde scraping kan snel worden teruggegaan naar een specifiek account en een aangewezen verantwoordelijke.

PurpleMark helpt een team om 'accounts, omgevingen, sessies en verantwoordelijkheid' langdurig in één werkruimte te beheren, maar is niet bedoeld om IP-blokkades, CAPTCHA's, account-aantallen of de anti-automatiseringsverdediging van een site te omzeilen. Vraag eerst autorisatie, praat daarna over automatisering.

Een onderhoudbare scrapingarchitectuur

Een nuttige splitsing in vijf lagen:

  1. Planning: frequentie, gelijktijdigheid, taakprioriteit en pauze;
  2. Toegang: API, HTTP of geautoriseerde browsersessie;
  3. Parsing: reacties omzetten in gestructureerde velden;
  4. Kwaliteit: deduplicatie, typecontroles, waarschuwingen bij ontbrekende velden, versiebeheer;
  5. Governance: rechten, bron, doel, bewaartermijn, verwijdering.

Elke record bewaart de bron-URL, het verzameltijdstip en de parserversie. Bij fouten kun je gericht de getroffen records terugvinden en opnieuw draaien in plaats van de hele site opnieuw te crawlen.

Veelgestelde vragen

Lost proxyrotatie een IP-blokkade op?

Het verandert misschien tijdelijk het egress-adres, maar lost het probleem met frequentie, rechten of gedrag niet op. Proxy's blijven roteren om de toegang te behouden kan als omzeiling gelden. Zet eerst de taak stop, verlaag het aantal verzoeken en neem contact op met de site.

Kan een CAPTCHA automatisch worden opgelost?

Nee. Een CAPTCHA is een signaal om te pauzeren of een mens in te schakelen. Voor doorlopende automatisering vraag je een API, een service-account of een whitelist aan.

Als robots.txt het toestaat, mag ik dan altijd scrapen?

Niet per se. robots.txt is geen toegangsautorisatie; je moet ook rekening houden met voorwaarden, auteursrecht, privacy, contracten en het gebruiksdoel van de gegevens.

Maakt een antdetectie-browser scraping 'ondetecteerbaar'?

Dat valt niet te garanderen, en dat mag ook niet het doel zijn. Hij is beter geschikt om legitieme accountsessies en teamrechten te scheiden, en om cookieverwarring en bedieningsfouten te beperken.

Afsluiting

Beperkingen op webscraping zijn niet alleen een 'technisch anti-botprobleem'. 403, 429, fingerprinting, CAPTCHA's en multi-accountlimieten wijzen allemaal op rechten, belasting en identiteitsbeheer.

Een stabiele aanpak valt altijd terug op API-eerst, duidelijke autorisatie, gematigde verzoeken, incrementele cache, testbare parsing en auditteerbare accounts. Verschijnt er een CAPTCHA of blokkade, stop dan en herstel het proces in plaats van de bron van de automatisering verder te verbergen.