Skip to content
Advanced / 8 min read

Cara Merotasi Proxy Residensial IPRoyal dengan Playwright di Linux untuk Web Scraping

Gunakan proxy residensial IPRoyal dengan Playwright di Linux untuk scraping berbasis browser. Tutorial lanjutan ini mencakup endpoint HTTP dan SOCKS5, sesi sticky, penargetan negara, rotasi, dan verifikasi.

Linux SOCKS5 HTTP(S) Web Scraping

Cara Merotasi Proxy Residensial IPRoyal dengan Playwright di Linux untuk Web Scraping

Ringkasan

Playwright adalah kerangka kerja otomatisasi browser yang dapat menjalankan Chromium, Firefox, dan WebKit. Untuk web scraping, otomatisasi browser berguna saat situs target bergantung pada JavaScript, cookie, atau rendering dinamis. Proxy residensial IPRoyal memberi Anda IP berotasi dari kumpulan besar, dan IPRoyal juga menawarkan proxy datacenter dan ISP untuk berbagai trade-off. Tutorial ini menunjukkan cara menghubungkan Playwright di Linux ke proxy residensial IPRoyal melalui HTTP atau SOCKS5, merotasi sesi, menggunakan sesi sticky, menerapkan penargetan geo, dan memverifikasi IP keluar. Ini ditulis untuk pekerjaan otomatisasi browser tingkat lanjut di mana Anda sudah memahami Python, kode async, dan autentikasi proxy dasar.

Prasyarat

  • Mesin Linux atau server Linux dengan lingkungan desktop atau headless.
  • Python 3.10 atau lebih baru.
  • Akun IPRoyal dengan kredensial proxy residensial dari dasbor IPRoyal.
  • Host, port, username, dan password untuk endpoint proxy IPRoyal Anda.
  • Keakraban dasar dengan Python, async/await, dan Playwright.
  • Izin untuk melakukan scraping situs target, dan tinjauan terhadap ketentuan dan robots.txt-nya.

Bagaimana Playwright Menggunakan Proxy IPRoyal

Playwright dapat mengirim traffic melalui proxy pada level peluncuran browser atau pada level konteks browser. Proxy residensial IPRoyal menggunakan autentikasi username/password. Parameter host, port, dan username yang tepat berasal dari dasbor IPRoyal Anda.

Gunakan tabel berikut untuk memilih nilai server di Playwright:

Jenis proxy IPRoyal Nilai server Playwright Catatan
Residensial HTTP/HTTPS http://HOST:PORT Pilihan umum untuk otomatisasi browser; berfungsi dengan target HTTPS.
Residensial SOCKS5 socks5://HOST:PORT Gunakan jika paket IPRoyal Anda menyediakan endpoint SOCKS5 atau Anda telah mengaktifkan SOCKS5.
Datacenter http://HOST:PORT atau socks5://HOST:PORT Lebih cepat dan lebih murah, tetapi lebih mungkin diblokir pada target sensitif.
ISP http://HOST:PORT atau socks5://HOST:PORT Opsi IP statis atau sticky dapat membantu untuk alur kerja yang login.
Shadowsocks Listener SOCKS5 lokal Playwright tidak mendukung Shadowsocks secara langsung. Jalankan klien Shadowsocks lokal dan arahkan Playwright ke port SOCKS5-nya.

IPRoyal mencantumkan HTTP, SOCKS5, dan Shadowsocks di antara protokol yang didukungnya, sehingga Anda dapat mencampur otomatisasi browser dengan alat lain nanti.

Langkah-langkah

1. Instal Playwright dan Chromium di Linux

Buat lingkungan Python terisolasi dan instal Playwright dengan Chromium.

python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install playwright python-dotenv
python -m playwright install --with-deps chromium

Flag --with-deps menginstal pustaka sistem yang dibutuhkan Chromium pada Debian dan Ubuntu. Pada distribusi lain, instal dependensi Chromium yang setara atau gunakan image Docker Playwright.

2. Simpan Kredensial Proxy IPRoyal dengan Aman

Buat file .env di direktori proyek Anda. Jangan commit ke kontrol versi.

IPROYAL_PROXY_HOST=your-iproyal-host
IPROYAL_PROXY_PORT=your-iproyal-port
IPROYAL_PROXY_USER=your-iproyal-username
IPROYAL_PROXY_PASS=your-iproyal-password
IPROYAL_PROXY_SCHEME=http

