Rotating proxies instellen in Puppeteer zonder geblokkeerd te worden

Laatst bijgewerkt op August 10, 2026
Hand-drawn diagram of a Puppeteer-controlled browser rotating requests through multiple proxy nodes
AI Samenvatting
- Vergelijk praktische architecturen voor Puppeteer-rotatie, inclusief browserherstart per proxy, gateway-beheerde rotatie, geïsoleerde browserpools en browser sharding. - Leer waar proxycredentials horen, hoe HTTPS CONNECT het requestpad verandert en waarom authenticatie op paginaniveau niet altijd browser- of tunnelfouten oplost. - Bouw health-aware selectie met afgebakende retries, cooldowns, reason-coded failures en sessieconsistentie in plaats van blind te roteren na elke fout. - Los 403, 407, 429, navigatietime-outs, DNS- en TLS-fouten op door eerst de laag te identificeren die ze veroorzaakt, voordat je routes wijzigt. - Gebruik een productielijst met observability, geheimbeheer, concurrencylimieten, graceful shutdown en policy-bewust fail-closed gedrag.

Een bekend faalpatroon in Puppeteer is dat de eerste requests nog prima lukken, maar latere requests ineens een 403 of 429 teruggeven, time-outs veroorzaken of op een challenge-pagina belanden. Toch doen veel handleidingen nog steeds alsof roterende proxies maar een configuratiewijziging van twee regels zijn.

Dat is het niet. Het verschil tussen een voorbeeld met alleen de --proxy-server-flag en een onderhoudbaar systeem is enorm. Deze gids behandelt browserbrede rotatie, geauthenticeerde gateways, browser sharding of externe relays, consistente browserprofielen, foutafhandeling op productieniveau en een eerlijk antwoord op wanneer je proxy’s helemaal niet zelf moet beheren.

Wat is een rotating proxy (en waarom heeft Puppeteer er een nodig)?

Een proxy staat tussen jouw Puppeteer-instance en de site die je bezoekt. De site ziet het uitgaande IP-adres van de proxy, niet dat van jouw machine. Een rotating proxy wisselt tussen meerdere uitgaande IP’s — soms per request, soms per sessie — zodat je verkeer niet lijkt op één client die een server duizend keer achter elkaar bestookt.

Puppeteer heeft dit specifiek nodig omdat headless Chrome honderden opeenvolgende requests vanaf één IP verstuurt, en precies dát is het gedrag waar anti-botsystemen op zijn gebouwd. Cloudflare’s eigen documentatie beschrijft meerdere detectielagen die tegelijk draaien — heuristieken, JavaScript-fingerprintcontroles, machine-learningmodellen en anomaliedetectie op gedrag. Een roterend IP-adres pakt maar één van die lagen aan. Slechts één.

Er zijn drie proxytypen die je moet kennen, en die zijn niet uitwisselbaar:

  • Datacenter proxies — goedkoop, snel en afkomstig van hostingproviders. Voor doelen vaak makkelijk te markeren, omdat de ASN (de netwerkblock) duidelijk van een datacenter is en niet van een huishouden.
  • Residential proxies — lopen via echte consumenten-ISP’s, waardoor ze eruitzien als gewone thuisverbindingen. Langzamer en duurder, maar veel geloofwaardiger.
  • Mobile proxies — IP’s van carrier-netwerken, meestal de duurste optie en nuttig wanneer een mobiel-netwerkidentiteit echt nodig is.

Residential exits zijn op basis van ASN-classificatie vaak minder opvallend dan datacenter exits, maar geen van beide categorieën is immuun voor blokkades. Er bestaat geen universeel detectiepercentage: het resultaat hangt af van het doel, de reputatie van het exit-IP, de locatie, sessiegeschiedenis, browserprofiel en het verzoeksgedrag.

