Menyiapkan Rotating Proxy di Puppeteer Tanpa Kena Blokir

Terakhir diperbarui pada August 10, 2026
Hand-drawn diagram of a Puppeteer-controlled browser rotating requests through multiple proxy nodes
Ringkasan AI
  • Bandingkan arsitektur rotasi Puppeteer yang praktis, termasuk relaunch browser per proxy, rotasi yang dikelola gateway, pool browser terisolasi, dan browser sharding.
  • Pelajari di mana kredensial proxy seharusnya ditempatkan, bagaimana HTTPS CONNECT mengubah jalur request, dan kenapa autentikasi di level page saja belum tentu menyelesaikan kegagalan launch browser atau tunnel.
  • Bangun pemilihan proxy yang sadar kesehatan dengan retry terbatas, cooldown, failure dengan kode alasan, dan konsistensi sesi, alih-alih merotasi secara membabi buta setiap kali error.
  • Troubleshoot kegagalan 403, 407, 429, timeout navigasi, DNS, dan TLS dengan mengidentifikasi lapisan yang memunculkannya sebelum mengganti rute.
  • Gunakan checklist produksi yang mencakup observabilitas, pengelolaan secret, batas concurrency, graceful shutdown, dan perilaku fail-closed yang selaras kebijakan.

Pola kegagalan yang sering muncul di Puppeteer biasanya seperti ini: permintaan pertama berhasil, lalu permintaan berikutnya dibalas 403 atau 429, timeout, atau malah dialihkan ke halaman challenge. Tapi banyak panduan masih memperlakukan rotating proxy seolah-olah cukup disetel dengan dua baris konfigurasi saja.

Padahal tidak sesederhana itu. Jarak antara contoh “tambahkan flag --proxy-server” dan sistem yang benar-benar gampang dirawat itu sangat jauh. Panduan ini membahas rotasi di level browser, gateway dengan autentikasi, browser sharding atau relay eksternal, profil browser yang konsisten, penanganan error yang layak untuk produksi, dan jawaban jujur tentang kapan sebaiknya Anda tidak mengelola proxy sama sekali.

Apa Itu Rotating Proxy (dan Kenapa Puppeteer Membutuhkannya)?

Proxy berada di antara instance Puppeteer Anda dan situs tujuan. Situs akan melihat IP keluar milik proxy, bukan IP mesin Anda. Rotating proxy akan berganti-ganti dari kumpulan IP keluar tersebut — bisa per request, bisa per sesi — supaya trafik Anda tidak kelihatan seperti satu klien yang menghantam server ribuan kali berturut-turut.

Puppeteer sangat membutuhkannya karena Chrome headless yang mengirim ratusan request berurutan dari satu IP adalah pola yang memang ingin dideteksi sistem anti-bot. Dokumentasi Cloudflare sendiri menjelaskan bahwa ada beberapa lapisan deteksi yang berjalan bareng-bareng — heuristik, pemeriksaan fingerprint JavaScript, model machine learning, dan deteksi anomali perilaku. Mengganti IP cuma menyelesaikan satu lapisan itu. Cuma satu.

Ada tiga jenis proxy yang penting dipahami, dan ketiganya tidak bisa saling menggantikan begitu saja:

  • Datacenter proxy — murah, cepat, dan berasal dari penyedia hosting. Mudah ditandai oleh target karena ASN-nya jelas data center, bukan koneksi rumahan.
  • Residential proxy — lewat ISP konsumen sungguhan, jadi terlihat seperti koneksi internet rumah biasa. Lebih lambat dan lebih mahal, tetapi jauh lebih meyakinkan.
  • Mobile proxy — IP dari jaringan operator seluler, biasanya yang paling mahal, dan berguna jika identitas jaringan mobile memang dibutuhkan.

Exit residential sering kali lebih sulit dikenali hanya dari klasifikasi ASN dibanding exit datacenter, tetapi keduanya tetap bisa diblokir. Tidak ada angka deteksi universal: hasilnya tergantung pada target, reputasi exit, lokasi, histori sesi, profil browser, dan pola request.