Gunakan nilai yang tepat dari dasbor IPRoyal Anda. Setel IPROYAL_PROXY_SCHEME ke http untuk endpoint HTTP/HTTPS atau socks5 untuk endpoint SOCKS5.

3. Buat Helper Proxy yang Dapat Digunakan Ulang

Buat proxy_config.py. Helper ini membaca kredensial Anda dan membangun dictionary yang diharapkan Playwright.

import os
from dataclasses import dataclass
from dotenv import load_dotenv

load_dotenv()

@dataclass(frozen=True)
class ProxyConfig:
    server: str
    username: str
    password: str

def iproyal_proxy(
    session_id: str | None = None,
    country: str | None = None,
) -> ProxyConfig:
    '''
    Build a Playwright proxy dict for IPRoyal.

    The session and country syntax must match your IPRoyal dashboard.
    The examples below show common patterns only. Replace the f-strings
    with the exact format IPRoyal gives you.
    '''
    host = os.environ['IPROYAL_PROXY_HOST']
    port = os.environ['IPROYAL_PROXY_PORT']
    scheme = os.environ.get('IPROYAL_PROXY_SCHEME', 'http')
    username = os.environ['IPROYAL_PROXY_USER']
    password = os.environ['IPROYAL_PROXY_PASS']

    if country:
        # Example pattern only. Check your IPRoyal dashboard for the exact syntax.
        username = f'{username}-country-{country}'
    if session_id:
        # Example pattern only. Sticky sessions usually attach a session token.
        username = f'{username}-session-{session_id}'

    return ProxyConfig(
        server=f'{scheme}://{host}:{port}',
        username=username,
        password=password,
    )

Jika username IPRoyal Anda sudah berisi parameter penargetan, jangan menduplikasinya. Gunakan format yang ditunjukkan di dasbor dan sesuaikan helper-nya.

4. Luncurkan Playwright dengan Proxy IPRoyal yang Berotasi

Buat browser_check.py. Luncurkan Chromium dengan proxy dan verifikasi IP keluar.

import asyncio
from playwright.async_api import async_playwright
from proxy_config import iproyal_proxy

async def main() -> None:
    proxy = iproyal_proxy()
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=True,
            proxy={
                'server': proxy.server,
                'username': proxy.username,
                'password': proxy.password,
            },
        )
        context = await browser.new_context()
        page = await context.new_page()
        await page.goto('https://httpbin.org/ip', wait_until='domcontentloaded')
        print(await page.locator('body').inner_text())
        await browser.close()

if __name__ == '__main__':
    asyncio.run(main())

Jalankan dengan:

python browser_check.py

Jika respons JSON menunjukkan IP yang bukan milik Anda, proxy berfungsi. Jika Anda menghilangkan ID sesi, endpoint residensial yang berotasi harus mengembalikan IP berbeda di setiap permintaan atau sesi baru.

5. Tambahkan Sesi Sticky untuk Alur Multi-Langkah

Beberapa alur kerja, seperti mengisi keranjang atau menyelesaikan formulir multi-langkah, memerlukan IP keluar yang sama untuk beberapa permintaan. Gunakan token sesi sticky dari dasbor IPRoyal Anda.

async def sticky_session_example() -> None:
    proxy = iproyal_proxy(session_id='checkout-001')
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=True,
            proxy={
                'server': proxy.server,
                'username': proxy.username,
                'password': proxy.password,
            },
        )
        context = await browser.new_context()
        page = await context.new_page()
        await page.goto('https://httpbin.org/ip', wait_until='domcontentloaded')
        print(await page.locator('body').inner_text())
        await browser.close()

Pertahankan session_id yang sama untuk seluruh alur kerja. Gunakan ID sesi baru saat Anda menginginkan IP keluar baru. Masa aktif dan ketersediaan sesi sticky bergantung pada paket IPRoyal dan pengaturan dasbor Anda.

6. Terapkan Penargetan Negara dan Kota

Penargetan negara biasanya diteruskan melalui username proxy. Gunakan kode negara dan format parameter yang tepat dari dasbor IPRoyal Anda.

proxy = iproyal_proxy(country='us')

Jika IPRoyal menyediakan penargetan tingkat kota untuk paket Anda, tambahkan di tempat yang sama Anda menambahkan parameter negara. Jangan menebak formatnya; salin dari dasbor. Verifikasi hasilnya dengan memeriksa IP keluar menggunakan layanan geolokasi IP.

7. Rotasi di Beberapa Konteks Browser Konkuren