Nog een onderscheid dat veel mensen op het verkeerde been zet: een statische lijst die je zelf roteert (jij beheert de pool, kiest het volgende IP en handelt fouten af) is iets anders dan een backconnect/gateway-proxy (je gebruikt één endpoint en de provider roteert de exits achter de schermen). Beide zijn valide; alleen ligt de complexiteit ergens anders.

Waarom rotating proxies instellen in Puppeteer? Veelvoorkomende use-cases

Het eerlijke antwoord is: je hebt rotatie waarschijnlijk niet nodig totdat je het ineens heel hard nodig hebt.

Use caseWaarom rotatie belangrijk is
Prijsmonitoring over productcatalogiHerhaalde catalogusrequests vanaf één IP kunnen rate limits en reputatiesignalen opbouwen
Lead enrichment / contactdata-extractieHerhaalde profielbezoeken vanaf één IP lijken op scraping, niet op browsen, en worden door gedragsengines gemarkeerd
SERP-scrapingZoekmachines zijn een van de strengste systemen als het gaat om IP-throttling en CAPTCHA-gating
Concurrentie-intelligenceLangdurig herhaald scrapen van hetzelfde domein bouwt een fingerprint op die aan jouw IP- en cookiegeschiedenis wordt gekoppeld
ContentaggregatieHoog paginavolume, lage waarde per pagina — precies het trafficpatroon waar botdetectie op is afgestemd

Er is geen vast, citeerbaar getal zoals “Amazon blokkeert bij request 51”. Sites publiceren geen universele drempels, en controles kunnen veranderen op basis van het endpoint, accountstatus, ASN-reputatie en het trafficpatroon. Begin met de laagste toegestane requestfrequentie, valideer niet alleen statuscodes maar ook de inhoud, en voeg rotatie pas toe wanneer gemeten gedrag en het beleid van het doel dat rechtvaardigen.

Drie proxyrotatiestrategieën in Puppeteer: welke heb je nodig?

Vergelijking van drie Puppeteer proxystrategieën: browser herstarten, roterende gateway en browser sharding

Dit is het onderdeel dat de meeste tutorials volledig overslaan, of erger nog: alleen de meest primitieve versie laten zien. Er zijn drie niveaus van granulariteit, en de verkeerde kiezen kost je óf tijd óf maakt een simpel probleem onnodig ingewikkeld.

RotatiestrategieGranulariteitBrowser opnieuw starten?ComplexiteitBeste voor
Per browser (--proxy-server)1 proxy per browserinstanceJaLaagSimpele, kleinschalige scrapes
Gateway-beheerd (proxy-chain + backconnect-endpoint)Provider-/sessiebeleidNeeMiddelmatigGeauthenticeerde roterende gateways
Browser sharding of externe relay1 proxy per browser-shard of relayregelGeen single-process swapHoogGecentraliseerde concurrency en fijnmazige routing

Een korte opmerking voordat je kiest: Puppeteer’s eigen documentatie over netwerkinterceptie is duidelijk dat setRequestInterception geen nette “wissel per request van proxy” is — elk geïntercepteerd request blijft hangen totdat je het expliciet laat doorgaan, beantwoordt of afbreekt. Echte per-request proxy-routing betekent meestal dat requests via een lokale programmeerbare gateway lopen (zoals proxy-chain) in plaats van dat je direct proxies probeert te wisselen in de interceptie-handler. Houd dat in gedachten voordat je je vastlegt op Methode 3 hieronder.

Hoe stel je rotating proxy in Puppeteer in: stap-voor-stap