Satu perbedaan lagi yang sering bikin orang bingung: daftar statis yang Anda rotasi sendiri (Anda mengelola pool, memilih IP berikutnya, menangani kegagalan) berbeda dari backconnect/gateway proxy (Anda hanya mengarah ke satu endpoint, lalu provider yang mengganti exit di belakang layar). Keduanya valid; bedanya cuma di mana kompleksitasnya diletakkan.

Kenapa Menyiapkan Rotating Proxy di Puppeteer? Contoh Penggunaan Umum

Jawaban jujurnya: Anda mungkin belum butuh rotasi sampai memang butuh, dan begitu sudah butuh, biasanya kebutuhannya memang mendesak.

Kasus PenggunaanKenapa Rotasi Penting
Pemantauan harga di katalog produkRequest berulang ke katalog dari satu IP bisa memicu rate limit dan sinyal reputasi
Enrichment lead / ekstraksi data kontakKunjungan profil berulang dari satu IP terlihat seperti scraping, bukan browsing, dan mudah terdeteksi oleh engine perilaku
Scraping SERPMesin pencari termasuk yang paling agresif dalam throttling berbasis IP dan CAPTCHA
Intel kompetitorScraping domain yang sama berulang-ulang selama berhari-hari membentuk fingerprint yang terikat ke IP dan histori cookie Anda
Agregasi kontenVolume halaman tinggi, nilai per halaman rendah — persis bentuk trafik yang dirancang untuk dideteksi bot

Tidak ada angka baku yang bisa dikutip seperti “Amazon memblokir di request ke-51.” Situs tidak mempublikasikan ambang universal, dan kontrol bisa berubah tergantung endpoint, status akun, reputasi ASN, dan bentuk trafik. Mulailah dari laju request terendah yang diizinkan, validasi konten sekaligus status code, lalu tambahkan rotasi hanya saat perilaku terukur dan kebijakan target memang membenarkannya.

Tiga Strategi Rotasi Proxy di Puppeteer: Mana yang Anda Butuhkan?

Perbandingan tiga strategi proxy Puppeteer: relaunch browser, rotating gateway, dan browser sharding

Bagian ini sering dilewati sebagian besar tutorial, atau malah cuma menampilkan versi yang paling kasar. Ada tiga tingkat granularitas, dan memilih yang salah bisa buang waktu atau bikin pekerjaan sederhana jadi terlalu rumit.

Strategi RotasiGranularitasPerlu Restart Browser?KompleksitasPaling Cocok Untuk
Per-browser (--proxy-server)1 proxy per instance browserYaRendahScrape sederhana dengan volume kecil
Dikelola gateway (proxy-chain + backconnect endpoint)Kebijakan provider/sesiTidakMenengahGateway rotating yang memakai autentikasi
Browser sharding atau relay eksternal1 proxy per shard browser atau aturan relayTidak ada swap satu prosesTinggiConcurrency terkontrol dan routing yang lebih presisi

Catatan singkat sebelum memilih: dokumentasi network interception milik Puppeteer menjelaskan dengan tegas bahwa setRequestInterception bukan sakelar yang bersih untuk “ganti proxy per request” — setiap request yang diintersep akan tertahan sampai Anda secara eksplisit meneruskan, merespons, atau membatalkannya. Routing proxy yang benar-benar per request biasanya berarti menjalankan request lewat gateway lokal yang bisa diprogram (seperti proxy-chain), bukan menggonta-ganti proxy langsung di handler interception. Ingat ini sebelum Anda memutuskan memakai Metode 3 di bawah.

Cara Menyiapkan Rotating Proxy di Puppeteer: Panduan Langkah demi Langkah

Tingkat Kesulitan: Menengah
Waktu yang Dibutuhkan: ~30–45 menit untuk ketiga metode
Yang Anda Butuhkan: Node.js 18+, npm, daftar proxy atau akun provider (format: protocol://user:pass@host:port), serta paket puppeteer, proxy-chain, dan puppeteer-extra

Prasyarat: Apa yang Harus Disiapkan Sebelum Mulai

Instal paket intinya:

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

Ambil daftar proxy dari provider (residential lebih disarankan untuk kebutuhan selain testing ringan) atau setidaknya beberapa proxy uji untuk memvalidasi kode sebelum Anda menghabiskan request sungguhan. Simpan kredensial di environment variables — jangan pernah hardcode, dan jangan masukkan ke URL yang bisa ikut tercatat di log file.

Metode 1: Rotasi Proxy Per Browser dengan --proxy-server

Ini adalah titik awal yang paling umum, dan alasannya jelas — gampang dipahami. Dokumentasi LaunchOptions milik Puppeteer menjelaskan bahwa args adalah cara yang didukung untuk mengirim flag command-line Chrome, dan --proxy-server memang flag native Chromium.

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();

  // Jika proxy Anda butuh autentikasi, ini harus dijalankan sebelum navigasi apa pun
  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(); // tutup dulu sebelum pindah proxy
  return content;
}

