Data scraping
Headless browser farms: Browserbase, Steel of zelf hosten
Drie headless browser lagen, één verzekeringskantoor in Den Bosch, 9.400 scrapes per week. Kosten per sessie, captcha-overleving en wie IP's rouleert als een /24 valt.

De offerte-agent gaat af om 06:00 op een dinsdag. Een verzekeringskantoor met 22 mensen in Den Bosch heeft zo'n 1.300 offertes nodig die voor kantooropening gescrapet moeten worden via een headless browser farm, over Independer en Pricewise heen, plus een privé-portal van een underwriter dat achter een login zit. De week ervoor blokkeerde dat portal hun hele Hetzner /24 zes uur lang na een slordige nachtrun. Het team belde ons dezelfde ochtend om 09:40.
We hadden de agent gebouwd op een zelfgehoste Playwright-pool. Het werkte. Tot het niet meer werkte. Drie weken later hadden we alle drie de voor de hand liggende opties gebenchmarkt op dezelfde workload, op eigen kosten, zodat het kantoor niet zou opdraaien voor een verkeerde keuze. Dit is wat we vonden.
De workload, in cijfers
Zo'n 9.400 page fetches per week. Daarvan zijn ongeveer 7.800 listing-pagina's van Independer en Pricewise (zware JS, meestal geen captcha) en 1.600 het underwriter-portal (login-flow, af en toe reCAPTCHA v2, session-bound cookies). Gemiddelde paginatijd 4,2 seconden. Gemiddelde sessieduur 38 seconden als het goed gaat, eerder twee minuten als er een captcha of device-fingerprint check tussen komt.
Sequentieel gedraaid is dat ruwweg 100 uur browsertijd per week. We parallelliseren over 12 tot 18 workers, zodat de ochtendbatch binnen 45 minuten klaar is. Daarna een langzamer ritme door de dag heen om offerte-updates op te vangen.
Browserbase
Browserbase is een managed headless browser cloud. Je verbindt via CDP, zij geven je een Chromium-sessie, jij stuurt 'm aan met Playwright zoals altijd. Hun docs zijn eerlijk over wat er wel en niet bij zit.
De pitch die telde: ingebouwde proxies (datacenter of residential), ingebouwde stealth, captcha-solving op de betaalde tiers, en een volledige session replay van elke run, zodat we als er om 03:00 iets breekt door de DOM kunnen scrubben. De verborgen kosten: prijzen per sessie lopen sneller op dan de calculator suggereert zodra je stealth, residential proxy en captcha-solving stapelt bovenop het basistarief per browser-minuut.
In onze testweek, end to end, betaalden we ongeveer €0,071 per sessie voor de portal-pagina's (stealth + residential + af en toe captcha) en €0,018 per sessie voor de listing-pagina's. Weektotaal: ongeveer €145. Captcha survival rate over de 1.600 portal-pagina's: 96,4%.
Eén stille winst: toen het underwriter-portal onze pool banande, rouleerde Browserbase de residential-allocatie automatisch. Wij deden niets. Hun support bevestigde binnen 20 minuten dat ze de blokkade hadden gezien en de ASN verlegd hadden.
Steel.dev
Steel.dev is een nieuwere open-source browser API. Je kunt de OSS-core (Apache 2.0) zelf hosten of hun managed cloud gebruiken. Wij probeerden beide.
De OSS-core is goed. Die geeft je een schone session API bovenop Chromium, met hooks voor fingerprinting en proxy-injectie. De managed cloud is goedkoper per browser-uur dan Browserbase, maar voor captcha en residential proxy moet je je eigen oplossing meenemen. Wij koppelden Bright Data residential exit nodes en 2Captcha voor het oplossen erin.
Zelfde workload: €0,043 per portal-sessie, €0,012 per listing-pagina. Weektotaal: ongeveer €98. Captcha survival: 91,7%.
Wat we minder betaalden bij Steel.dev, betaalden we in lijmwerk. Elke captcha-fout was voor ons. Elk proxy-rotatiebeleid moesten wij schrijven. Toen de underwriter ons midden in een batch blokkeerde (een /24 van de Bright Data pool ging een uur lang hot), was de rotatie-logica in onze code wat de run redde. Browserbase had dat werk voor ons verborgen. Hier waren wij eigenaar.
Zelfgehoste Playwright op een Chromium farm
Wat we al hadden. Zes Hetzner CCX23 nodes, Docker, Playwright met chromium-headless-shell, een Redis-queue en een eigen session manager. Puur de compute kwam neer op €68 voor de week. Plus Bright Data residential op zo'n €11,20/GB scheelde nog eens €74. Plus 2Captcha: €31. Weektotaal: ongeveer €173.
Wacht. De DIY-optie is duurder? Ja, omdat de Hetzner nodes gedimensioneerd zijn op de piek om 06:00 en 70% van de dag idle staan. De managed services rekenen per sessie en vangen de stilte buiten de piek effectief op. Als je niet kunt bin-packen, betaal je voor lege stoelen.
// what we run on the self-hosted farm
import { chromium } from 'playwright'
import { rotateExitNode } from './brightdata.js'
async function fetchQuote(policyId) {
const exit = await rotateExitNode({ session: policyId, sticky: '00:10:00' })
const browser = await chromium.connectOverCDP(`ws://farm:9222`)
const ctx = await browser.newContext({
proxy: { server: exit.url, username: exit.user, password: exit.pass },
viewport: { width: 1366, height: 768 },
locale: 'nl-NL',
})
const page = await ctx.newPage()
await page.route('**/*.{png,jpg,jpeg,webp}', r => r.abort()) // skip images, save GB
await page.goto(`https://portal.example.nl/quote/${policyId}`)
// ... extract, post to queue
await ctx.close()
}
Captcha survival op dezelfde workload: 88,9%. Lager omdat onze eigen fingerprint-masking een halve generatie achterloopt op wat Browserbase levert. We hadden de kleine audio-context randomisatietrucs die reCAPTCHA v3-scores in ons voordeel duwen nog niet ingebouwd.
Het /24-incident dat deze hele exercitie startte kostte ons vier engineering-uren aan handmatig rouleren en Bright Data zone-swaps. Op Browserbase was dat nul. Op Steel.dev managed was het ongeveer veertig minuten.
Wie heeft dienst
Dat is de vraag die de spreadsheet niet beantwoordt. Als de WAF van de underwriter zondagnacht om 02:00 strakker wordt en de ochtendbatch de deadline van 06:00 gaat missen, wie merkt het op, wie escaleert, en hoe snel verandert de IP-pool van handen?
De prijs per sessie is het luidste getal op de pagina. Wie de pager draagt is het getal dat je 's nachts wakker maakt. Reken het tweede uit voordat je het eerste uitrekent.
Voor een kantoor van 22 mensen zonder on-call engineer was de verborgen waarde van Browserbase dat het stilletjes twee incidenten had opgevangen waarvan we niet wisten dat ze gebeurd waren. Op Steel.dev managed merkten we ze allebei op. Op de zelfgehoste farm vingen we er één op en haalde de andere de ochtendbatch 90 minuten onderuit.
Wat we kozen
Browserbase, voor nu. Niet omdat het de goedkoopste was (dat was het niet). Omdat de ops manager van het kantoor niet wil weten wat een /24 is, en de kosten van één gemiste ochtendbatch (in klantvertrouwen, in de WhatsApp die ze om 06:47 van de senior adviseur krijgt) hoger zijn dan de €47 die we per week zouden besparen met Steel.dev managed.
We komen terug op de zelfgehoste optie zodra de agent-load voorbij 25.000 sessies per week groeit. Bij dat volume klapt de bin-packing rekensom om en gaat de engineering-tijd om de stack te bezitten zichzelf terugverdienen. Waarschijnlijk houden we Steel.dev's OSS-core aan als warme fallback voor het geval Browserbase ooit een outage heeft tijdens de 06:00-sprint.
Aantekeningen bij het residential pool probleem
Eén ding lost geen van de drie netjes op: als een Nederlands portal besluit een residential ASN te blokkeren, moet de pool waar je van huurt dit opmerken en wisselen. Bright Data en Oxylabs rouleren beide, maar de snelheid hangt af van de zone-configuratie. We leerden om voor de underwriter het rotatie-interval op per request te zetten, en sticky 10 minuten voor de listing-pagina's. De listing-scrapers hebben baat bij cookie-continuïteit. Het portal niet.
Residential proxies worden per GB afgerekend. Een zware JS-pagina met afbeeldingen erbij is 3 tot 6 MB. De week van 9.400 pagina's kwam neer op zo'n 32 GB, met afbeeldingen uitgezet waar mogelijk. Zet afbeeldingen uit op route-niveau. Wij vergaten het de eerste week en betaalden €112 extra aan proxy-verkeer voor het voorrecht.
Nog één over geld. Headless agents die browsers aansturen met een credit card on file kunnen sneller door een budget heen branden dan wat dan ook in je stack. Op de HN frontpage stond al meer dan één verhaal van een agent die in een weekend stilletjes zijn operator failliet maakte. Zet harde weekcaps in elk vendor-dashboard voordat je iets live zet dat met een billing API praat. Browserbase, Steel.dev managed en Bright Data hebben ze allemaal. Gebruik ze vanaf dag één.
Een audit van vijf minuten die je vandaag kunt doen
Als je een scraping-agent draait en je hebt 'm nog niet gemeten, doe dit eens: tel sessies per week, vermenigvuldig met 60 seconden (een eerlijk gemiddelde), en reken alle drie de opties door tegen dat getal met hun publieke calculators. Tel daar de engineering-uren bij op die jouw team afgelopen kwartaal kwijt was aan browser-fleet incidenten. Dat tweede getal is meestal groter dan iedereen verwacht, en dat is het getal dat bepaalt in welke kolom je leeft.
Toen we de polis-offerte AI-agent voor het kantoor bouwden, was het stuk dat we onderschatten het rotatiebeleid van de residential pool. We hebben het opgelost door Browserbase voor nu eigenaar te laten zijn van die laag en een Steel.dev fallback te schrijven waar we binnen 15 minuten naar over kunnen. Als je vergelijkbaar werk scope't, is de eerste vraag niet welke vendor. Het is wie de pager draagt.
Kern
De prijs per sessie is het luidste getal op de pagina. Wie de IP-pool rouleert als om 02:00 een /24 valt, is het getal dat bepaalt waar je echt voor betaalt.
FAQ
Wat kost elke optie voor 9.400 sessies per week?
Op onze testworkload kwam Browserbase uit op ongeveer €145 per week, Steel.dev managed (met Bright Data en 2Captcha) op €98, en een zelfgehoste Playwright-farm op Hetzner op €173 zodra proxy- en captcha-kosten erbij kwamen.
Welke optie had de beste captcha survival rate?
Browserbase, met 96,4% over 1.600 portal-sessies. Steel.dev managed haalde 91,7% met dezelfde proxy en solver. Onze zelfgehoste Playwright-farm landde op 88,9% voordat we audio-context fingerprint-patches live zetten.
Wanneer loont zelf hosten zich echt?
Zodra je weekly browser-load hoog genoeg is dat je vaste nodes niet meer idle staan. Voor ons ligt het break-even rond 25.000 sessies per week. Daaronder wint de managed prijs per sessie, omdat die je idle-tijd buiten de piek opvangt.
Wie rouleert de residential IP-pool als een portal een /24 blokkeert?
Op Browserbase doet de vendor het automatisch. Op Steel.dev managed neem je je eigen proxy-provider mee en schrijf je het rotatiebeleid. Op een zelfgehoste farm is jouw engineering-team eigenaar van de hele rotatie en incident response.
Moet ik afbeeldingen uitzetten als ik scrape met residential proxies?
Ja. Residential proxies worden per GB afgerekend, en één zware JS-pagina met afbeeldingen kan 3 tot 6 MB egress kosten. Afbeeldingen blokkeren op route-niveau verlaagde onze weekrekening voor proxy's met zo'n €112.