Moeilijkheid: gemiddeld Benodigde tijd: ~30–45 minuten voor alle drie methoden Wat je nodig hebt: Node.js 18+, npm, een proxy-lijst of provideraccount (formaat: protocol://user:pass@host:port), en de pakketten puppeteer, proxy-chain en puppeteer-extra

Vooraf: wat je nodig hebt voordat je begint

Installeer de kernpakketten:

npm install puppeteer proxy-chain puppeteer-extra puppeteer-extra-plugin-stealth

Haal een proxy-lijst op bij een provider (residential heeft de voorkeur voor alles wat verder gaat dan casual testen) of gebruik op z’n minst een paar testproxy’s om de code te valideren voordat je er echt verzoekvolume op loslaat. Sla inloggegevens op in environment variables — hardcode ze nooit, en zet ze ook nooit in een URL die uiteindelijk in een logbestand belandt.

Methode 1: per browser proxyrotatie met --proxy-server

Dit is de basis waar iedereen mee begint, en terecht — het is voorspelbaar. Puppeteer’s LaunchOptions beschrijft args als de ondersteunde manier om Chrome-command-lineflags mee te geven, en --proxy-server is een native Chromium-flag.

import puppeteer from 'puppeteer';

const proxyPool = [
  'http://proxy1.example:8080',
  'http://proxy2.example:8080',
  'http://proxy3.example:8080',
];

let proxyIndex = 0;

async function scrapeWithRotation(url) {
  const proxy = proxyPool[proxyIndex % proxyPool.length];
  proxyIndex++;

  const browser = await puppeteer.launch({
    headless: true,
    args: [`--proxy-server=${proxy}`],
  });

  const page = await browser.newPage();

  // Als je proxy authenticatie vereist, moet dit vóór elke navigatie gebeuren
  await page.authenticate({
    username: process.env.PROXY_USER,
    password: process.env.PROXY_PASS,
  });

  await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30_000 });
  const content = await page.content();

  await browser.close(); // sluiten vóór je van proxy wisselt
  return content;
}

Let op dat page.authenticate() volgens Puppeteer’s eigen documentatie stilletjes request interception inschakelt op de achtergrond — een kleine prestatiekost, maar wel belangrijk om te weten als je aan het debuggen bent waarom dingen trager lijken dan verwacht.

Verwacht resultaat: elke call start een frisse browser die aan een andere proxy hangt. Om te roteren sluit je de browser en start je opnieuw — daar kom je niet onderuit, en dat brengt opstartoverhead met zich mee. Voor een scrape van 50 pagina’s zal dit merkbaar trager zijn dan de andere twee methoden, puur door de browser-opstarttijd.

Wanneer gebruiken: scripts met lage concurrency, eenmalige scrapes, situaties waarin eenvoudiger debuggen belangrijker is dan snelheid.

Methode 2: geauthenticeerde roterende gateway met proxy-chain

Chrome accepteert geen proxy-URL’s waarin user:pass@host is ingebed. Het pakket proxy-chain (onderhouden door Apify) lost dat authenticatieprobleem op door lokaal een anonieme proxy op te zetten die doorverwijst naar je geauthenticeerde upstream. Als die upstream een roterende of backconnect-gateway van een provider is, wisselt de provider de exits achter dat ene endpoint op basis van het sessiebeleid. proxy-chain zelf wijst niet automatisch een andere proxy toe aan elke bestaande Puppeteer-pagina.

import puppeteer from 'puppeteer';
import { anonymizeProxy, closeAnonymizedProxy } from 'proxy-chain';

async function scrapeThroughGateway(upstreamProxyUrl, targetUrl) {
  const localProxy = await anonymizeProxy(upstreamProxyUrl);
  let browser;

  try {
    browser = await puppeteer.launch({
      headless: true,
      args: [`--proxy-server=${localProxy}`],
    });
    const page = await browser.newPage();
    await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
    return await page.content();
  } finally {
    if (browser) await browser.close();
    await closeAnonymizedProxy(localProxy, true); // altijd opruimen
  }
}

Die finally-block is niet voor de vorm — achtergebleven lokale proxyservers lekken poorten, en ik heb scrapers meegemaakt die ’s nachts stilletjes hun beschikbare file descriptors leeg aten omdat niemand de geanonimiseerde proxy sloot. proxy-chain geeft ook specifieke foutcodes terug (593 voor DNS-problemen, 594 voor connection refused, 597 voor authenticatiefouten) die echt nuttig zijn voor het classificeren van fouten — daar kom ik later op terug.