Perhatikan bahwa page.authenticate() diam-diam mengaktifkan request interception di balik layar, menurut dokumentasi Puppeteer sendiri — ada biaya performa kecil yang layak diketahui sebelum Anda bingung kenapa semuanya terasa lebih lambat dari yang diharapkan.

Hasil yang diharapkan: setiap pemanggilan membuka browser baru yang terikat ke proxy berbeda. Untuk melakukan rotasi, Anda harus menutup lalu membuka ulang browser — tidak ada jalan lain untuk menghindari overhead startup. Untuk scrape 50 halaman, metode ini biasanya terasa jauh lebih lambat dibanding dua metode lainnya, murni karena waktu boot browser.

Kapan digunakan: skrip dengan concurrency rendah, scrape sekali jalan, atau situasi di mana kesederhanaan debugging lebih penting daripada kecepatan.

Metode 2: Rotating Gateway dengan Autentikasi Menggunakan proxy-chain

Chrome tidak menerima kredensial user:pass@host yang disisipkan langsung ke URL proxy. Paket proxy-chain (dipelihara oleh Apify) menyelesaikan masalah autentikasi ini dengan membuat proxy anonim lokal yang meneruskan koneksi ke upstream yang diautentikasi. Jika upstream tersebut adalah gateway rotating atau backconnect milik provider, provider itulah yang mengganti IP keluar di belakang endpoint itu sesuai kebijakan sesi. proxy-chain sendiri tidak menetapkan proxy berbeda ke setiap page Puppeteer yang sudah ada.

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); // selalu bersihkan
  }
}

Blok finally itu bukan sekadar formalitas — proxy lokal yang tidak ditutup akan ninggalin port terbuka, dan saya pernah melihat scraper menghabiskan file descriptor secara diam-diam semalaman karena tidak ada yang menutup anonymized proxy. proxy-chain juga menampilkan kode error spesifik (593 untuk masalah DNS, 594 untuk connection refused, 597 untuk auth failure) yang sangat berguna untuk mengelompokkan kegagalan — nanti akan dibahas lagi.

Kapan digunakan: gateway residential/datacenter yang diautentikasi, di mana rotasi dikendalikan oleh endpoint provider atau parameter sesi. Kalau Anda butuh beberapa identitas proxy tetap yang berjalan bersamaan, gunakan proses browser terpisah (browser sharding) atau relay eksternal yang memang dirancang khusus; Puppeteer native tidak menyediakan pengaturan proxy per page yang didukung.

Metode 3: Routing Per Request Membutuhkan Relay Eksternal

Ini opsi dengan granularitas paling tinggi — secara teori, setiap image, script, dan panggilan API di satu halaman bisa diarahkan ke exit yang berbeda. Dalam praktiknya, ini adalah pendekatan yang paling rapuh dan paling sedikit didokumentasikan, karena request interception di Puppeteer dibuat untuk memfilter dan memodifikasi request, bukan untuk mengganti transport jaringan per request.

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) => {
    // Dalam praktiknya, penggantian proxy per request secara nyata membutuhkan routing
    // lewat relay lokal (proxy-chain), bukan mengganti transport browser di tengah jalan —
    // Chrome tidak mendukung itu.
    // Sebagian besar setup produksi memakai handler ini untuk memfilter/membatalkan tipe resource,
    // lalu dipasangkan dengan browser sharding atau gateway.
    if (['image', 'font', 'stylesheet'].includes(request.resourceType())) {
      request.abort();
    } else {
      request.continue();
    }
  });

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

