# Pengaturan proxy Playwright dengan rotasi IP residensial (Python dan Node.js)

> Pengaturan proxy Playwright di Python dan Node.js: proxy residensial dengan otentikasi per browser atau konteks, sesi sticky, halaman yang lebih ringan.

- URL: https://crawlrelay.com/id/docs/playwright/
- Terakhir diperbarui: 2026-10-13
- Publisher: CrawlRelay (https://crawlrelay.com)

Berikan proxy saat peluncuran untuk satu exit per browser, atau per konteks untuk satu negara atau satu sesi sticky per konteks. Kemudian potong lalu lintas dengan memblokir apa yang tidak Anda butuhkan.

**Jawaban cepat — Bagaimana cara menggunakan proxy yang diautentikasi di Playwright?**

Lewatkan objek `proxy` dengan `server`, `username` dan `password` ke `launch()` atau ke `new_context()`: `server` adalah `http://gw.crawlrelay.com:7777`, dan kredensial dimasukkan ke dalam bidang mereka sendiri, tidak pernah ke URL server. Dengan **proxy residensial CrawlRelay**, masukkan negara dan ID sesi di username untuk memberikan setiap konteks exit-nya sendiri. Biaya traffic US$0,50/GB mulai dari 50 GB. Dibayar dengan crypto, tanpa KYC.

## Setup Playwright secara singkat

| Atribut | Nilai |
| --- | --- |
| Opsi Proxy | `{"server": "http://gw.crawlrelay.com:7777", "username": ..., "password": ...}` |
| Dimana | `launch(proxy=...)` untuk seluruh browser, atau `new_context(proxy=...)` per konteks |
| Port | Port HTTP 7777; situs HTTPS melewati CONNECT |
| SOCKS5 | Chromium tidak mendukung autentikasi SOCKS5: gunakan port HTTP |
| Satu IP per konteks | `-session-<id>-ttl-<minutes>` di username konteks |
| Biaya halaman tipikal | Sekitar 2 MB dengan setiap sumber daya; beberapa ratus KB dengan gambar, font, dan media diblokir |

## Bagaimana cara memberikan setiap konteks browser negara atau sesi sendiri?

Buat satu konteks per negara atau per sesi sticky. Konteks lebih murah dibanding browser, dan masing-masing menyimpan cookie, penyimpanan dan kredensial proxy sendiri. Cocokkan locale konteks dengan negara exit agar situs melihat pengunjung yang konsisten.

*Python (API sinkron): satu konteks per negara*

```python
from playwright.sync_api import sync_playwright

GATEWAY = "http://gw.crawlrelay.com:7777"
LOCALES = {"us": "en-US", "de": "de-DE", "jp": "ja-JP"}

with sync_playwright() as p:
    browser = p.chromium.launch()
    for country, locale in LOCALES.items():
        context = browser.new_context(
            proxy={"server": GATEWAY, "username": "USERNAME-country-%s" % country, "password": "PASSWORD"},
            locale=locale,
        )
        page = context.new_page()
        page.goto("https://api.ipify.org", wait_until="domcontentloaded")
        print(country, page.inner_text("body"))
        context.close()
    browser.close()
```

## Bagaimana saya mengatur proxy di Playwright untuk Node.js dan memotong traffic?

Opsi ini sama bentuknya di Node.js. Sebagian besar bobot halaman yang dirender adalah gambar, font, dan media: median halaman sebesar 2.164 KB di mobile menurut HTTP Archive Web Almanac 2025. Jika Anda hanya perlu teks dan tautan, batalkan permintaan tersebut di pengelola rute.

*Node.js: sesi sticky saat peluncuran, sumber berat diblokir*

```javascript
import { chromium } from "playwright";

const browser = await chromium.launch({
  proxy: {
    server: "http://gw.crawlrelay.com:7777",
    username: "USERNAME-country-us-session-pw1-ttl-30",
    password: "PASSWORD",
  },
});
const context = await browser.newContext();
// Images, fonts and media are most of a page's bytes
await context.route("**/*", (route) =>
  ["image", "font", "media"].includes(route.request().resourceType()) ? route.abort() : route.continue()
);
const page = await context.newPage();
const response = await page.goto("https://example.com/", { waitUntil: "domcontentloaded" });
console.log(response.status(), await page.title());
await browser.close();
```

## Bagaimana saya menjalankan banyak halaman secara paralel dengan asyncio?

Gunakan API async dengan pool konteks tetap. Setiap konteks menyimpan satu sesi sticky selama masa hidupnya, sehingga situs melihat beberapa pengunjung stabil daripada satu IP per permintaan. Recyle konteks, dengan sesi ID baru, setelah jumlah halaman tertentu atau setelah terjadi error.

*Python (API async): pool konteks sticky*

```python
import asyncio
import uuid

from playwright.async_api import async_playwright

GATEWAY = "http://gw.crawlrelay.com:7777"
WORKERS = 4


async def worker(browser, queue):
    session = uuid.uuid4().hex[:10]
    context = await browser.new_context(proxy={
        "server": GATEWAY,
        "username": "USERNAME-country-us-session-%s-ttl-30" % session,
        "password": "PASSWORD",
    })
    page = await context.new_page()
    while not queue.empty():
        url = await queue.get()
        try:
            response = await page.goto(url, wait_until="domcontentloaded", timeout=45000)
            print(session, url, response.status if response else None)
        except Exception as exc:  # timeouts and network errors: log and move on
            print(session, url, type(exc).__name__)
        finally:
            queue.task_done()
    await context.close()


async def main(urls):
    queue = asyncio.Queue()
    for url in urls:
        queue.put_nowait(url)
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        await asyncio.gather(*(worker(browser, queue) for _ in range(WORKERS)))
        await browser.close()


asyncio.run(main(["https://example.com/", "https://example.org/"]))
```

## Mengapa saya mendapat ERR_TUNNEL_CONNECTION_FAILED atau ERR_PROXY_CONNECTION_FAILED?

- **net::ERR_TUNNEL_CONNECTION_FAILED** berarti proxy tidak menerima permintaan CONNECT. Seringkali kredensial ditulis di dalam `server` bukan di `username` dan `password`, jadi Chromium tidak mengirimkan apa pun. Lihat [error tunnel](https://crawlrelay.com/id/docs/errors/err-tunnel-connection-failed/).
- **net::ERR_PROXY_CONNECTION_FAILED** berarti browser tidak pernah sampai ke gateway: kesalahan ketik pada host atau port, atau jaringan memblokir port tersebut. Lihat [error koneksi proxy](https://crawlrelay.com/id/docs/errors/err-proxy-connection-failed/).
- **Timeout 30000ms terlampaui** pada `goto` biasanya berarti Anda menunggu `load` atau `networkidle` di halaman yang terus memuat tracker. Tunggu `domcontentloaded` lalu selector yang Anda butuhkan.

## Apa yang tidak boleh dilakukan scraper Playwright?

Gunakan Playwright untuk merender halaman publik yang membutuhkan JavaScript, bukan untuk meniru orang. CrawlRelay’s [Acceptable Use Policy](https://crawlrelay.com/id/acceptable-use/) melarang menggunakan browser melalui gateway kami untuk membuat akun secara massal, mengambil alih akun, menyelesaikan CAPTCHA secara otomatis, atau mengalahkan blokir situs yang disengaja. Kami tidak mendokumentasikan plugin stealth atau spoof fingerprint. Jika situs menantang browser Anda, perlambat, periksa robots.txt dan ketentuan, dan minta akses atau gunakan API situs tersebut.

## Playwright dan proxy: pertanyaan

### Bisakah saya menggunakan proxy berbeda untuk setiap konteks Playwright?

Ya. Berikan `proxy` ke `browser.new_context()` di Python atau `browser.newContext()` di Node.js. Setiap konteks memiliki exit, cookie, dan penyimpanan sendiri. Rilis Playwright lama di Windows juga memerlukan proxy saat peluncuran; jika Anda melihat error itu, mulai dengan proxy placeholder dan atur yang sebenarnya per konteks.

### Apakah Playwright mendukung proxy SOCKS5 dengan autentikasi?

Tidak di Chromium, yang tidak mendukung autentikasi username dan password SOCKS5. Gunakan port HTTP gateway (7777): ia menangani situs HTTPS lewat tunnel CONNECT dan mendukung username dan password di semua mesin browser yang dijalankan Playwright.

### Bagaimana saya memeriksa IP dan negara yang digunakan halaman Playwright?

Buka `https://api.ipify.org` di konteks yang sama sebelum target Anda dan baca teks body, seperti contoh pertama. Perlu diingat sesi sticky mempertahankan IP itu hanya selama perangkat residensial online; catat IP saat awal setiap konteks untuk melihat perubahan.

### Berapa banyak traffic yang digunakan halaman Playwright melalui proxy?

Semua akan dihitung: HTML, script, style, gambar, font, dan panggilan API. Halaman penuh kira-kira 2 MB pada median; memblokir gambar, font dan media biasanya memotongnya menjadi beberapa ratus KB. Ukur halaman asli Anda dengan menjumlahkan ukuran respons di pengelola `response` untuk 50 halaman.

### Haruskah saya memakai browser headless atau headed untuk scraping?

Headless adalah pilihan normal untuk server dan menggunakan sumber daya lebih sedikit. Gunakan browser headed hanya untuk debugging tampilan halaman. Tidak ada yang mengubah aturan: render halaman publik dengan kecepatan sopan dan hormati robots.txt serta ketentuan situs.

**Render halaman publik lewat IP residensial** US$5,94 untuk 10 GB, US$0,50/GB dari 50 GB. [Lihat harga](https://crawlrelay.com/id/pricing/) · [Panduan Puppeteer](https://crawlrelay.com/id/docs/puppeteer/)

---

CrawlRelay: CrawlRelay adalah layanan proxy residensial dan proxy seluler 4G/5G yang berfokus pada pengembang untuk scraper dan pipeline data AI: trafik pay-as-you-go tanpa kedaluwarsa mulai dari US$0,50/GB, dibayar dengan crypto, tanpa perlu unggah ID. Tanpa KYC — tanpa ID, tanpa selfie, tanpa dokumen. Bayar dengan crypto.