Wanneer gebruiken: geauthenticeerde residential/datacenter gateways waarbij rotatie wordt bepaald door het endpoint of de sessieparameters van de provider. Als je meerdere vaste proxy-identiteiten tegelijk nodig hebt, gebruik dan aparte browserprocessen (browser sharding) of een speciaal gebouwde externe relay; native Puppeteer biedt geen ondersteunde per-page proxy-instelling.

Methode 3: per request routing vereist een externe relay

Dit is de optie met de hoogste granulariteit — theoretisch kan elke afbeelding, script en API-call op een pagina via een andere exit lopen. In de praktijk is dit de fragielste en minst gedocumenteerde aanpak, omdat Puppeteer’s request interception is ontworpen om requests te filteren en aan te passen, niet om het netwerktransport per request te wisselen.

import puppeteer from 'puppeteer';

async function inspectRequests(url) {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();

  await page.setRequestInterception(true);

  page.on('request', async (request) => {
    // In de praktijk vereist echt per-request proxy-wisselen routing
    // via een lokale relay (proxy-chain) in plaats van het browsertransport
    // halverwege te veranderen — Chrome ondersteunt dat niet.
    // De meeste productie-opstellingen gebruiken deze handler om resourcetypen
    // te filteren/aborten, en combineren dat met browser sharding of een gateway.
    if (['image', 'font', 'stylesheet'].includes(request.resourceType())) {
      request.abort();
    } else {
      request.continue();
    }
  });

  await page.goto(url, { waitUntil: 'networkidle2' });
  await browser.close();
}

Eerlijk gezegd: echte per-request IP-wissels binnen Puppeteer worden niet geboden door setRequestInterception(). Als je die granulariteit echt nodig hebt, routeer Chrome dan via een programmeerbare externe relay of gebruik een scraping framework dat rond proxy-sessies is gebouwd. Voor de meeste projecten is één proxy per browser-shard of een provider-beheerde roterende gateway eenvoudiger te beheren én te auditen.

De volledige anti-detectiestack: roterende proxies alleen houden je niet ongebanned

Een veelgehoorde klacht is: “Ik gebruik proxies en word nog steeds geblokkeerd.” Het IP-adres is maar één van de signalen die een modern botsysteem kan evalueren, en alleen dat roteert terwijl de rest inconsistent blijft, kan juist een sterker anomaliepatroon opleveren. Een browser die beweert Windows Chrome te zijn terwijl de client hints, tijdzone of locale iets anders zeggen, is daar een duidelijk voorbeeld van.

Laag 1: roterende residential proxies

Zoals hierboven besproken — residential exits zijn vaak geloofwaardiger dan datacenter exits, maar er bestaat geen universele minimale poolgrootte. Bepaal de poolgrootte op basis van gemeten requestvolume, sessieduur, cooldowns en het hergebruikgedrag van je provider, niet op basis van een willekeurig aantal IP’s.

Laag 2: stealth-plugin om headless Chrome-signalen te maskeren

puppeteer-extra-plugin-stealth patcht een set bekende headless-signalen: navigator.webdriver, WebGL-vendorstrings, ontbrekende Chrome runtime-objecten en een handvol andere CDP-lekken. Het is een echt bruikbare compatibiliteitslaag, maar de README van het project zelf is verfrissend eerlijk: dit blijft een kat-en-muisspel en volledige preventie is waarschijnlijk niet mogelijk. Zie het als basis, niet als garantie.

Laag 3: consistente browserprofielen en verantwoord tempo

User-agent strings moeten intern consistent zijn met alles wat de browser verder rapporteert. Chrome’s User-Agent Client Hints geven gestructureerde platformdata vrij, dus een handmatig geschreven user-agentstring kan botsen met het echte platform. Gebruik bij voorkeur de user agent van de meegeleverde Chrome-build, houd viewport/locale/tijdzone binnen één sessie stabiel, en doseer requests conservatief in plaats van voor elke pagina een nieuw fingerprint te verzinnen.