Pandangan jujur: pergantian IP per request secara nyata di dalam Puppeteer tidak disediakan oleh setRequestInterception(). Kalau Anda benar-benar membutuhkan granularitas seperti itu, arahkan Chrome melalui relay eksternal yang bisa diprogram atau gunakan framework scraping yang dibangun di atas proxy session. Untuk kebanyakan proyek, satu proxy per browser shard atau gateway rotating yang dikelola provider jauh lebih mudah dioperasikan dan diaudit.

Stack Anti-Deteksi Lengkap: Rotating Proxy Saja Tidak Cukup Agar Tidak Kena Blokir

Keluhan yang sering muncul adalah: “Saya sudah pakai proxy tapi tetap diblokir.” Alamat IP hanya salah satu dari beberapa sinyal yang bisa dievaluasi sistem bot modern, dan mengganti IP sementara yang lain tetap tidak konsisten justru bisa menciptakan anomali yang lebih kuat. Browser yang mengaku Windows Chrome tetapi client hints, timezone, atau locale-nya bilang hal lain adalah contoh yang sangat mencolok.

Lapisan 1: Rotating Residential Proxy

Sudah dibahas di atas — exit residential sering lebih meyakinkan daripada exit datacenter, tetapi tidak ada ukuran pool minimum yang universal. Sesuaikan ukuran pool berdasarkan volume request terukur, durasi sesi, cooldown, dan perilaku reuse dari provider, bukan berdasarkan angka IP asal tebak.

Lapisan 2: Stealth Plugin untuk Menutupi Sinyal Chrome Headless

puppeteer-extra-plugin-stealth menambal sejumlah tanda khas headless yang sudah dikenal: navigator.webdriver, string vendor WebGL, objek Chrome runtime yang hilang, dan beberapa kebocoran CDP lainnya. Ini lapisan kompatibilitas yang memang berguna, tetapi README proyeknya sendiri dengan jujur menyatakan bahwa ini adalah permainan kucing-dan-tikus dan pencegahan total kemungkinan besar tidak mungkin. Anggap ini sebagai baseline, bukan jaminan.

Lapisan 3: Profil Browser yang Konsisten dan Pacing yang Wajar

String user-agent harus konsisten dengan semua hal lain yang dilaporkan browser. User-Agent Client Hints milik Chrome mengekspos data platform yang terstruktur, jadi user-agent yang ditulis manual bisa bertabrakan dengan platform sebenarnya. Lebih baik gunakan user agent dari build Chrome bawaan, jaga viewport/locale/timezone tetap stabil dalam satu sesi, dan atur laju request secara konservatif alih-alih menciptakan fingerprint baru untuk setiap halaman.

Berikut contoh ketiga lapisan tersebut dirangkai dalam satu konfigurasi launch:

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);
  }
}

Inilah blok yang paling jarang ditampilkan panduan lain — proxy, stealth, dan randomisasi fingerprint dalam satu tempat, siap disalin dan diadaptasi.

Penanganan Error dan Pemeriksaan Kesehatan Proxy yang Siap Produksi

State machine kesehatan proxy pool untuk penanganan 403, 407, 429, timeout, cooldown, dan quarantine

Sebagian besar tutorial berhenti begitu jalur suksesnya bekerja. Scraping di dunia nyata terus gagal — proxy mati, kredensial kedaluwarsa, target membatasi laju di tengah proses — dan semua itu tidak akan tertangani cuma dengan berharap yang terbaik.

Retry dengan Exponential Backoff dan 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 mencegah 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(`Percobaan ${attempt + 1} gagal: ${err.message}. Mencoba lagi dalam ${delay}ms`);
      await new Promise((r) => setTimeout(r, delay));
    }
  }
}

Auto-Blacklist Proxy yang Gagal

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; // datanya belum cukup
  return stats.failure / total < 0.5; // blacklist jika tingkat gagal melebihi 50%
}

function getHealthyProxy(pool) {
  const healthy = pool.filter(isHealthy);
  if (healthy.length === 0) throw new Error('Tidak ada proxy sehat yang tersisa di pool');
  return healthy[Math.floor(Math.random() * healthy.length)];
}

