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
| 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.
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.
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.
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
serverbukan diusernamedanpassword, jadi Chromium tidak mengirimkan apa pun. Lihat error tunnel. - 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.
- Timeout 30000ms terlampaui pada
gotobiasanya berarti Anda menungguloadataunetworkidledi halaman yang terus memuat tracker. Tunggudomcontentloadedlalu 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 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.