Playwright — salah satu alat paling kuat untuk otomatisasi browser, pengujian headless, dan pengambilan data. Namun, tanpa proksi yang diatur dengan benar, skrip Anda akan cepat diblokir berdasarkan IP: situs web telah belajar mengenali permintaan otomatis dan memblokirnya. Dalam panduan ini, kita akan membahas semua cara untuk menghubungkan proksi di Playwright — dari konfigurasi dasar hingga rotasi IP dan menghindari Cloudflare.
Mengapa proksi di Playwright dan kapan tidak bisa tanpa itu
Playwright menjalankan browser nyata (Chromium, Firefox, atau WebKit) di latar belakang — itulah yang disebut headless. Dari sudut pandang situs web, Anda terlihat seperti pengguna biasa, tetapi hanya sampai titik tertentu. Begitu ratusan permintaan per jam mulai datang dari satu IP, algoritma perlindungan bereaksi dengan cepat: CAPTCHA, pemblokiran sementara, larangan total.
Berikut adalah skenario konkret ketika proksi sangat diperlukan:
- Pemrosesan data dari marketplace — Wildberries, Ozon, Avito, Yandex.Market memblokir skrip setelah 50–100 permintaan dari satu IP.
- Monitoring harga pesaing — jika memeriksa setiap 15 menit, tanpa mengganti IP Anda akan diblokir dalam beberapa jam.
- Penguji geolokasi — perlu memeriksa bagaimana situs terlihat untuk pengguna dari Jerman, AS, atau Kazakhstan.
- Pengisian formulir dan pendaftaran akun — platform mengaitkan akun dengan IP dan memblokir pendaftaran massal.
- Monitoring SEO — pengumpulan posisi dari Google dan Yandex memerlukan penggantian IP yang konstan, jika tidak mesin pencari akan menunjukkan CAPTCHA.
- Penguji fungsi A/B — beberapa fitur hanya tersedia untuk pengguna dari negara atau wilayah tertentu.
Penting untuk dipahami: Playwright sendiri tidak membuat Anda anonim. Tanpa proksi, semua permintaan datang dari alamat IP asli Anda. Menambahkan proksi adalah langkah pertama dan paling penting untuk memastikan stabilitas kerja skrip otomatisasi apa pun.
💡 Penting untuk diketahui
Playwright mendukung proksi di tingkat seluruh browser, konteks terpisah (BrowserContext), dan bahkan halaman terpisah. Ini memberikan fleksibilitas: halaman yang berbeda dapat bekerja melalui IP yang berbeda secara bersamaan.
Jenis proksi apa yang harus dipilih untuk otomatisasi headless
Tidak semua proksi cocok untuk Playwright. Pilihan tergantung pada tugas: apa yang Anda ambil datanya, seberapa agresif perlindungan situs, dan berapa banyak permintaan yang Anda rencanakan.
| Jenis Proksi | Tingkat Kepercayaan | Kecepatan | Cocok untuk |
|---|---|---|---|
| Data Center | Rendah | Sangat tinggi | Pengambilan data tanpa perlindungan ketat, pengujian |
| Residential | Tinggi | Sedang | Situs dengan Cloudflare, marketplace, media sosial |
| Mobile | Maksimal | Sedang | Facebook, TikTok, Instagram, anti-bot ketat |
| SOCKS5 | Tergantung pada sumber | Tinggi | Protokol universal, didukung oleh Playwright |
Untuk sebagian besar tugas pengambilan data pilihan optimal adalah proksi residential dengan rotasi. Mereka memiliki IP nyata dari pengguna rumah, sehingga situs tidak mengidentifikasinya sebagai data center dan tidak memblokir secara otomatis. Untuk situs dengan perlindungan agresif (Cloudflare Bot Management, Akamai) lebih baik menggunakan proksi mobile — IP mereka dimiliki oleh operator seluler, yang memberikan kepercayaan maksimal.
Playwright mendukung protokol http, https, dan socks5. Penting: SOCKS5 tidak mendukung otorisasi melalui username:password secara langsung di beberapa versi — lebih lanjut tentang ini di bagian kesalahan.
Pengaturan dasar proksi di Playwright (JavaScript dan Python)
Playwright memungkinkan Anda untuk menetapkan proksi saat meluncurkan browser melalui parameter proxy. Ini adalah cara paling sederhana — semua permintaan browser akan melalui server proksi yang ditentukan.
JavaScript / Node.js
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
proxy: {
server: 'http://proxy.example.com:8080'
}
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
const content = await page.textContent('body');
console.log(content); // akan menunjukkan IP server proksi
await browser.close();
})();
Python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": "http://proxy.example.com:8080"
}
)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.text_content("body")) # akan menunjukkan IP proksi
browser.close()
Untuk SOCKS5, cukup ubah skema dalam alamat server:
# Python — proksi SOCKS5
browser = p.chromium.launch(
proxy={
"server": "socks5://proxy.example.com:1080"
}
)
Untuk cepat memeriksa apakah proksi berfungsi, buka https://httpbin.org/ip atau https://api.ipify.org — dalam respons harus ada IP server proksi, bukan IP asli Anda.
Proksi dengan otorisasi menggunakan nama pengguna dan kata sandi
Sebagian besar penyedia proksi komersial menggunakan otorisasi dengan nama pengguna dan kata sandi — ini adalah praktik standar. Playwright mendukungnya melalui bidang username dan password dalam objek proksi.
JavaScript
const browser = await chromium.launch({
proxy: {
server: 'http://gate.proxyprovider.com:7777',
username: 'your_login',
password: 'your_password'
}
});
Python
browser = p.chromium.launch(
proxy={
"server": "http://gate.proxyprovider.com:7777",
"username": "your_login",
"password": "your_password"
}
)
Nama pengguna dan kata sandi juga dapat disertakan langsung dalam URL server proksi — ini nyaman jika Anda membentuk string secara dinamis:
# Otorisasi dalam URL (Python)
proxy_url = f"http://{login}:{password}@gate.proxyprovider.com:7777"
browser = p.chromium.launch(
proxy={"server": proxy_url}
)
⚠️ Peringatan
Jangan simpan nama pengguna dan kata sandi proksi langsung dalam kode! Gunakan variabel lingkungan (os.environ di Python atau process.env di Node.js) atau file .env dengan pustaka dotenv.
Penyimpanan aman melalui .env (Python)
import os
from dotenv import load_dotenv
from playwright.sync_api import sync_playwright
load_dotenv()
PROXY_SERVER = os.getenv("PROXY_SERVER")
PROXY_LOGIN = os.getenv("PROXY_LOGIN")
PROXY_PASSWORD = os.getenv("PROXY_PASSWORD")
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": PROXY_SERVER,
"username": PROXY_LOGIN,
"password": PROXY_PASSWORD
}
)
# ...
Rotasi proksi: mengganti IP untuk setiap permintaan
Satu proksi tidak akan menyelamatkan Anda dari pemblokiran saat jumlah permintaan besar. Untuk pengambilan data yang serius, rotasi IP diperlukan — penggantian otomatis server proksi dalam interval tertentu atau untuk setiap permintaan baru.
Ada dua pendekatan untuk rotasi di Playwright:
Pendekatan 1: Titik akhir proksi yang berputar
Sebagian besar penyedia proksi residential menyediakan alamat gateway tunggal yang secara otomatis mengubah IP setiap kali terhubung. Anda tidak perlu menulis logika rotasi — itu sudah terintegrasi di sisi penyedia.
# Satu titik akhir — IP baru setiap kali browser terhubung
browser = p.chromium.launch(
proxy={
"server": "http://rotating.proxyprovider.com:8888",
"username": "your_login",
"password": "your_password"
}
)
Pendekatan 2: Rotasi manual melalui daftar proksi
Jika Anda memiliki daftar proksi statis, Anda dapat menerapkan rotasi secara manual — dengan membuat browser atau konteks baru untuk setiap iterasi:
import random
from playwright.sync_api import sync_playwright
PROXY_LIST = [
{"server": "http://proxy1.example.com:8080", "username": "user", "password": "pass"},
{"server": "http://proxy2.example.com:8080", "username": "user", "password": "pass"},
{"server": "http://proxy3.example.com:8080", "username": "user", "password": "pass"},
]
URLS_TO_SCRAPE = [
"https://example.com/page1",
"https://example.com/page2",
"https://example.com/page3",
]
with sync_playwright() as p:
for url in URLS_TO_SCRAPE:
proxy = random.choice(PROXY_LIST) # proksi acak
browser = p.chromium.launch(proxy=proxy)
page = browser.new_page()
page.goto(url)
# ... pengambilan data ...
browser.close() # tutup browser, ganti IP
Pendekatan 3: Rotasi melalui BrowserContext (tanpa memulai ulang browser)
with sync_playwright() as p:
browser = p.chromium.launch() # browser tanpa proksi
for i, url in enumerate(URLS_TO_SCRAPE):
proxy = PROXY_LIST[i % len(PROXY_LIST)] # secara berulang
# Konteks baru dengan proksi baru — lebih cepat daripada memulai ulang browser
context = browser.new_context(proxy=proxy)
page = context.new_page()
page.goto(url)
# ... pengambilan ...
context.close() # tutup konteks, bukan browser
browser.close()
Pendekatan ketiga adalah yang paling efisien untuk pengambilan data massal. Memulai ulang browser memakan waktu 2–4 detik, sementara membuat konteks baru memakan waktu kurang dari 100 milidetik.
Proksi pada tingkat konteks dan halaman
Playwright mendukung arsitektur yang fleksibel: satu browser dapat memiliki beberapa konteks terisolasi, masing-masing dengan proksi sendiri. Ini memungkinkan bekerja secara paralel dengan beberapa IP dalam satu proses.
Beberapa konteks dengan proksi yang berbeda (pengambilan paralel)
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch();
// Konteks 1 — proksi dari Jerman
const context_de = await browser.newContext({
proxy: {
server: 'http://de-proxy.example.com:8080',
username: 'user',
password: 'pass'
}
});
// Konteks 2 — proksi dari AS
const context_us = await browser.newContext({
proxy: {
server: 'http://us-proxy.example.com:8080',
username: 'user',
password: 'pass'
}
});
const page_de = await context_de.newPage();
const page_us = await context_us.newPage();
// Eksekusi paralel
await Promise.all([
page_de.goto('https://example.com'),
page_us.goto('https://example.com')
]);
// Kedua halaman melihat IP yang berbeda
console.log('DE IP:', await page_de.textContent('body'));
console.log('US IP:', await page_us.textContent('body'));
await browser.close();
})();
Pendekatan ini sangat cocok untuk pengujian geolokasi: Anda secara bersamaan memeriksa bagaimana situs ditampilkan untuk pengguna dari negara yang berbeda, tanpa menjalankan beberapa instance browser.
💡 Tips untuk kinerja
Untuk paralelitas maksimum, gunakan asyncio di Python atau Promise.all di Node.js. Satu browser dapat menampung 10–20 konteks paralel tanpa beban memori yang signifikan.
Menghindari perlindungan anti-bot: Cloudflare, Akamai, DataDome
Proksi hanyalah bagian dari solusi. Sistem anti-bot modern menganalisis puluhan sinyal secara bersamaan: sidik jari browser, perilaku mouse, kecepatan pengisian formulir, header HTTP, dan banyak lagi. Bahkan dengan proksi yang baik, Anda dapat diblokir jika tidak mempertimbangkan faktor-faktor ini.
1. Menyembunyikan mode headless
Playwright dalam mode headless memiliki tanda-tanda khas yang mudah dikenali: nilai spesifik navigator.webdriver, tidak ada plugin, ukuran layar yang tidak standar. Gunakan pustaka playwright-stealth untuk menyembunyikan:
# Python: instalasi
# pip install playwright-stealth
from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": "http://residential.proxyprovider.com:8888",
"username": "user",
"password": "pass"
}
)
page = browser.new_page()
stealth_sync(page) # menerapkan penyamaran
page.goto("https://bot.sannysoft.com") # tes untuk mendeteksi bot
browser.close()
2. User-Agent dan viewport yang realistis
context = browser.new_context(
proxy={
"server": "http://proxy.example.com:8080",
"username": "user",
"password": "pass"
},
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
viewport={"width": 1920, "height": 1080},
locale="ru-RU",
timezone_id="Europe/Moscow" # harus sesuai dengan geolokasi proksi!
)
3. Meniru perilaku manusia
import time
import random
# Penundaan acak antara tindakan
def human_delay(min_ms=500, max_ms=2000):
time.sleep(random.randint(min_ms, max_ms) / 1000)
page.goto("https://example.com")
human_delay()
# Scroll halus daripada instan
page.evaluate("window.scrollBy({top: 500, behavior: 'smooth'})")
human_delay(300, 800)
# Gerakan mouse sebelum klik
page.mouse.move(100, 200)
human_delay(100, 300)
page.mouse.move(300, 400)
human_delay(100, 200)
page.click("button#submit")
4. Kesesuaian zona waktu dengan geolokasi proksi
Ini sering diabaikan, tetapi sistem anti-bot memeriksa kesesuaian: jika proksi Anda dari Moskow, tetapi browser menunjukkan zona waktu UTC-8 (Los Angeles) — ini adalah bendera merah. Selalu tetapkan timezone_id sesuai dengan geolokasi proksi yang digunakan.
Kesalahan umum dan cara memperbaikinya
Saat bekerja dengan proksi di Playwright, pengembang sering menghadapi masalah yang sama. Mari kita bahas setiap masalah dengan solusi konkret.
Kesalahan 1: ERR_PROXY_CONNECTION_FAILED
Penyebab: Alamat atau port proksi yang salah, proksi tidak tersedia, kredensial yang salah.
Solusi: Periksa ketersediaan proksi melalui curl sebelum menjalankan Playwright:
# Memeriksa proksi melalui curl
curl -x http://user:[email protected]:8080 https://api.ipify.org
Kesalahan 2: SOCKS5 tidak menerima otorisasi
Penyebab: Playwright (Chromium) memiliki dukungan terbatas untuk SOCKS5 dengan otorisasi melalui username/password.
Solusi: Gunakan proksi HTTP dengan otorisasi atau atur terowongan SOCKS5 lokal melalui ssh -D tanpa kata sandi.
Kesalahan 3: Proksi berfungsi, tetapi situs tetap memblokir
Penyebab: Menggunakan proksi data center yang terdaftar dalam daftar hitam; mode headless tidak disembunyikan; frekuensi permintaan terlalu tinggi.
Solusi: Beralih ke proksi residential atau mobile, tambahkan playwright-stealth, tingkatkan penundaan antara permintaan.
Kesalahan 4: Kebocoran IP asli (DNS leak)
Penyebab: Permintaan DNS dapat melewati proksi.
Solusi: Playwright secara default mengarahkan DNS melalui proksi saat menggunakan proksi HTTP. Namun, untuk memeriksa, gunakan https://dnsleaktest.com di browser headless.
Kesalahan 5: Kinerja lambat dengan proksi
Penyebab: Proksi residential lebih lambat daripada data center; jarak yang jauh ke server proksi.
Solusi: Pilih proksi di lokasi geografis yang dekat. Untuk tugas tanpa persyaratan ketat untuk anonimitas, gunakan proksi data center — mereka jauh lebih cepat.
| Kesalahan | Solusi Cepat |
|---|---|
| ERR_PROXY_CONNECTION_FAILED | Periksa curl, login/password, ketersediaan port |
| 407 Proxy Auth Required | Tambahkan username dan password ke konfigurasi proksi |
| Situs menunjukkan CAPTCHA | Ganti jenis proksi ke residential, tambahkan stealth |
| IP tidak berubah saat rotasi | Tutup konteks/browser antara permintaan |
| Timeout koneksi | Tingkatkan timeout di goto(), pilih proksi yang lebih dekat |
Kesimpulan dan rekomendasi
Mengatur proksi di Playwright bukanlah tugas sekali jalan, tetapi bagian dari arsitektur alat otomatisasi Anda. Jenis proksi yang dipilih dengan benar, rotasi IP yang cerdas, dan penyamaran mode headless bersama-sama memberikan kinerja yang stabil bahkan di situs dengan perlindungan anti-bot yang agresif.
Mari kita ringkas pilihan jenis proksi untuk tugas tertentu:
- Pemrosesan data terbuka tanpa perlindungan ketat — proksi data center yang cepat cocok.
- Marketplace (Wildberries, Ozon), agregator berita — proksi residential dengan rotasi diperlukan.
- Media sosial (Instagram, Facebook, TikTok) dan situs dengan Cloudflare — hanya proksi mobile atau residential.
- Penguji geolokasi — jenis proksi apa pun di negara yang diperlukan, yang penting adalah kesesuaian zona waktu.
- Pemrosesan data massal dengan frekuensi tinggi — proksi residential yang berputar dengan titik akhir gateway.
Jika Anda membangun sistem pengambilan data atau pengujian otomatis di Playwright dan memerlukan kinerja yang stabil tanpa pemblokiran, kami merekomendasikan untuk mempertimbangkan proksi residential — mereka memberikan tingkat kepercayaan yang tinggi dari situs dan mendukung rotasi IP melalui satu titik akhir, yang menyederhanakan integrasi dengan Playwright menjadi beberapa baris kode.