Hier zijn alle drie lagen samen in één launchconfiguratie:

import puppeteer from 'puppeteer-extra';
import StealthPlugin from 'puppeteer-extra-plugin-stealth';
import { anonymizeProxy, closeAnonymizedProxy } from 'proxy-chain';

puppeteer.use(StealthPlugin());

function boundedDelay(minMs = 800, maxMs = 1800) {
  return new Promise((r) => setTimeout(r, minMs + Math.random() * (maxMs - minMs)));
}

async function stableProfileScrape(targetUrl, upstreamProxy) {
  const localProxy = await anonymizeProxy(upstreamProxy);
  let browser;

  try {
    browser = await puppeteer.launch({
      headless: true,
      args: [`--proxy-server=${localProxy}`, '--lang=en-US'],
    });
    const page = await browser.newPage();
    await page.setViewport({ width: 1366, height: 768 });
    await boundedDelay();
    await page.goto(targetUrl, { waitUntil: 'domcontentloaded' });
    return await page.content();
  } finally {
    if (browser) await browser.close();
    await closeAnonymizedProxy(localProxy, true);
  }
}

Dit is het blok dat concurrerende gidsen meestal nooit laten zien — proxy, stealth en fingerprint-randomisatie op één plek, direct klaar om te kopiëren en aan te passen.

Foutafhandeling op productieniveau en proxy-healthchecks

State machine voor proxy pool-health bij 403, 407, 429, time-outs, cooldown en quarantaine

De meeste tutorials stoppen zodra het happy path werkt. Echte scraping faalt voortdurend — proxies vallen uit, credentials verlopen, targets rate-limiten je halverwege een run — en dat los je niet op door op het beste te hopen.

Retry-logica met exponential backoff en jitter

function backoffMs(attempt, base = 1000, cap = 30_000) {
  const exponential = Math.min(cap, base * 2 ** attempt);
  return Math.floor(exponential * (0.5 + Math.random() * 0.5)); // jitter voorkomt thundering herd
}

async function withRetry(fn, maxRetries = 4) {
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    try {
      return await fn();
    } catch (err) {
      if (attempt === maxRetries) throw err;
      const delay = backoffMs(attempt);
      console.warn(`Poging ${attempt + 1} mislukt: ${err.message}. Opnieuw proberen over ${delay}ms`);
      await new Promise((r) => setTimeout(r, delay));
    }
  }
}

Mislukte proxies automatisch op de blacklist zetten

const proxyStats = new Map(); // proxyUrl -> { success, failure }

function recordResult(proxyUrl, success) {
  const stats = proxyStats.get(proxyUrl) || { success: 0, failure: 0 };
  success ? stats.success++ : stats.failure++;
  proxyStats.set(proxyUrl, stats);
}

function isHealthy(proxyUrl) {
  const stats = proxyStats.get(proxyUrl);
  if (!stats) return true;
  const total = stats.success + stats.failure;
  if (total < 5) return true; // nog onvoldoende data
  return stats.failure / total < 0.5; // blacklist als failure-rate boven 50% komt
}

function getHealthyProxy(pool) {
  const healthy = pool.filter(isHealthy);
  if (healthy.length === 0) throw new Error('Geen gezonde proxies meer in de pool');
  return healthy[Math.floor(Math.random() * healthy.length)];
}

Houd niet alleen pass/fail bij, maar ook fouttypen — een 407 (verkeerde credentials) en een 429 (rate limit) vragen totaal andere reacties. Een proxy met authenticatiefouten blijven bestoken met snelle retries verspilt alleen tijd; de oplossing is credentials controleren, niet sneller roteren.

Veelvoorkomende rotating-proxyfouten in Puppeteer oplossen

