Panduan5 menit baca

Proxy Playwright dan Puppeteer: setup, sesi sticky, hemat kuota

Cara memasang residential proxy di Playwright dan Puppeteer: kredensial yang benar, IP beda per konteks lewat sesi sticky, dan blokir gambar agar hemat kuota.

Playwright dan Puppeteer bisa memakai residential proxy langsung saat browser dijalankan, tanpa ekstensi tambahan. Kuncinya: arahkan server proxy ke proxy.waroengproxy.com:8000, lalu isi username dan password terpisah dari alamat server. Panduan ini membahas setup di Playwright (Python dan Node.js) dan Puppeteer, cara memberi tiap konteks browser IP sendiri lewat sesi sticky, dan cara supaya kuota GB tidak habis untuk gambar dan video.

Yang perlu disiapkan

  • Akun WaroengProxy dengan kuota GB. Belum punya? Buat akun cukup dengan token, lalu top up lewat QRIS mulai Rp 10.000. Harga per GB dan diskon volume ada di halaman harga.
  • Username dan password proxy dari kartu Kredensial proxy di dashboard.
  • Playwright (pip install playwright lalu playwright install chromium, atau npm i playwright) atau Puppeteer (npm i puppeteer).
  • Satu endpoint untuk semua protokol: proxy.waroengproxy.com:8000.

Aturan penting: kredensial terpisah dari alamat server

Kesalahan paling umum adalah menulis http://USERNAME:PASSWORD@host:port di kolom server. Chromium tidak membaca kredensial yang ditempel di alamat proxy, jadi hasilnya error 407 atau jendela login yang tidak pernah terisi. Di Playwright, isi server, username, dan password sebagai kunci terpisah. Di Puppeteer, alamat server masuk ke argumen --proxy-server, sedangkan username dan password dikirim lewat page.authenticate().

Pakai skema http:// untuk browser. Situs https:// tetap terenkripsi dari ujung ke ujung karena browser membuka terowongan CONNECT lewat proxy. SOCKS5 memang tersedia di endpoint yang sama, tapi Chromium tidak mendukung SOCKS5 dengan username dan password, jadi untuk otomasi browser http:// adalah pilihan paling aman. Perbandingan lengkapnya ada di HTTP, HTTPS, atau SOCKS5?.

Playwright (Python): proxy untuk seluruh browser

Cara paling sederhana adalah memasang proxy saat launch(). Semua tab dan konteks akan keluar lewat proxy yang sama. Contoh di bawah memakai IP Indonesia dengan sesi sticky 10 menit, lalu mencetak IP yang dilihat situs tujuan.

Python
from playwright.sync_api import sync_playwright
PROXY = {
"server": "http://proxy.waroengproxy.com:8000",
"username": "USERNAME-cc-ID-s-sesi1-ttl-600",
"password": "PASSWORD",
}
with sync_playwright() as p:
browser = p.chromium.launch(proxy=PROXY)
page = browser.new_page()
page.goto("https://ipinfo.io/json", timeout=60000)
print(page.inner_text("body"))
browser.close()

Username di contoh itu dirakit dari beberapa parameter: -cc-ID memilih Indonesia, -s-sesi1 memberi label sesi, dan -ttl-600 menahan IP yang sama selama 600 detik. Tanpa -s dan -ttl, proxy berjalan dalam mode rotating dan IP bisa berganti di setiap koneksi baru. Kamu tidak perlu merakitnya manual: Generator proxy di dashboard membuatkan barisnya, termasuk target kota, ISP, atau ASN. Perbedaan kedua mode dibahas di sticky atau rotating.

Cara cepat memastikan sesi sticky bekerja: jalankan skripnya dua kali dalam 10 menit, dan IP yang tercetak harus sama. Ganti sesi1 menjadi sesi2, jalankan lagi, dan IP-nya akan berbeda. Lakukan tes kecil ini sebelum menjalankan alur yang lebih panjang, supaya kamu tahu pasti bahwa masalah yang muncul nanti bukan dari pengaturan proxy.

Satu konteks, satu IP (Playwright Node.js)

Kalau kamu menguji tampilan situs dari beberapa negara, pasang proxy per konteks, bukan per browser. Setiap browser.newContext() punya cookie dan penyimpanan sendiri, dan dengan label sesi berbeda, setiap konteks juga keluar dari IP berbeda.

Contoh
const { chromium } = require('playwright');
// satu konteks per negara, masing-masing dengan sesi sendiri
const countries = ['ID', 'SG', 'DE'];
(async () => {
const browser = await chromium.launch();
for (const cc of countries) {
const context = await browser.newContext({
proxy: {
server: 'http://proxy.waroengproxy.com:8000',
username: `USERNAME-cc-${cc}-s-qa${cc}-ttl-600`,
password: 'PASSWORD',
},
});
const page = await context.newPage();
await page.goto('https://ipinfo.io/json', { timeout: 60000 });
console.log(cc, await page.innerText('body'));
await context.close();
}
await browser.close();
})();