Pantau jenis error, bukan cuma lolos/gagal — 407 (kredensial salah) dan 429 (rate limit) butuh respons yang sama sekali berbeda. Menyerang proxy yang gagal autentikasi dengan retry cepat cuma membuang waktu; solusinya adalah cek kredensial, bukan mempercepat rotasi.

Troubleshooting Error Rotating Proxy yang Sering Muncul di Puppeteer

ErrorPenyebab KemungkinanSolusi
ERR_PROXY_CONNECTION_FAILEDProxy down atau tidak bisa dijangkauKeluarkan dari pool, lalu retry dengan proxy berikutnya
407 Proxy Authentication RequiredKredensial salah atau metode auth tidak didukungVerifikasi kredensial page.authenticate(); gunakan proxy-chain untuk auth yang disisipkan di URL
TimeoutErrorProxy lambat atau target memblokirTambah timeout; pindah ke residential proxy
403 ForbiddenIP atau fingerprint sudah ditandaiRotasi proxy + aktifkan stealth + acak UA
ERR_TUNNEL_CONNECTION_FAILEDMasalah tunnel HTTPSCek dukungan metode CONNECT; coba tunneling lokal dengan proxy-chain

Ada beberapa hal penting yang tidak pas kalau dimasukkan ke tabel: status code 200 tidak selalu berarti sukses. Soft block sering mengembalikan halaman HTML lengkap — seperti login wall atau halaman challenge — dengan status code normal, jadi validasi isi kontennya, bukan cuma status response. Dan kalau Anda mentok, panduan debugging Puppeteer menyarankan menjalankan headless: false, menambahkan slowMo, dan mengatur NODE_DEBUG="puppeteer:*" untuk dapat log protokol yang lebih rinci — tapi ingat, log seperti itu bisa berisi data request sensitif, jadi jangan dibiarkan aktif saat memakai kredensial produksi.

Rotasi Proxy yang Dikelola Sendiri vs Gateway Proxy vs API Ekstraksi AI

KriteriaRotasi Daftar yang Dikelola SendiriBackconnect Gateway (Bright Data, Oxylabs, Decodo)API Ekstraksi AI (Thunderbit)
Biaya (volume rendah)Rendah hingga menengahMenengah–tinggi per GBRendah (free tier, lalu per unit)
KeandalanTergantung health check AndaTinggi (dikelola provider)Tinggi (infrastruktur dikelola)
Anti-deteksiDIY — Anda yang membangunnyaSebagian (hanya rotasi IP)Sudah built-in
Output terstrukturTidak (HTML mentah)Tidak (HTML mentah)Ya (JSON via schema)
Waktu setupJamMenitMenit
KontrolPenuhTerbatas pada API providerTerbatas pada schema model

Harga vendor saat ini (dicek 2026-08-07) memberi gambaran tentang kurva biaya opsi gateway: harga residential Bright Data menawarkan pay-as-you-go dan paket volume yang promosinya bisa berubah; Oxylabs menampilkan $6/GB pada 5 GB dan $2.50/GB pada 1 TB; dan Decodo (sebelumnya Smartproxy) menampilkan $3.75/GB pada 3 GB, $2.75/GB pada 100 GB, serta penawaran pay-as-you-go $4/GB. Decodo juga mengiklankan pool IP 115M+ dan success rate 99.92% — klaim vendor, bukan benchmark yang diverifikasi secara independen.

Decision tree yang benar-benar saya pakai: apakah Anda perlu berinteraksi dengan halaman — klik, scroll, isi form, menjaga sesi login? Bangun dengan Puppeteer dan proxy. Kalau Anda cuma butuh data yang sudah ada di halaman, pertimbangkan API ekstraksi sebelum membangun infrastruktur proxy yang harus Anda rawat selamanya.

Saat Puppeteer + Proxy Terlalu Berlebihan: Ekstrak Data Terstruktur dengan API Saja

Pada titik sekitar ketiga kalinya saya membangun ulang sistem health-check proxy untuk proyek yang sebenarnya cuma butuh harga produk di spreadsheet, saya sadar: sebagian besar infrastruktur ini dibuat untuk menyelesaikan masalah — mengambil HTML mentah dari halaman — yang sebenarnya bukan tujuan developer. Tujuannya adalah data terstruktur. HTML cuma format perantara yang merepotkan.