FoutWaarschijnlijke oorzaakOplossing
ERR_PROXY_CONNECTION_FAILEDProxy down of onbereikbaarVerwijder uit de pool, probeer de volgende proxy
407 Proxy Authentication RequiredVerkeerde credentials of niet-ondersteunde authControleer page.authenticate()-gegevens; gebruik proxy-chain voor auth in de URL
TimeoutErrorTrage proxy of blokkade door targetVerhoog timeout; stap over op een residential proxy
403 ForbiddenIP of fingerprint gemarkeerdRoteer proxy + activeer stealth + randomiseer UA
ERR_TUNNEL_CONNECTION_FAILEDProbleem met HTTPS-tunnelControleer ondersteuning voor de CONNECT-methode; probeer lokale tunneling via proxy-chain

Een paar dingen die niet netjes in de tabel passen maar wel belangrijk zijn: een 200-statuscode betekent niet automatisch succes. Soft blocks geven vaak een volledig gerenderde HTML-pagina terug — een login wall of challenge-scherm — met een normale statuscode, dus valideer de echte inhoud, niet alleen de response-status. En als je vastloopt, adviseert Puppeteer’s debugginggids om te draaien met headless: false, slowMo toe te voegen en NODE_DEBUG="puppeteer:*" in te stellen voor uitgebreide protocol logs — maar let op: die logs kunnen gevoelige requestgegevens bevatten, dus laat ze niet aanstaan tegen productiecredentials.

Zelf proxyrotatie beheren vs. proxygateway vs. AI-extractie-API

CriteriaZelf beheerde lijstrotatieBackconnect-gateway (Bright Data, Oxylabs, Decodo)AI-extractie-API (Thunderbit)
Kosten (laag volume)Laag tot middelmatigMiddelmatig–hoog per GBLaag (free tier, daarna per unit)
BetrouwbaarheidAfhankelijk van je healthchecksHoog (door provider beheerd)Hoog (managed infrastructuur)
Anti-detectieDIY — jij bouwt hetGedeeltelijk (alleen IP-rotatie)Ingebouwd
Gestructureerde outputNee (ruwe HTML)Nee (ruwe HTML)Ja (JSON via schema)
Setup-tijdUrenMinutenMinuten
ControleVolledigBeperkt tot de API van de providerBeperkt tot het schema-model

De actuele prijzen van leveranciers (gecontroleerd op 2026-08-07) geven een goed beeld van de kostenkant van de gateway-optie: Bright Data’s residential-pricing biedt pay-as-you-go en volumepakketten waarvan promoties kunnen wijzigen; Oxylabs toont $6/GB bij 5 GB en $2,50/GB bij 1 TB; en Decodo (voorheen Smartproxy) toont $3,75/GB bij 3 GB, $2,75/GB bij 100 GB en een pay-as-you-go-aanbod van $4/GB. Decodo adverteert ook met een IP-pool van 115M+ en een succespercentage van 99,92% — claims van de leverancier, geen onafhankelijk gereproduceerde benchmarks.

De beslisregel die ik zelf gebruik: moet je met de pagina interacteren — klikken, scrollen, formulieren invullen, een login-sessie behouden? Bouw dan met Puppeteer en proxies. Heb je alleen de data nodig die al op de pagina staat? Kijk dan eerst naar een extraction API voordat je proxy-infrastructuur bouwt die je voor altijd moet onderhouden.

Wanneer Puppeteer + proxies overkill is: haal gestructureerde data op met een API

Na de derde keer dat ik een proxy-healthcheck-systeem opnieuw bouwde voor een project dat alleen productprijzen in een spreadsheet nodig had, viel het kwartje: een groot deel van deze infrastructuur bestaat om een probleem op te lossen — ruwe HTML van een pagina halen — dat eigenlijk niet het echte doel van de ontwikkelaar is. Het doel is gestructureerde data. HTML is slechts het vervelende tussenformaat.

