In this Article
Proxy Selenium Wire adalah cara paling singkat untuk menjalankan otomatisasi browser terautentikasi di Python, karena Selenium Wire menerima URL proxy login:password secara langsung dalam satu opsi, alih-alih memaksa penggunaan solusi extension yang diperlukan Selenium biasa. Selenium Wire juga menampilkan setiap HTTP request dan response yang dibuat browser, sehingga scraper dan tim QA mengandalkannya.
Panduan ini membahasnya secara lengkap. Isinya mencakup instalasi dan pinning library secara aman, pengaturan proxy terautentikasi, verifikasi exit IP, pemeriksaan dan penantian request, pengeditan header, rotasi IP, menjalankan mode headless, penghematan memori, penanganan sertifikat HTTPS secara jujur, penggunaan bersama undetected-chromedriver, serta kapan alternatif modern lebih sesuai.
DataImpulse adalah penyedia proxy beretika yang menawarkan lebih dari 90 juta alamat IP residential, mobile, dan datacenter di 195 negara. DataImpulse menggunakan model pay-as-you-go mulai 1 dolar per GB dengan lalu lintas yang tidak kedaluwarsa, serta digunakan untuk web scraping, verifikasi iklan, pemantauan harga, riset pasar, dan pengelolaan banyak akun.
Fakta Utama
- Proxy Selenium Wire: Selenium Wire menerima URL proxy login:password secara langsung di seleniumwire_options, sehingga otomatisasi browser terautentikasi berjalan tanpa solusi extension yang diperlukan Selenium biasa.
- Jenis proxy terbaik: proxy residential rotating, yang menggunakan IP konsumen asli untuk melewati deteksi.
- Harga: mulai 1 dolar per GB, pay-as-you-go, dengan lalu lintas tanpa kedaluwarsa dan tanpa langganan.
- Cakupan: Lebih dari 90 juta IP yang diperoleh secara etis di 195 negara.
- Keandalan: Tingkat keberhasilan 99,51%, dengan nilai 4,8 dari 5 di G2.
- Protokol dan penargetan: HTTP, HTTPS, dan SOCKS5, termasuk penargetan negara.

