← Blog

Data scraping

Browserbase vs Browserless vs Playwright-grid: prijs per 1k

Een Nederlandse retailer wil 180.000 prijscheck-pagina's per dag. Drie headless opties. De marketing-pagina's vertellen alles, behalve wat de rekening aan het eind van de maand is.

Jacob Molkenboer· Oprichter · A Brand New Company· 3 nov 2024· 8 min
Drie messing gewichtjes op rij, groen prijskaartje aan linnen touw, gekruld bonnetje, ivoorkleurig papier, zijlicht.

Je doet pricing voor een Nederlandse elektronicaretailer. De marge is dit kwartaal twaalf basispunten gezakt en het bestuur wil dagelijks zicht op de achttien concurrenten die ertoe doen. Je engineer zegt dat ze het kan: een headless browser, Playwright, JSON-LD geparsed waar het bestaat en een handgeschreven extractor waar het niet bestaat. Zo'n 180.000 page-loads per dag, verspreid tussen 03:00 en 07:00 Amsterdamse tijd, zodat het dashboard fris is als de inkopers binnenlopen.

Ze vraagt welke browser-farm eronder moet. Browserbase? Browserless? Een grid op onze eigen Hetzner-bakken? Je stuurt de drie pricing-pagina's door naar procurement. Procurement komt twee uur later terug met één vraag. Wat kost het echt per duizend pagina's?

Op de marketing-pagina's staat het nergens.

De vorm van de pipeline

Achttien concurrenten. Ruwweg 10.000 SKU's per stuk. De meeste pagina's laden in drie tot vijf seconden met volledige JavaScript. Zo'n 30% zit achter agressieve bot-protection (Cloudflare Turnstile, DataDome, het gebruikelijke). Ongeveer 8% gooit een CAPTCHA op het tweede bezoek vanaf hetzelfde IP.