Thunderbit Open API memperlakukan ekstraksi sebagai operasi utama, bukan efek samping dari otomasi browser. POST /extract menerima URL dan JSON Schema, lalu mengembalikan data terstruktur yang cocok — menangani rendering JS, anti-bot, dan CAPTCHA di backend, alih-alih memaksa Anda menyusun plugin stealth dan proxy pool sendiri:

curl -X POST https://openapi.thunderbit.com/openapi/v1/extract \
  -H "Authorization: Bearer $THUNDERBIT_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"]
    }
  }'

Ada juga endpoint POST /distill untuk kasus ketika Anda cuma ingin Markdown yang bersih, bukan schema yang ketat, serta dukungan batch extraction untuk menjalankan schema yang sama ke banyak URL dalam satu panggilan. Berdasarkan pricing API Thunderbit saat ini, Distill memakai 1 unit per halaman dan Extract memakai 20 unit per halaman — free tier mencakup 600 unit sekali pakai, cukup untuk menguji workflow sebelum benar-benar komit.

Bagi developer yang bekerja di Claude, Cursor, atau client lain yang kompatibel dengan MCP, Thunderbit juga menyediakan thunderbit_extract dan thunderbit_distill sebagai tool MCP, sehingga agen bisa memutuskan di tengah tugas kapan perlu menarik data dari halaman tanpa harus membuat langkah scraping terpisah. Saya tetap akan mengecek referensi API yang live sebelum menyiapkan konfigurasi MCP, karena nama tool dan parameternya bisa berubah antar versi dokumentasi.

DimensiPuppeteer + Rotating ProxyThunderbit API
Kompleksitas setupTinggi — pool proxy, logika rotasi, stealth, retryRendah — satu panggilan API dengan JSON Schema
Penanganan anti-botManualBuilt-in
OutputHTML mentah (perlu parsing)JSON terstruktur sesuai schema Anda
MaintenanceTinggi — selector sering rusak, proxy bisa ausRendah
Paling cocok untukOtomasi kustom, flow login, interaksi yang spesifikEkstraksi data skala besar

Biar adil untuk pendekatan DIY: kalau use case Anda melibatkan login ke akun, klik through flow bertahap, atau apa pun yang butuh state bertahan selama sesi, API ekstraksi umumnya tidak bisa menggantikannya — FAQ Thunderbit sendiri menjelaskan dengan terbuka bahwa flow login interaktif saat ini belum didukung lewat API. Di situ, Puppeteer plus proxy tetap lebih unggul. Tapi kalau tugasnya adalah “ambil data dari banyak halaman publik ke dalam schema yang saya definisikan,” membangun stack rotasi proxy sendiri berarti Anda lagi menyelesaikan masalah yang lebih sulit daripada kebutuhan sebenarnya. Untuk tim yang ingin melewati coding sepenuhnya, Thunderbit Chrome Extension menawarkan ekstraksi berbasis AI yang sama lewat antarmuka point-and-click — layak dilihat kalau Anda sedang membandingkan web scraping tanpa coding dengan setup developer penuh.

Kesimpulan dan Poin Penting

Rotating proxy di Puppeteer bukan cuma satu teknik. Rotasi per browser itu sederhana dan terisolasi. Gateway backconnect berotentikasi bisa merotasi exit di balik satu endpoint browser-wide. Identitas per request yang lebih granular atau concurrency yang terpisah membutuhkan browser sharding atau relay eksternal; request interception saja tidak mengubah rute jaringan Chrome.

Tapi semua itu tidak banyak berarti tanpa stack lainnya. Proxy menyelesaikan masalah reputasi IP; plugin stealth dan konsistensi fingerprint menyelesaikan masalah sinyal browser; jitter dan pacing menyelesaikan masalah perilaku. Lewatkan satu lapisan saja, dan Anda tetap bisa kena blokir — cuma dengan alasan yang berbeda.