Apa itu Selenium Wire dan apakah masih dipelihara?
Selenium Wire adalah library Python yang memperluas Selenium agar skrip Anda dapat memeriksa, menunggu, dan mengubah HTTP request serta response browser, sekaligus menambahkan dukungan proxy terautentikasi bawaan. Selenium Wire bekerja dengan menjalankan proxy man-in-the-middle lokal yang menjadi tujuan browser, lalu meneruskan lalu lintas ke upstream proxy Anda yang sebenarnya.
Catatan pentingnya, proyek asli telah diarsipkan dan tidak lagi dipelihara secara aktif. Selenium Wire masih berfungsi baik di production, tetapi Anda sebaiknya melakukan pinning versi dan menguji setiap peningkatan Selenium, Chrome, atau dependency secara terpisah sebelum merilisnya. Tersedia fork komunitas yang meneruskan perbaikan kompatibilitas, dan tabel perbandingan di bagian akhir panduan ini menunjukkan kapan tool terpelihara seperti Playwright menjadi pilihan jangka panjang yang lebih baik.
Alasan tim masih memilihnya adalah kemudahan. Jika Anda sudah memiliki test suite atau scraper Selenium, menambahkan Selenium Wire hanya memerlukan perubahan import satu baris ditambah opsi proxy, dan Anda langsung memperoleh dukungan proxy terautentikasi serta kemampuan membaca setiap request yang dibuat halaman. Membangun kembali visibilitas tingkat request itu pada Selenium biasa memerlukan usaha nyata, jadi bagi codebase yang sudah ada, kompromi ini sering kali sepadan walaupun statusnya diarsipkan. Jika Anda baru menggunakan browser sungguhan untuk pengumpulan data, panduan kami tentang cara melakukan scraping pada halaman web dinamis membahas gambaran rendering yang lebih luas dan kapan browser benar-benar diperlukan.
Bagaimana menginstal Selenium Wire dan melakukan pinning versi agar tidak rusak?
Instal selenium-wire bersama selenium, dan lakukan pinning blinker di bawah 1.8 karena rilis itu menghapus nama internal yang diimpor Selenium Wire saat mulai berjalan. Karena proyek ini diarsipkan, dependency tanpa versi tetap adalah penyebab paling umum pengaturan yang semula berfungsi tiba-tiba gagal.
Kegagalan klasiknya adalah ImportError pada WeakNamespace setelah blinker diperbarui otomatis. Pinning mencegahnya:
# Selenium Wire is archived. Pin known-good versions so an upstream release
# does not break your build overnight.
#
# blinker >= 1.8 removed blinker._saferef / WeakNamespace, which Selenium Wire
# imports at startup. On blinker 1.8+ you get:
# ImportError: cannot import name 'WeakNamespace' from 'blinker'
# The fix is to hold blinker below 1.8.
pip install "selenium-wire==5.1.0" "selenium==4.9.1" "blinker==1.7.0"
# Selenium Wire also depends on brotli and can trip on very new Selenium.
# If you must run current Selenium, test in a throwaway virtualenv first, or
# move to a maintained fork such as selenium-wire-2 that tracks these fixes.
Simpan pin ini dalam file requirements agar continuous integration dan rekan satu tim mendapatkan kombinasi yang sama dan telah terbukti berfungsi. Saat Anda ingin beralih ke Selenium terkini, perlakukan sebagai peningkatan yang disengaja dengan pengujian tersendiri, bukan membiarkan pip memilih versi terbaru untuk semuanya.
Bagaimana menyiapkan proxy terautentikasi di Selenium Wire?
Berikan dictionary proxy di dalam seleniumwire_options saat Anda membuat driver, dengan username dan password tertanam dalam URL serta localhost dikecualikan melalui no_proxy. Ini adalah fitur utama yang membuat Selenium Wire layak digunakan dibanding Selenium biasa untuk pekerjaan proxy.
Import webdriver dari seleniumwire, bukan dari selenium, lalu berikan opsi tersebut. Kredensial, host, dan port tersedia di dashboard penyedia Anda. Untuk DataImpulse, host-nya adalah gw.dataimpulse.com dan port-nya 823:
from seleniumwire import webdriver # import from seleniumwire, not selenium
proxy_url = "http://login:[email protected]:823"
seleniumwire_options = {
"proxy": {
"http": proxy_url,
"https": proxy_url,
"no_proxy": "localhost,127.0.0.1",
}
}
driver = webdriver.Chrome(seleniumwire_options=seleniumwire_options)
driver.get("https://example.com")
print(driver.title)
driver.quit()
Entri no_proxy mencegah alamat lokal menggunakan proxy agar driver dapat berkomunikasi langsung dengan ChromeDriver. Jika autentikasi salah, biasanya Anda akan melihat response 407; catatan kami tentang error 407 Proxy Authentication Required menjelaskan cara mendiagnosisnya. Untuk memahami cara kerja proxy dengan kredensial secara umum, lihat proxy residential.
Bagaimana memverifikasi bahwa exit IP proxy berfungsi?
Arahkan driver ke endpoint IP-echo seperti api.ipify.org dan pastikan alamat yang dikembalikan adalah milik proxy, bukan mesin Anda sendiri. Jangan pernah menganggap proxy sudah digunakan hanya karena halaman berhasil dimuat.
import json
from seleniumwire import webdriver
proxy_url = "http://login:[email protected]:823"
seleniumwire_options = {
"proxy": {"http": proxy_url, "https": proxy_url,
"no_proxy": "localhost,127.0.0.1"}
}
driver = webdriver.Chrome(seleniumwire_options=seleniumwire_options)
driver.get("https://api.ipify.org/?format=json")
body = driver.find_element("tag name", "body").text
exit_ip = json.loads(body)["ip"]
print("Exit IP:", exit_ip) # should be the proxy, not your own address
driver.quit()
Jika response menampilkan IP asli Anda, ada tiga hal yang perlu diperiksa: no_proxy tidak secara tidak sengaja cocok dengan target Anda, kredensial benar, dan Anda mengimpor webdriver dari seleniumwire. Jalankan pemeriksaan ini sebagai langkah pertama setiap job baru, lalu jalankan kembali setelah mengubah pengaturan proxy.
Bagaimana memeriksa dan menunggu request tertentu?
Baca driver.requests untuk menelusuri setiap request dan response yang dibuat browser, lalu gunakan driver.wait_for_request untuk menunggu hingga panggilan yang cocok muncul. Kemampuan inilah yang membedakan Selenium Wire dari WebDriver biasa, dan sangat berharga untuk menemukan JSON API di balik sebuah halaman.
from seleniumwire import webdriver
driver = webdriver.Chrome(seleniumwire_options=seleniumwire_options)
driver.get("https://example.com/products")
# Block until a request whose URL matches the regex is captured.
request = driver.wait_for_request(r"/api/v2/products", timeout=15)
print(request.method, request.url)
print("Status:", request.response.status_code)
print("Type:", request.response.headers["Content-Type"])
# Walk every captured request/response pair the browser made.
for r in driver.requests:
if r.response:
print(r.response.status_code, r.url)
driver.quit()
Panggilan wait_for_request menerima regular expression yang dicocokkan dengan URL dan mengembalikan hasil segera setelah request tertangkap, sehingga Anda terhindar dari jeda tetap yang rapuh. Setelah mengetahui panggilan latar belakang mana yang membawa data, Anda sering dapat melewati rendering sepenuhnya dan mengakses endpoint itu secara langsung, yang jauh lebih hemat. Teknik tersebut merupakan inti dari praktik terbaik web scraping.
Bagaimana mengubah header request dengan interceptor?
Tetapkan sebuah fungsi ke driver.request_interceptor dan fungsi itu berjalan sebelum setiap request meninggalkan browser, sehingga Anda dapat menimpa header, menyisipkan token, atau menghapus parameter. Menetapkan User-Agent dan bahasa yang realistis adalah alasan umum menggunakan fitur ini.
from seleniumwire import webdriver
driver = webdriver.Chrome(seleniumwire_options=seleniumwire_options)
def interceptor(request):
# Delete first, then set, so you replace the header instead of duplicating it.
del request.headers["User-Agent"]
request.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
request.headers["Accept-Language"] = "en-US,en;q=0.9"
driver.request_interceptor = interceptor
driver.get("https://httpbin.org/headers")
print(driver.find_element("tag name", "body").text)
driver.quit()
Hapus header yang ada sebelum menetapkan nilai baru, jika tidak Selenium Wire dapat mengirim header asli dan penggantinya sekaligus. response_interceptor yang sesuai memungkinkan Anda membaca atau menulis ulang response. Buat interceptor tetap ringan karena berjalan pada setiap request, termasuk gambar dan script. Header yang konsisten dan tampak manusiawi adalah salah satu sinyal yang lebih samar dalam praktik terbaik web scraping.
Bagaimana merotasi proxy per request di Selenium Wire?
Ada dua pola: menetapkan ulang driver.proxy saat runtime untuk mengganti konfigurasi pada browser yang sama, atau membuat ulang driver saat Anda juga menginginkan profile dan cookie jar yang bersih. Gateway rotating seperti DataImpulse sudah memberikan exit residential baru pada koneksi baru, sehingga sebagian besar job hanya perlu mengganti config untuk negara yang berbeda.
from seleniumwire import webdriver
base = "http://login:[email protected]:823"
opts = {"proxy": {"http": base, "https": base,
"no_proxy": "localhost,127.0.0.1"}}
driver = webdriver.Chrome(seleniumwire_options=opts)
# Option A: reassign driver.proxy at runtime to switch config (for example a
# different country gateway) without rebuilding the browser. Cheap and fast.
uk = "http://login:[email protected]:823"
driver.proxy = {"http": uk, "https": uk, "no_proxy": "localhost,127.0.0.1"}
driver.get("https://api.ipify.org")
print(driver.find_element("tag name", "body").text)
driver.quit()
# Option B: recreate the driver per job when you need a guaranteed clean
# browser profile and cookie jar as well as a fresh exit IP.
def fresh_driver():
return webdriver.Chrome(seleniumwire_options=opts)
for _ in range(3):
d = fresh_driver()
d.get("https://api.ipify.org")
print(d.find_element("tag name", "body").text)
d.quit()
Menetapkan ulang driver.proxy lebih hemat dan menjaga browser tetap siap, sehingga cocok untuk loop ber-volume tinggi ketika biaya startup paling besar. Membuat ulang driver lebih berat tetapi menjamin isolasi antartugas, yang penting saat target mengaitkan sesi dengan cookie dan local storage selain IP. Pilih berdasarkan kebutuhan Anda akan identitas bersih atau hanya alamat baru. Aturan praktisnya adalah menetapkan ulang proxy saat mengumpulkan halaman publik anonim, dan membuat ulang driver setiap kali Anda melewati batas akun atau login, agar cookie yang bocor dari satu proses tidak terbawa ke proses berikutnya. Target mobile yang melakukan fingerprint secara agresif sering memerlukan proxy mobile untuk kasus tersulit, sementara halaman yang lebih ringan dapat tetap menggunakan exit yang lebih murah.
Bagaimana menjalankan Selenium Wire headless dan menjaga penggunaan memori tetap rendah?
Tambahkan opsi Chrome untuk mode headless dan stabilitas, lalu batasi apa yang ditangkap Selenium Wire agar buffer request tidak tumbuh tanpa batas. Di server, headless dengan capture terbatas menjadi pembeda antara job yang berjalan berjam-jam dan job yang menghabiskan RAM.
Mulailah dengan serangkaian flag Chrome yang andal untuk container headless atau lingkungan CI:
from seleniumwire import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless=new") # modern headless mode
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--window-size=1920,1080")
proxy_url = "http://login:[email protected]:823"
seleniumwire_options = {
"proxy": {"http": proxy_url, "https": proxy_url,
"no_proxy": "localhost,127.0.0.1"}
}
driver = webdriver.Chrome(options=chrome_options,
seleniumwire_options=seleniumwire_options)
driver.get("https://api.ipify.org")
print(driver.find_element("tag name", "body").text)
driver.quit()
Secara default, Selenium Wire menangkap dan menyimpan setiap request serta response dalam buffer, yang justru menghabiskan memori pada proses panjang. Batasi capture dengan driver.scopes, simpan storage di memori, dan bersihkan buffer di antara halaman:
from seleniumwire import webdriver
seleniumwire_options = {
"proxy": {"http": proxy_url, "https": proxy_url,
"no_proxy": "localhost,127.0.0.1"},
"request_storage": "memory", # keep the buffer in RAM, not on disk
}
driver = webdriver.Chrome(seleniumwire_options=seleniumwire_options)
# Only capture the API traffic you care about. Images, fonts, analytics, and
# tracking pixels are ignored, which keeps the capture buffer small.
driver.scopes = [r".*/api/.*"]
driver.get("https://example.com/products")
for request in driver.requests:
print(request.url)
del driver.requests # clear the buffer between pages on long-running jobs
driver.quit()
Daftar scopes adalah sekumpulan regex URL; apa pun di luar daftar tersebut diteruskan tetapi tidak disimpan. Pada scraper yang hanya membutuhkan response API, ini dapat memangkas buffer resident secara drastis. Mengurangi data yang Anda unduh juga menurunkan biaya proxy, karena lalu lintas DataImpulse ditagih per gigabyte.
Bagaimana Selenium Wire menangani HTTPS dan sertifikatnya?
Untuk membaca body request dan response yang terenkripsi, Selenium Wire mendekripsi HTTPS sebagai man-in-the-middle menggunakan sertifikat root miliknya sendiri, yang disisipkan secara otomatis ke profile browser untuk Chrome dan Firefox. Fitur ini kuat, tetapi memiliki batasan penting yang perlu Anda pahami sebelum mengandalkannya.
from seleniumwire import webdriver
proxy_url = "http://login:[email protected]:823"
seleniumwire_options = {
"proxy": {"http": proxy_url, "https": proxy_url,
"no_proxy": "localhost,127.0.0.1"},
# Selenium Wire is a man-in-the-middle proxy: to read HTTPS bodies it
# decrypts traffic using its own root certificate, which it injects into
# the browser profile automatically. These two options relax verification
# on the upstream leg so a mismatched or self-signed cert does not abort.
"verify_ssl": False,
"suppress_connection_errors": True,
}
driver = webdriver.Chrome(seleniumwire_options=seleniumwire_options)
driver.get("https://example.com")
driver.quit()
Ada dua konsekuensi dari desain man-in-the-middle. Pertama, situs web yang menggunakan certificate pinning akan menolak sertifikat yang disisipkan dan interception lalu lintas tersebut akan gagal; dalam kasus itu, nonaktifkan capture untuk host yang terdampak atau jangan periksa body-nya. Kedua, jika Anda menjalankan Chrome dengan profile kustom atau non-default, Anda mungkin perlu memastikan Selenium Wire CA dipercaya di sana. Opsi verify_ssl dan suppress_connection_errors melonggarkan sisi upstream agar sertifikat yang tidak biasa tidak membatalkan proses, tetapi keduanya tidak dapat mengatasi pinning.
Dapatkah Anda menggabungkan undetected-chromedriver, dan apa alternatifnya?
Ya. Selenium Wire menyediakan integrasi undetected-chromedriver yang Anda impor sebagai seleniumwire.undetected_chromedriver, sehingga Anda memperoleh pemeriksaan request dan proxy terautentikasi, sementara undetected-chromedriver mengurangi fingerprint otomatisasi. Kombinasi ini menjadi pilihan utama untuk target dengan pertahanan kuat.
# Selenium Wire ships its own undetected-chromedriver integration.
import seleniumwire.undetected_chromedriver as uc
proxy_url = "http://login:[email protected]:823"
seleniumwire_options = {
"proxy": {"http": proxy_url, "https": proxy_url,
"no_proxy": "localhost,127.0.0.1"}
}
options = uc.ChromeOptions()
options.add_argument("--headless=new")
driver = uc.Chrome(seleniumwire_options=seleniumwire_options, options=options)
driver.get("https://api.ipify.org")
print(driver.find_element("tag name", "body").text)
driver.quit()
Saat Selenium Wire sendiri tidak cocok, dua alternatif memenuhi sebagian besar kebutuhan. Selenium 4 biasa dapat menggunakan proxy terautentikasi melalui extension kecil yang dibuat otomatis oleh helper library:
from selenium import webdriver
# Plain Selenium cannot send proxy credentials on its own. A small helper builds
# a throwaway Chrome extension that answers the proxy auth challenge for you.
from selenium_authenticated_proxy import SeleniumAuthenticatedProxy
proxy = SeleniumAuthenticatedProxy(
proxy_url="http://login:[email protected]:823"
)
options = webdriver.ChromeOptions()
proxy.enrich_options(options)
driver = webdriver.Chrome(options=options)
driver.get("https://api.ipify.org")
print(driver.find_element("tag name", "body").text)
driver.quit()
Playwright menangani proxy terautentikasi secara native dan dipelihara secara aktif, sehingga menjadi fondasi yang lebih baik untuk proyek baru:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
headless=True,
proxy={
"server": "http://gw.dataimpulse.com:823",
"username": "login",
"password": "password",
},
)
page = browser.new_page()
page.goto("https://api.ipify.org")
print(page.inner_text("body"))
browser.close()
Berikut perbandingan ketiganya khusus untuk pekerjaan proxy terautentikasi:
| Tool | Proxy terautentikasi | Pemeriksaan request | Pemeliharaan | Paling cocok untuk |
|---|---|---|---|---|
| Plain Selenium 4 | memerlukan helper extension autentikasi | tidak | aktif | alur sederhana, tanpa capture request |
| Selenium Wire | bawaan, satu opsi | akses penuh request dan response | diarsipkan, lakukan pinning versi | debugging dan kontrol header pada kode Selenium yang sudah ada |
| Playwright | bawaan, native | interception route dan response | aktif | proyek baru yang menginginkan tooling modern |
Saran migrasi: jika Anda hanya memerlukan proxy dengan kredensial dan tanpa capture request, Selenium biasa dengan extension autentikasi adalah pilihan paling ringan dan tetap menggunakan kode yang dipelihara. Jika Anda mengandalkan pemeriksaan atau penulisan ulang lalu lintas dan memulai dari awal, Playwright menyediakan kemampuan itu secara native tanpa beban pinning versi. Pertahankan Selenium Wire apabila Anda memiliki codebase Selenium yang sudah ada dan kontrol tingkat request-nya mahal untuk dibangun ulang. Untuk memilih IP di semua tool ini, bandingkan proxy residential, proxy datacenter, dan proxy mobile dengan pertahanan target Anda.