Dat geeft je vier kostenknoppen, en maar één daarvan is de browser:

  • Browser-tijd (de knop waarop de vendors prijzen)
  • Bandbreedte (CAPTCHA's kosten een echte fractie van een cent per stuk)
  • Residential of mobile proxies (de regel die de rest stilletjes overschaduwt)
  • Faalpercentage (elke retry is twee page-loads voor de prijs van één)

We hebben deze pipeline door de jaren heen drie keer gebouwd. De browser-rekening is bijna nooit de grootste regel. Maar het is de makkelijkste regel om een factor vijf naast te zitten.

Browserbase, de managed-baan

Browserbase verkoopt browser-uren. Je verbindt via CDP, zij starten een verse Chromium met fingerprint-randomisatie, residential proxy optioneel, video-opname optioneel, CAPTCHA-passthrough optioneel. Op het moment van schrijven kent hun publieke pricing drie plannen: een Developer-tier voor $39 per maand met 200 browser-uren, een Startup-tier voor $99 met 500, en een Scale-tier waar ze over onderhandelen.

Het getal dat procurement écht nodig heeft staat in de kleine letters: overage is $0,20 per browser-uur op de publieke plannen.

Dus ga je rekenen. Bij drie seconden actief per pagina is 180.000 pagina's per dag 150 browser-uren per dag, oftewel 4.500 per maand. Trek de 500 inbegrepen uren van het Startup-plan eraf, dan houd je 4.000 uur overage over.

Browserbase headline (3s/page):
  $99 (Startup) + 4,000 x $0.20  = $899 / month
  $899 / 5,400 (k pages)         = $0.166 per 1k pages

Dat is de bodem. De eerste keer dat DataDome je sessie dertig seconden openhoudt op een bijzonder vervelende concurrent, wordt je page-load van drie seconden er een van zeven. Reken opnieuw.

Realistic (7s/page on hardened targets):
  350 hours/day = 10,500 / month
  $99 + 10,000 x $0.20            = $2,099 / month
  $2,099 / 5,400                  = $0.389 per 1k pages

Dezelfde pipeline. Andere mix van concurrenten. Tweeënhalf keer de rekening. De prijspagina van de vendor is eerlijk, maar hij vraagt je je eigen page-time-verdeling te kennen voordat hij je iets vertelt.

Browserless, geprijsd per unit

Browserless v2 verkoopt units. Eén unit is ongeveer dertig seconden browser-tijd of één korte sessie, wat er eerder eindigt. Hun publieke Scale-plan staat op ongeveer $200 per maand voor 3 miljoen units, met overage per unit daarboven.

Het unit-model is mild voor korte sessies en hard voor lange. Voor 180k pagina's per dag:

Browserless (1 page ~= 1 unit, single session reused):
  5.4M units/month, 3M included, 2.4M overage at ~$0.0001
  $200 + $240                     = $440 / month
  $440 / 5,400                    = $0.081 per 1k pages

Browserless realistic (sessions rotated every ~10 pages
to duck fingerprint blocks, +30% units):
  $440 + ~$240 of extra units     = $680 / month
  $680 / 5,400                    = $0.126 per 1k pages

De catch is dat reuse in hun prijsmodel betekent: binnen één sessie blijven. Op het moment dat je een sessie afbreekt om fingerprint-redenen (en dat ga je vaak doen, want retailers blokkeren de tweede pageview vanuit dezelfde browser) loopt het unit-aantal op. Er staat een billing-breakdown in de Browserless-docs die laat zien hoe units uit sessies komen. Lees 'm voor je tekent. Tel daarna 30% op in je spreadsheet.

Self-hosted Playwright-grid

Hier houden de marketing-pagina's helemaal op te helpen, want niemand verkoopt dit aan je.

Een grid is drie dingen: een Playwright-installatie, een pool van worker-processen, en een queue ervoor. We draaien het meestal op drie Hetzner CCX33-nodes (8 dedicated vCPU, 32 GB RAM) à ruwweg €60 per maand per stuk. Elke node houdt twaalf gelijktijdige Chromium-contexts comfortabel; we cappen op tien voor headroom.

// One worker. Real, runnable.
import { chromium } from 'playwright'

const browser = await chromium.launch({
  args: ['--disable-blink-features=AutomationControlled'],
})

const ctx = await browser.newContext({
  locale: 'nl-NL',
  timezoneId: 'Europe/Amsterdam',
  userAgent: process.env.UA,
  viewport: { width: 1366, height: 768 },
  proxy: { server: process.env.PROXY_URL! },
})

const page = await ctx.newPage()
await page.goto(process.env.URL!, { waitUntil: 'domcontentloaded' })
const price = await page.evaluate(() => {
  const el = document.querySelector('[itemprop="price"]')
  return el?.getAttribute('content') ?? el?.textContent?.trim()
})

await ctx.close()
await browser.close()
console.log(JSON.stringify({ url: process.env.URL, price }))

Capaciteitscheck:

30 concurrent contexts across 3 nodes
4s average page-time (3s active + 1s overhead)
30 / 4   = 7.5 pages/second sustained
7.5 x 86,400  = 648,000 pages/day theoretical max
180,000 actual = 28% utilisation, headroom for retries and bursts

Per 1k pagina's, op twee manieren te lezen:

3 x €60 hardware                  = €180 / month
Grafana Cloud free tier             = €0
Engineer babysitting (~2h/week)     = ~€800 / month at our rate
-----------------------------------
Loaded steady state                 = €980 / month
€980 / 5,400                       = €0.181 per 1k pages

Without the engineer line item       = €0.033 per 1k pages

Het eerlijke getal hangt ervan af of je al iemand in dienst hebt die een grid kan babysitten, of dat je daarvoor moet aannemen.

Waarschuwing

Geen van deze getallen is inclusief residential proxies. Realistisch proxy-budget voor 180.000 Nederlandse e-commerce-pagina's per dag is €600 tot €1.400 per maand, afhankelijk van provider en hoe agressief de targets zijn. Dat is de regel waar je CFO naar gaat vragen, en geen van de drie browser-farms heeft 'm meegerekend.

Per 1k pagina's, naast elkaar

Pipeline: 180,000 Dutch e-commerce price pages/day
Average page-time 4s. Bot-protection share ~30%.

                         Cost / month    Per 1k pages
Browserbase Startup      $   899         $0.166
Browserbase realistic    $ 1,400         $0.259
Browserless Scale        $   440         $0.081
Browserless realistic    $   680         $0.126
Self-hosted (raw infra)  €   180         €0.033
Self-hosted (loaded)     €   980         €0.181

Drie eerlijke manieren om dezelfde tabel te lezen:

  1. Als je niemand in huis hebt, is Browserless de goedkoopste geloofwaardige optie voor deze vorm van verkeer. Het unit-model beloont korte scrapes.
  2. Als je engineer er toch al zit en zich verveelt, is de grid zelfs met arbeid erbij halve prijs, en je houdt de operationele kennis in huis.
  3. Browserbase is wat je koopt als de differentiator de fingerprint-stack en de CAPTCHA-passthrough zijn, niet de browser-tijd. Voor de 30% pagina's achter echte bot-protection verdient het de meerprijs. Voor de andere 70% betaal je voor functionaliteit die je niet gebruikt.

Waar elk er echt wint

Browserbase wint op zware targets. Als je scraper meer tijd kwijt is aan vechten tegen Cloudflare Turnstile en DataDome dan aan het laden van productpagina's, is de managed fingerprint-laag de meerprijs waard. We zetten hun grid achter een router die alleen de zware targets erheen stuurt, nooit de makkelijke.

Browserless wint op vorm. Korte, voorspelbare sessies, veel ervan, weinig bot-protection. Marktplaatsen met publieke API's die je aanvult. Interne QA-pipelines. Alles waar één pagina gelijk is aan één unit en je nooit hoeft te roteren.

De self-hosted grid wint op schaal en op kennis. Voorbij een miljoen pagina's per dag laten beide managed opties je achter met een rekening van vijf cijfers per maand en geen ruimte om opnieuw te onderhandelen. De grid houdt de faalmodi ook binnen je team, wat een feature is als er om 04:30 op dinsdag iets stuk gaat en de on-call meer moet weten dan welk Slack-kanaal hij moet pingen.

Wat we uiteindelijk hebben gedaan

Toen we vorig jaar de prijsmonitoring-pipeline bouwden voor een Nederlandse moderetailer, stuurden we de 65% verkeer die onbeschermd was via een Playwright-grid met vier nodes, en kochten we een kleine Browserbase-emmer voor de beschermde hosts. Een simpele URL-hash-router besloot per request welke baan. De gemengde kosten kwamen uit op €0,11 per 1k pagina's, inclusief proxies, monitoring en ons retainer. Diezelfde hybride vorm is hoe we al ons data-pipelinewerk bouwen op dat volume: managed waar het de meerprijs verdient, self-hosted waar het dat niet doet.

De vijf-minuten-audit

Open je scraper-logs. Pak de mediane page-time. Vermenigvuldig met je dagelijkse pagina-aantal en deel door 3.600 om browser-uren per dag te krijgen. Dat getal maal $0,20 is je Browserbase-bodem. Dat getal maal 30 is je maanduren. Twee minuten rekenwerk vertelt je of de vendor waar je mee gaat tekenen geprijsd is voor jouw verkeersvorm, of voor die van iemand anders.

Kern

Bij 180k pagina's per dag: meng een self-hosted Playwright-grid met een kleine managed-emmer voor de geharde targets. Rond €0,11 per 1k pagina's, proxies inbegrepen.

FAQ

Waarom publiceren de vendors geen prijs per 1k pagina's?

Omdat hun kostenmodel browser-tijd of session-units is, geen pagina's. Twee scrapers die dezelfde URL-lijst raken kunnen wild uiteenlopende rekeningen opleveren, afhankelijk van gemiddelde page-time en hoe vaak sessies roteren.

Zitten proxies in deze cijfers?

Nee. Residential proxy-budget voor 180.000 Nederlandse e-commerce-pagina's per dag loopt ruwweg van 600 tot 1.400 euro per maand en valt buiten alle drie de browser-farm-rekeningen.

Wanneer stopt self-hosten zinvol te zijn?

Als meer dan de helft van je verkeer achter geharde bot-protection zit, of als niemand in het team comfortabel is met Chromium-processen babysitten. Op dat punt betaal je voor fingerprint-engineering, niet voor browser-tijd.

Kan ik Browserbase en een self-hosted grid mixen?

Ja, en we raden het aan voorbij zo'n 100k pagina's per dag. Stuur zware targets via de managed-baan en de rest via je eigen grid. Een URL-hash-router is genoeg.

En Puppeteer of Selenium Grid?

Dezelfde rekensom. De kostendimensies zijn hardware, engineer-tijd en proxies. Playwright wint op context-isolatie en tooling, maar Selenium Grid landt binnen 10% van de kosten voor dezelfde workload.

data scrapingautomationarchitecturetoolingoperations

Iets bouwen?

Start een project