Thunderbit’s Open API behandelt extractie als de primaire handeling in plaats van als bijproduct van browserautomatisering. POST /extract neemt een URL en een JSON Schema aan en geeft gematchte gestructureerde data terug — met JS-rendering, anti-botmaatregelen en CAPTCHAs aan de backendkant, in plaats van dat je zelf stealth-plugins en proxy-pools hoeft te koppelen:

curl -X POST https://openapi.thunderbit.com/openapi/v1/extract \
  -H "Authorization: Bearer $BIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/product",
    "schema": {
      "type": "object",
      "properties": {
        "name": {"type": "string"},
        "price": {"type": "number"}
      },
      "required": ["name", "price"]
    }
  }'

Er is ook een POST /distill-endpoint voor gevallen waarin je gewoon schone Markdown wilt in plaats van een strikt schema, plus batch-extractie om hetzelfde schema in één call over meerdere URLs uit te voeren. Volgens Thunderbit’s actuele API-pricing kost Distill 1 unit per pagina en Extract 20 units per pagina — de free tier bevat 600 eenmalige units, genoeg om de workflow te testen voordat je echt verplichtingen aangaat.

Voor developers die werken binnen Claude, Cursor of een andere MCP-compatibele client, biedt Thunderbit bovendien thunderbit_extract en thunderbit_distill als MCP-tools, zodat een agent tijdens een taak kan beslissen wanneer hij data van een pagina moet ophalen in plaats van dat daar een aparte scrapingstap voor nodig is. Ik zou wel de live API-reference checken voordat je een MCP-configuratie inricht, omdat toolnamen en parameters tussen documentversies kunnen veranderen.

OnderdeelPuppeteer + rotating proxiesThunderbit API
Setup-complexiteitHoog — proxy-pool, rotatielogica, stealth, retriesLaag — één API-call met JSON Schema
Anti-bothandelingHandmatigIngebouwd
OutputRuwe HTML (parsing nodig)Gestructureerde JSON die bij je schema past
OnderhoudHoog — selectors breken, proxies slijtenLaag
Beste voorMaatwerkautomatisering, loginflows, niche-interactiesData-extractie op schaal

Om de doe-het-zelfroute recht te doen: als je use-case inhoudt dat je moet inloggen op een account, door een meerstapsflow moet klikken of iets moet doen waarbij je state over een sessie moet vasthouden, kan een extraction API dat meestal niet vervangen — Thunderbit’s eigen FAQ is daar duidelijk over: interactieve loginflows worden momenteel niet ondersteund via de API. Daar wint Puppeteer plus proxies dus nog steeds. Maar als de opdracht is: “haal data van een hoop publieke pagina’s en zet die in een schema dat ik definieer”, dan los je met je eigen proxyrotatiestack een moeilijker probleem op dan je eigenlijk hebt. Voor teams die liever helemaal geen code schrijven, biedt de Thunderbit Chrome Extension dezelfde AI-gedreven extractie via een klik-en-klaar-interface — zeker het bekijken waard als je no-code webscraping afweegt tegen een volledige developersetup.

Conclusie en belangrijkste lessen

Rotating proxies in Puppeteer zijn niet één techniek. Per-browserrotatie is eenvoudig en geïsoleerd. Een geauthenticeerde backconnect-gateway kan exits roteren achter één browserbreed endpoint. Fijngranulaire per-request- of gelijktijdige identiteiten vereisen browser sharding of een externe relay; request interception alleen verandert de netwerkroute van Chrome niet.

Maar geen van dat alles helpt veel zonder de rest van de stack. Proxies lossen het IP-reputatieprobleem op; stealth-plugins en consistente fingerprints lossen het browser-signaalprobleem op; jitter en pacing lossen het gedragsprobleem op. Sla je een laag over, dan kun je nog steeds geblokkeerd worden — alleen om een andere reden.