Untuk scraping paralel, gunakan kembali satu instance browser dan buat konteks baru per konfigurasi proxy. Ini lebih ringan daripada meluncurkan browser baru untuk setiap permintaan.

import asyncio
from playwright.async_api import async_playwright
from proxy_config import iproyal_proxy

async def scrape_with_contexts(urls: list[str]) -> list[str]:
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)

        async def one(url: str, idx: int) -> str:
            proxy = iproyal_proxy(session_id=f'job-{idx}')
            context = await browser.new_context(
                proxy={
                    'server': proxy.server,
                    'username': proxy.username,
                    'password': proxy.password,
                }
            )
            page = await context.new_page()
            await page.goto(url, wait_until='domcontentloaded', timeout=60000)
            title = await page.title()
            await context.close()
            return title

        results = await asyncio.gather(*(one(url, i) for i, url in enumerate(urls)))
        await browser.close()
        return results

Mulai dengan konkurensi rendah, pantau tingkat blokir, dan tingkatkan secara bertahap. Terlalu banyak sesi paralel dari target yang sama dapat memicu pembatasan laju meskipun Anda merotasi IP.

8. Verifikasi IP Keluar Sebelum Setiap Pekerjaan Besar

Tambahkan langkah verifikasi kecil ke scraper Anda. Periksa IP keluar di awal pekerjaan dan bandingkan dengan negara yang diharapkan atau perilaku sesi.

async def verify_exit_ip(page) -> str:
    await page.goto('https://httpbin.org/ip', wait_until='domcontentloaded')
    body = await page.locator('body').inner_text()
    print(body)
    return body

Jika IP salah, perbaiki username proxy atau parameter sesi sebelum menjalankan crawl penuh.

Pemecahan Masalah

Gejala Kemungkinan penyebab Perbaikan
407 Proxy Authentication Required Username salah, password salah, atau kredensial tidak diteruskan dengan benar Konfirmasi username dan password IPRoyal. Gunakan kolom username dan password Playwright alih-alih menyematkan kredensial di URL server.
net::ERR_PROXY_CONNECTION_FAILED Host, port, atau skema salah; firewall memblokir port proxy Periksa host dan port di dasbor IPRoyal. Coba HTTP dan SOCKS5 secara terpisah. Uji dengan curl sebelum menggunakan Playwright.
IP keluar sama di setiap permintaan Sesi sticky aktif, atau endpoint tidak berotasi Hapus ID sesi, buat sesi baru, atau periksa pengaturan rotasi IPRoyal Anda.
SOCKS5 gagal tetapi HTTP berfungsi Skema atau port salah Gunakan socks5://HOST:PORT dan port SOCKS5 dari dasbor.
Koneksi Shadowsocks gagal Playwright tidak mendukung Shadowsocks secara native Jalankan klien Shadowsocks lokal dan arahkan Playwright ke listener SOCKS5 lokalnya.
Situs menampilkan captcha atau blokir Terlalu banyak permintaan per IP, ketidakcocokan fingerprint browser, atau IP datacenter pada target sensitif Perlambat, gunakan proxy residensial, rotasi sesi, gunakan kembali konteks yang realistis, dan patuhi aturan situs target.

Pemeriksaan command-line cepat dapat mengisolasi masalah proxy dari masalah Playwright:

curl -x 'http://USERNAME:PASSWORD@HOST:PORT' https://httpbin.org/ip

Jika password berisi karakter khusus, lakukan URL-encode atau gunakan opsi --proxy-user curl.

Ringkasan

Anda dapat menggunakan proxy residensial IPRoyal dengan Playwright di Linux dengan menyimpan kredensial di .env, membuat helper proxy yang dapat digunakan ulang, meluncurkan Chromium atau konteks browser dengan dictionary proxy, dan merotasi sesi atau menggunakan sesi sticky sesuai kebutuhan. Gunakan HTTP untuk kesederhanaan, SOCKS5 saat Anda membutuhkannya, dan klien Shadowsocks lokal hanya ketika alur kerja Anda memerlukan tunneling bergaya Shadowsocks. Verifikasi IP keluar sebelum pekerjaan besar, mulai dengan konkurensi rendah, dan sesuaikan rotasi serta penargetan geo menggunakan sintaks yang tepat dari dasbor IPRoyal Anda. IPRoyal adalah penyedia yang disarankan untuk proxy residensial, datacenter, dan ISP, tetapi selalu bandingkan ukuran pool, harga, dan kompatibilitas target sebelum berkomitmen pada stack scraping.