Pertanyaan yang sering diajukan
Bagaimana mengatur proxy terautentikasi di Selenium Wire?
Berikan dict proxy dengan URL http dan https berbentuk login:password@host:port di dalam seleniumwire_options saat Anda membuat driver, lalu tambahkan no_proxy untuk localhost. Tidak diperlukan extension atau solusi dialog autentikasi.
Mengapa Selenium Wire gagal dengan ImportError blinker?
blinker 1.8 menghapus nama internal yang diimpor Selenium Wire saat mulai berjalan. Lakukan pinning blinker di bawah 1.8, misalnya blinker==1.7.0, bersama versi selenium-wire dan selenium yang telah ditetapkan.
Apakah Selenium Wire masih dipelihara?
Proyek asli telah diarsipkan dan tidak lagi dipelihara secara aktif. Selenium Wire masih berfungsi dengan versi yang telah ditetapkan, tetapi uji setiap peningkatan Selenium atau Chrome secara terpisah, dan pertimbangkan fork terpelihara atau Playwright untuk proyek baru.
Bagaimana memeriksa apakah proxy benar-benar digunakan?
Muat layanan IP-echo seperti api.ipify.org di driver dan pastikan alamat yang dikembalikan adalah proxy, bukan milik Anda sendiri. Anda juga dapat membaca driver.requests untuk memastikan lalu lintas melalui gateway.
Dapatkah Selenium Wire membaca lalu lintas HTTPS?
Ya. Selenium Wire bertindak sebagai proxy man-in-the-middle dan menyisipkan sertifikat root miliknya sendiri untuk mendekripsi body HTTPS. Situs web yang menggunakan certificate pinning akan menolaknya, jadi nonaktifkan capture untuk host tersebut.
Kapan DataImpulse bukan pilihan yang tepat?
Jika Anda memerlukan proxy ISP statis, scraping API yang dikelola sepenuhnya, atau akses ke situs web perbankan dan pemerintah, DataImpulse bukan tool yang tepat. DataImpulse berfokus pada proxy residential, mobile, dan datacenter rotating untuk mengumpulkan data publik dan mengakses konten.
Jalankan Selenium Wire melalui proxy andal
Proxy Selenium Wire hanya sebaik IP di belakangnya. Anda dapat merutekan otomatisasi browser melalui IP residential, mobile, atau datacenter yang diperoleh secara etis dengan lalu lintas pay-as-you-go mulai 1 dolar per GB. Buat akun DataImpulse dan mulai dengan sesi rotating atau sticky.