Als je dit zelf bouwt, begin dan met de proxy-chain repository en de codeblokken hierboven — daarmee kom je verder dan de meeste betaalde cursussen. Als je liever helemaal geen proxybeheer doet en gewoon gestructureerde data terugkrijgt, zijn Thunderbit’s API-docs tien minuten van je tijd waard voordat je een weekend steekt in het bouwen van healthcheck-infrastructuur die je voor altijd moet onderhouden. Beide routes zijn legitiem — zorg alleen dat je het probleem oplost dat je echt hebt, niet het probleem waarvan elke tutorial aanneemt dat je het hebt. Voor een bredere blik op hoe AI dit vakgebied verandert, bekijk onze diepere duik in AI web scraping en hoe dat zich verhoudt tot traditionele aanpakken.

FAQ’s

Hoe vaak moet ik proxies roteren in Puppeteer?

Dat hangt af van hoe streng de rate limiting van het doel is. Bij sites met strikte botdetectie roteer je per pagina of per sessie. Bij soepelere sites kan per sessie — of zelfs één sticky IP voor de hele scrape-run — prima werken. Er is geen universeel getal; zie 403’s, 429’s en time-outs als je signaal om agressiever te roteren, niet als een vast requestaantal.

Kan ik gratis proxies gebruiken voor Puppeteer-scraping?

Technisch wel, maar ik zou het voor niets meer dan snelle tests aanraden. Gratis proxy-lijsten zijn meestal traag, onbetrouwbaar en vaak al door de sites die je probeert te scrapen geblokkeerd. Voor productiegebruik zijn residential proxies van een betaalde provider of een managed gateway de kosten meestal waard.

Werkt puppeteer-extra-plugin-stealth tegen alle anti-botsystemen?

Nee, en dat zegt de documentatie van de plugin zelf ook. De plugin vermindert een aantal bekende headless-Chrome-signalen, maar een target kan nog steeds netwerkreputatie, TLS-kenmerken, cookies, client hints en gedrag evalueren. Zie de plugin als één compatibiliteitslaag, niet als garantie.

Wat is het verschil tussen proxy-chain en --proxy-server in Puppeteer?

--proxy-server is een native Chromium-launchflag die één proxyendpoint aan een volledige browserinstance koppelt, en Chrome accepteert daar geen ingebedde proxycredentials. proxy-chain creëert een lokale anonieme tunnel naar een geauthenticeerde upstream. Rotatie komt daarna uit het opnieuw starten met een andere upstream, een provider-beheerde backconnect-gateway of een apart gebouwde relay — niet doordat proxy-chain proxies aan losse Puppeteer-pagina’s toewijst.

Zijn rotating proxies genoeg om volledige blokkades te voorkomen?

Nee — en dat is de meest voorkomende misvatting. Moderne anti-botsystemen zoals Cloudflare’s bot management correleren IP-reputatie met browserfingerprint, gedragspatronen en sessiegeschiedenis. Proxies lossen het IP-reputatiegedeelte op; je hebt nog steeds stealthconfiguratie, consistente fingerprints en realistische timing nodig om op andere signalen niet gemarkeerd te worden.

Meer lezen

Ke
Ke
CTO bij Thunderbit | Senior Data Scientist & ML-expert Met bijna tien jaar ervaring in machine learning en data science is Ke Shen alumnus van Columbia University en voormalig Senior Data Scientist bij Walmart Labs. Met diepgaande, door vakgenoten erkende expertise in Python, R, Java en statistiek deelt hij praktijkgerichte inzichten over hoe je complexe AI-algoritmen van theorie naar productieklare architectuur brengt.
Topics
Puppeteer proxyrotatieProxyrotatieBrowserautomatisering
Inhoudsopgave
Thunderbit · AI webdata-agent

Extraheer gegevens van elke pagina in 1 klik

Vertrouwd door meer dan 250.000 gebruikers
Gratis abonnement beschikbaar
Extraheer gegevens met AI
Zet gegevens eenvoudig over naar Google Sheets, Airtable of Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week