Kalau Anda membangunnya sendiri, mulailah dari repository proxy-chain dan potongan kode di atas — itu akan membawa Anda lebih jauh daripada kebanyakan kursus berbayar. Kalau Anda lebih memilih melewati manajemen proxy sepenuhnya dan langsung menerima data terstruktur, dokumentasi API Thunderbit layak dibaca sepuluh menit sebelum Anda menghabiskan akhir pekan membangun infrastruktur health-check yang harus terus dirawat. Dua jalur itu sama-sama sah — yang penting, pastikan Anda menyelesaikan masalah yang benar-benar Anda hadapi, bukan masalah yang diasumsikan oleh setiap tutorial. Untuk melihat lebih luas bagaimana AI mengubah area ini, baca pembahasan mendalam kami tentang AI web scraping dan bagaimana perbandingannya dengan pendekatan tradisional.

FAQ

Seberapa sering saya harus merotasi proxy di Puppeteer?

Tergantung seberapa agresif rate limiting pada target. Untuk situs dengan deteksi bot yang ketat, rotasi per halaman atau per sesi. Untuk situs yang lebih longgar, rotasi per sesi atau bahkan satu sticky IP untuk seluruh run scraping bisa saja cukup. Tidak ada angka universal — jadikan 403, 429, dan timeout sebagai sinyal bahwa Anda perlu rotasi lebih agresif, bukan jumlah request tetap.

Bolehkah saya memakai proxy gratis untuk scraping dengan Puppeteer?

Secara teknis boleh, tetapi saya tidak menyarankannya selain untuk uji cepat. Daftar proxy gratis biasanya lambat, tidak stabil, dan sering sudah masuk blacklist situs yang ingin Anda scrape. Untuk kebutuhan produksi, residential proxy dari provider berbayar atau managed gateway biasanya sepadan dengan biayanya.

Apakah puppeteer-extra-plugin-stealth bekerja melawan semua sistem anti-bot?

Tidak, dan dokumentasi plugin itu sendiri juga mengatakannya. Plugin ini mengurangi beberapa sinyal umum dari Chrome headless, tetapi target masih bisa menilai reputasi jaringan, karakteristik TLS, cookie, client hints, dan perilaku. Anggap plugin ini sebagai satu lapisan kompatibilitas, bukan jaminan.

Apa bedanya proxy-chain dan --proxy-server di Puppeteer?

--proxy-server adalah flag native Chromium saat launch yang menetapkan satu endpoint proxy untuk seluruh instance browser, dan Chrome tidak menerima kredensial proxy yang disisipkan di sana. proxy-chain membuat tunnel anonim lokal ke upstream yang diautentikasi. Rotasi kemudian datang dari relaunch dengan upstream lain, provider-managed backconnect gateway, atau relay yang Anda bangun sendiri — bukan dari proxy-chain yang menetapkan proxy untuk page Puppeteer individual.

Apakah rotating proxy saja cukup agar tidak diblokir sama sekali?

Tidak — dan ini salah satu miskonsepsi yang paling umum. Sistem anti-bot modern seperti Cloudflare bot management mengorelasikan reputasi IP dengan fingerprint browser, pola perilaku, dan histori sesi. Proxy menyelesaikan bagian reputasi IP; Anda tetap butuh konfigurasi stealth, fingerprint yang konsisten, dan timing yang realistis supaya tidak ditandai dari sinyal lain.

Pelajari Lebih Lanjut

Ke
Ke
CTO di Thunderbit | Senior Data Scientist & Expert ML Dengan pengalaman hampir satu dekade di bidang machine learning dan data science, Ke Shen adalah lulusan Columbia University dan mantan Senior Data Scientist di Walmart Labs. Dengan keahlian mendalam yang diakui sejawat dalam Python, R, Java, dan Statistik, ia membagikan wawasan teruji lapangan tentang bagaimana membawa algoritma AI yang kompleks dari teori ke arsitektur siap produksi.
Topics
Rotasi proxy PuppeteerRotasi proxyOtomasi browser
Daftar Isi
Thunderbit · Agen data web AI

Ekstrak data dari halaman apa pun dalam 1 klik

Dipercaya oleh 250.000+ pengguna
tersedia paket gratis
Dari halaman web ke spreadsheet
Jelaskan apa yang kamu butuhkan — AI Agent Thunderbit akan men-scrape dan mengekspornya ke Excel, Google Sheets, Airtable, atau Notion. Gratis untuk memulai.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week