Pola ini cocok untuk QA: satu proses browser, beberapa konteks terisolasi, masing-masing dengan negara dan sesinya sendiri. Di versi Playwright yang lebih lama, Chromium di Windows mensyaratkan proxy global saat launch agar proxy per konteks berfungsi. Kalau muncul error soal itu, perbarui Playwright atau tambahkan proxy: { server: 'http://per-context' } di chromium.launch().

Puppeteer: --proxy-server dan page.authenticate

Puppeteer tidak punya opsi proxy terstruktur seperti Playwright. Alamat proxy dipasang sebagai argumen Chromium, lalu kredensial dikirim per halaman sebelum halaman membuka URL apa pun.

Contoh
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
args: ['--proxy-server=http://proxy.waroengproxy.com:8000'],
});
const page = await browser.newPage();
// kirim kredensial sebelum goto(), atau request pertama kena 407
await page.authenticate({
username: 'USERNAME-cc-ID-s-sesi1-ttl-600',
password: 'PASSWORD',
});
await page.goto('https://ipinfo.io/json', { timeout: 60000 });
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();
})();

Karena --proxy-server berlaku untuk seluruh proses browser, cara paling jelas untuk mendapat beberapa IP di Puppeteer adalah menjalankan satu browser per sesi, masing-masing dengan label -s- sendiri. Panggil page.authenticate() di setiap halaman baru, karena halaman tanpa kredensial akan ditolak dengan 407.

Hemat kuota: blokir gambar, font, dan video

Browser headless mengunduh semua yang dimuat halaman, dan semua data yang lewat proxy dihitung ke kuota GB: gambar, font, video, skrip iklan, sampai halaman error. Kalau tugasmu hanya membaca teks atau harga, blokir jenis sumber daya yang tidak dibutuhkan sebelum membuka halaman:

Python
# Playwright (Python): lewati gambar, font, dan video
BLOCK = {"image", "font", "media"}
def save_quota(route):
if route.request.resource_type in BLOCK:
return route.abort()
return route.continue_()
page.route("**/*", save_quota)
page.goto("https://example.com/produk", wait_until="domcontentloaded")

Di Puppeteer, caranya lewat await page.setRequestInterception(true) lalu handler page.on('request', ...) yang memanggil abort() untuk tipe image, font, dan media, serta continue() untuk sisanya. Beberapa kebiasaan lain yang ikut menghemat:

  • Pakai domcontentloaded daripada menunggu networkidle, supaya browser tidak terus mengunduh iklan dan pelacak.
  • Jangan lewatkan proxy untuk langkah yang tidak butuh IP lokal, misalnya membuka dashboard milikmu sendiri.
  • Kalau datanya sudah ada di HTML mentah, HTTP client biasa jauh lebih hemat daripada browser. Lihat proxy di Python requests.
  • Ukur dulu berapa MB per halaman sebelum menjalankan ribuan halaman. Caranya ada di berapa GB yang sebenarnya kamu butuhkan.
Jangan tulis password proxy langsung di skrip yang masuk Git. Simpan di variabel lingkungan, misalnya PROXY_USER dan PROXY_PASS, lalu baca dengan os.environ di Python atau process.env di Node.js. Kalau password pernah bocor, ganti dari dashboard.

Kalau ada masalah

  • Error 407 atau jendela login muncul: kredensial tertempel di alamat server, page.authenticate() terlewat, atau kuota GB habis. Cek juga tanda strip di username, karena setiap parameter dipisah -.
  • Timeout saat `goto`: IP rumahan bisa lebih lambat dari server datacenter. Naikkan batas waktu, misalnya 60 detik, lalu coba ulang dengan label sesi baru.
  • IP berganti di tengah alur: pastikan ada -s- dan -ttl-, dan TTL cukup panjang untuk seluruh alur (maksimal 86400 detik).
  • Negara tidak sesuai: periksa kode ISO di -cc- (Indonesia = ID), lalu cek hasilnya lewat ipinfo.io/json.

Daftar penyebab dan solusi yang lebih lengkap ada di cara mengatasi error proxy.

Pakai dengan bertanggung jawab

Otomasi browser lewat proxy paling berguna untuk pekerjaan yang sah: menguji tampilan dan mata uang situsmu sendiri dari negara lain, mengambil tangkapan layar halaman publik untuk arsip, atau memantau harga yang ditampilkan terbuka. Patuhi syarat layanan dan robots.txt situs tujuan, beri jeda antar-request, dan jangan memakai proxy untuk melewati CAPTCHA, sistem keamanan, atau pembatasan akses sebuah situs.

Siap mencoba? Buat akun, top up lewat QRIS, lalu salin baris proxy dari Generator proxy. Referensi lengkap parameter username ada di dokumentasi.