Selenium WebDriver adalah salah satu alat paling populer untuk otomatisasi browser dan pengambilan data. Saat bekerja dengan volume permintaan yang besar atau saat perlu mengatasi batasan geografis, sangat penting untuk mengatur proxy dengan benar. Dalam panduan ini, kita akan membahas semua cara untuk mengintegrasikan proxy ke dalam Selenium untuk berbagai browser dan bahasa pemrograman, serta menyelesaikan masalah umum yang dihadapi oleh pengembang.
Mengapa menggunakan proxy di Selenium
Saat mengotomatiskan web scraping atau pengujian melalui Selenium, ada beberapa tugas yang tidak dapat diselesaikan tanpa proxy:
- Menghindari pembatasan laju — banyak situs membatasi jumlah permintaan dari satu alamat IP. Tanpa proxy, skrip Anda akan cepat diblokir setelah 50-100 permintaan.
- Pembatasan geografis — jika perlu mengambil konten yang hanya tersedia dari negara tertentu, proxy dengan IP dari geolokasi yang diperlukan menyelesaikan masalah ini.
- Pembagian beban — saat melakukan pengambilan data secara massal, rotasi alamat IP melalui proxy memungkinkan untuk membagi permintaan dan menghindari deteksi bot.
- Penguji lokal — untuk memeriksa bagaimana situs ditampilkan kepada pengguna dari berbagai negara, diperlukan proxy dari wilayah yang sesuai.
- Menghindari sistem anti-bot — perlindungan modern (Cloudflare, DataDome) menganalisis reputasi IP. Proxy berkualitas membantu terlihat seperti pengguna biasa.
Tanpa pengaturan proxy yang benar, skrip Selenium Anda akan berfungsi tidak stabil: menerima captcha, larangan sementara, atau pemblokiran akses sepenuhnya. Ini sangat kritis saat mengambil data dari platform e-commerce, media sosial, atau situs dengan perlindungan agresif terhadap bot.
Jenis proxy yang digunakan
Pemilihan jenis proxy tergantung pada tugas. Untuk otomatisasi Selenium, ada tiga jenis proxy utama, masing-masing dengan keuntungannya sendiri:
| Jenis Proxy | Kecepatan | Anonimitas | Skenario Terbaik |
|---|---|---|---|
| Proxy Data Center | Sangat tinggi (100+ Mbps) | Sedang | Pengambilan data publik, pengujian kinerja, pemeriksaan massal |
| Proxy Residensial | Sedang (10-50 Mbps) | Sangat tinggi | Menghindari sistem anti-bot, pengambilan media sosial, e-commerce, situs dengan perlindungan ketat |
| Proxy Seluler | Sedang (5-30 Mbps) | Maksimal | Bekerja dengan versi seluler situs, media sosial, aplikasi dengan pemeriksaan IP seluler |
Rekomendasi pemilihan:
- Untuk pengambilan data dari situs berita, API terbuka, katalog sederhana — proxy data center sudah cukup. Mereka lebih murah dan lebih cepat.
- Untuk bekerja dengan Amazon, eBay, Google, media sosial — hanya proxy residensial. Platform ini aktif memblokir IP dari data center.
- Untuk mensimulasikan pengguna seluler atau bekerja dengan Instagram, TikTok — proxy seluler sangat diperlukan.
- Untuk pengujian geolokasi — pilih proxy dengan kemampuan memilih negara dan kota tertentu.
Pengaturan proxy untuk Chrome di Selenium
Chrome WebDriver adalah pilihan paling populer untuk otomatisasi Selenium. Pengaturan proxy dilakukan melalui objek ChromeOptions. Mari kita lihat beberapa cara.
Metode 1: Proxy HTTP/HTTPS tanpa otentikasi (Python)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# Pengaturan proxy
PROXY = "123.45.67.89:8080" # Ganti dengan server proxy Anda
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{PROXY}')
# Opsi tambahan untuk stabilitas
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
# Menjalankan driver
driver = webdriver.Chrome(options=chrome_options)
# Memeriksa IP
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
Metode 2: Proxy SOCKS5 (Python)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
PROXY = "123.45.67.89:1080"
chrome_options = Options()
# Untuk SOCKS5, tentukan protokol secara eksplisit
chrome_options.add_argument(f'--proxy-server=socks5://{PROXY}')
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
Penting: Chrome mendukung proxy HTTP, HTTPS, dan SOCKS5. Untuk SOCKS4, diperlukan pengaturan tambahan atau penggunaan ekstensi.
Pengaturan proxy untuk Chrome di Java
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.Proxy;
public class ChromeProxyExample {
public static void main(String[] args) {
// Pengaturan proxy
Proxy proxy = new Proxy();
proxy.setHttpProxy("123.45.67.89:8080");
proxy.setSslProxy("123.45.67.89:8080");
ChromeOptions options = new ChromeOptions();
options.setProxy(proxy);
options.addArguments("--no-sandbox");
WebDriver driver = new ChromeDriver(options);
driver.get("https://httpbin.org/ip");
System.out.println(driver.getPageSource());
driver.quit();
}
}
Pengaturan proxy untuk Firefox di Selenium
Firefox WebDriver menggunakan pendekatan berbeda untuk mengatur proxy melalui profil browser. Ini memberikan lebih banyak fleksibilitas, tetapi memerlukan pemahaman tentang parameter konfigurasi.
Proxy HTTP/HTTPS untuk Firefox (Python)
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080
firefox_options = Options()
# Pengaturan proxy melalui preferensi
firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.http", PROXY_HOST)
firefox_options.set_preference("network.proxy.http_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.ssl", PROXY_HOST)
firefox_options.set_preference("network.proxy.ssl_port", PROXY_PORT)
# Menonaktifkan proxy untuk alamat lokal
firefox_options.set_preference("network.proxy.no_proxies_on", "localhost,127.0.0.1")
driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
Proxy SOCKS5 untuk Firefox (Python)
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
PROXY_HOST = "123.45.67.89"
PROXY_PORT = 1080
firefox_options = Options()
firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.socks", PROXY_HOST)
firefox_options.set_preference("network.proxy.socks_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.socks_version", 5)
# Untuk SOCKS5 dengan DNS melalui proxy
firefox_options.set_preference("network.proxy.socks_remote_dns", True)
driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
Keuntungan Firefox: parameter network.proxy.socks_remote_dns memungkinkan melakukan permintaan DNS melalui proxy, yang meningkatkan anonimitas dan membantu menghindari pemblokiran pada tingkat DNS.
Bekerja dengan proxy yang memerlukan otentikasi
Sebagian besar layanan proxy berkualitas menggunakan otentikasi dengan nama pengguna dan kata sandi. Selenium tidak mendukung pengiriman kredensial langsung dalam URL proxy untuk Chrome, sehingga diperlukan solusi alternatif.
Metode 1: Ekstensi Chrome untuk otentikasi (direkomendasikan)
Kita membuat ekstensi Chrome sementara yang secara otomatis mengisi nama pengguna dan kata sandi saat terhubung ke proxy:
import os
import zipfile
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080
PROXY_USER = "username"
PROXY_PASS = "password"
# Membuat manifest ekstensi
manifest_json = """
{
"version": "1.0.0",
"manifest_version": 2,
"name": "Chrome Proxy",
"permissions": [
"proxy",
"tabs",
"unlimitedStorage",
"storage",
"webRequest",
"webRequestBlocking"
],
"background": {
"scripts": ["background.js"]
}
}
"""
# Skrip untuk otentikasi
background_js = """
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "http",
host: "%s",
port: parseInt(%s)
},
bypassList: ["localhost"]
}
};
chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
function callbackFn(details) {
return {
authCredentials: {
username: "%s",
password: "%s"
}
};
}
chrome.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: [""]},
['blocking']
);
""" % (PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS)
# Membuat ekstensi
plugin_path = 'proxy_auth_plugin.zip'
with zipfile.ZipFile(plugin_path, 'w') as zp:
zp.writestr("manifest.json", manifest_json)
zp.writestr("background.js", background_js)
# Menjalankan Chrome dengan ekstensi
chrome_options = Options()
chrome_options.add_extension(plugin_path)
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
os.remove(plugin_path) # Menghapus file sementara
Metode 2: Firefox dengan otentikasi (lebih mudah)
Firefox memungkinkan pengiriman kredensial melalui pengaturan profil:
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080
PROXY_USER = "username"
PROXY_PASS = "password"
firefox_options = Options()
firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.http", PROXY_HOST)
firefox_options.set_preference("network.proxy.http_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.ssl", PROXY_HOST)
firefox_options.set_preference("network.proxy.ssl_port", PROXY_PORT)
# Otentikasi (tidak selalu berhasil, tergantung versi Firefox)
firefox_options.set_preference("network.proxy.username", PROXY_USER)
firefox_options.set_preference("network.proxy.password", PROXY_PASS)
# Menonaktifkan permintaan otentikasi
firefox_options.set_preference("network.automatic-ntlm-auth.trusted-uris", PROXY_HOST)
driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()
Catatan: Jika penyedia proxy Anda mendukung whitelist IP, lebih mudah untuk menambahkan IP server Anda ke dalam daftar putih dan menggunakan proxy tanpa otentikasi.
Rotasi proxy di Selenium
Saat mengambil data dalam jumlah besar, sangat penting untuk mengganti proxy untuk menghindari pemblokiran. Ada dua pendekatan: rotasi pada tingkat kode dan penggunaan proxy rotasi.
Rotasi pada tingkat kode (membuat driver baru)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import random
# Daftar proxy
PROXY_LIST = [
"123.45.67.89:8080",
"98.76.54.32:8080",
"11.22.33.44:8080",
]
def create_driver_with_proxy(proxy):
"""Membuat driver dengan proxy yang ditentukan"""
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{proxy}')
chrome_options.add_argument('--no-sandbox')
return webdriver.Chrome(options=chrome_options)
# Pengambilan data dengan rotasi
urls_to_parse = [
'https://example.com/page1',
'https://example.com/page2',
'https://example.com/page3',
]
for url in urls_to_parse:
# Memilih proxy secara acak
current_proxy = random.choice(PROXY_LIST)
# Membuat driver baru dengan proxy
driver = create_driver_with_proxy(current_proxy)
try:
driver.get(url)
# Logika pengambilan data Anda
print(f"Parsed {url} via {current_proxy}")
print(driver.title)
except Exception as e:
print(f"Error with {current_proxy}: {e}")
finally:
driver.quit() # Penting untuk menutup driver
Menggunakan proxy rotasi (lebih mudah)
Banyak penyedia proxy menawarkan endpoint rotasi — satu URL yang secara otomatis mengubah IP pada setiap permintaan atau melalui interval tertentu. Ini menyederhanakan kode:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# Endpoint proxy rotasi (IP berubah secara otomatis)
ROTATING_PROXY = "rotating.proxycove.com:8080"
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{ROTATING_PROXY}')
driver = webdriver.Chrome(options=chrome_options)
# Setiap permintaan akan menggunakan IP baru
urls = ['https://httpbin.org/ip'] * 5
for url in urls:
driver.get(url)
print(driver.find_element("tag name", "body").text)
# Setiap output akan menunjukkan IP yang berbeda
driver.quit()
Rekomendasi: Untuk proyek besar, gunakan proxy rotasi — ini menghemat sumber daya (tidak perlu membuat ulang driver) dan menyederhanakan kode. Proxy residensial biasanya mendukung rotasi secara default.
Kesalahan umum dan solusinya
Kesalahan: "ERR_PROXY_CONNECTION_FAILED"
Penyebab: Selenium tidak dapat terhubung ke server proxy.
Solusi:
- Periksa keakuratan IP dan port proxy
- Pastikan proxy aktif (periksa melalui curl:
curl -x http://123.45.67.89:8080 https://httpbin.org/ip) - Periksa firewall — mungkin koneksi keluar ke proxy diblokir
- Jika menggunakan otentikasi, periksa keakuratan nama pengguna/kata sandi
Kesalahan: "ERR_TUNNEL_CONNECTION_FAILED"
Penyebab: Masalah dengan koneksi HTTPS melalui proxy.
Solusi:
- Pastikan proxy mendukung HTTPS (metode CONNECT)
- Untuk situs HTTPS, gunakan proxy HTTPS atau SOCKS5
- Tambahkan opsi untuk mengabaikan kesalahan SSL:
chrome_options.add_argument('--ignore-certificate-errors')
Kesalahan: Proxy berfungsi, tetapi situs mendeteksi bot
Penyebab: Situs menggunakan metode deteksi canggih (fingerprinting, analisis perilaku).
Solusi:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{PROXY}')
# Menonaktifkan flag webdriver (tanda utama otomatisasi)
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=chrome_options)
# Menghapus navigator.webdriver
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
'source': '''
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
'''
})
driver.get('https://bot.sannysoft.com/') # Situs untuk memeriksa deteksi
Selain itu, disarankan untuk menggunakan pustaka undetected-chromedriver, yang secara otomatis menerapkan banyak teknik anti-deteksi.
Masalah: Memuat halaman lambat melalui proxy
Penyebab: Proxy terlalu terbebani atau berada jauh secara geografis.
Solusi:
- Pilih proxy yang lebih dekat ke server target (misalnya, untuk pengambilan data dari situs AS, gunakan proxy AS)
- Gunakan proxy data center untuk tugas di mana kecepatan lebih penting daripada anonimitas
- Atur timeout di Selenium untuk menghindari hang:
from selenium.webdriver.support.ui import WebDriverWait
driver.set_page_load_timeout(30) # Maksimum 30 detik untuk memuat
driver.implicitly_wait(10) # Tunggu implisit untuk elemen
Praktik terbaik saat bekerja dengan proxy
1. Gunakan kumpulan proxy
Jangan bergantung pada satu server proxy. Buat kumpulan dari 10-50 proxy dan rotasi mereka. Jika satu proxy diblokir, pengambilan data akan dilanjutkan dengan yang lain.
2. Tambahkan jeda acak
Bahkan dengan proxy, permintaan yang terlalu cepat terlihat mencurigakan. Tambahkan jeda acak 2-5 detik antara permintaan:
import time
import random
for url in urls:
driver.get(url)
# Pengambilan data...
time.sleep(random.uniform(2, 5)) # Jeda acak 2-5 detik
3. Monitor kualitas proxy
Periksa proxy sebelum digunakan. Keluarkan dari kumpulan yang tidak merespons atau mengembalikan kesalahan:
import requests
def check_proxy(proxy):
"""Memeriksa keberhasilan proxy"""
try:
response = requests.get(
'https://httpbin.org/ip',
proxies={'http': f'http://{proxy}', 'https': f'http://{proxy}'},
timeout=10
)
return response.status_code == 200
except:
return False
# Penyaringan proxy yang berfungsi
working_proxies = [p for p in PROXY_LIST if check_proxy(p)]
print(f"Proxy yang berfungsi: {len(working_proxies)}/{len(PROXY_LIST)}")
4. Gunakan mode headless dengan hati-hati
Browser headless lebih mudah terdeteksi. Untuk situs yang kompleks, jalankan browser dalam mode biasa atau gunakan --window-size sebagai pengganti --headless.
5. Catat semua permintaan
Simpan informasi tentang proxy yang digunakan untuk setiap permintaan. Ini akan membantu mengidentifikasi proxy bermasalah dan memperbaiki kesalahan.
6. Hormati robots.txt dan batasan laju
Bahkan dengan proxy, hormati aturan situs. Pengambilan data yang agresif dapat menyebabkan pemblokiran seluruh subnet proxy, yang merugikan pengguna lain.
Kesimpulan
Pengaturan proxy yang benar di Selenium WebDriver adalah dasar dari pengambilan data dan otomatisasi yang stabil. Kami telah membahas semua cara utama untuk mengintegrasikan proxy untuk Chrome dan Firefox, bekerja dengan otentikasi, rotasi alamat IP, dan menyelesaikan masalah umum. Yang terpenting adalah memilih jenis proxy yang sesuai untuk tugas Anda: untuk pengambilan data sederhana, cukup dengan proxy data center, sementara untuk bekerja dengan platform yang dilindungi, diperlukan proxy residensial atau seluler.
Ingatlah praktik terbaik: gunakan kumpulan proxy, tambahkan jeda acak, monitor kualitas koneksi, dan terapkan teknik anti-deteksi. Ini akan meningkatkan stabilitas skrip Anda dan mengurangi risiko pemblokiran hingga puluhan kali.
Jika Anda berencana untuk otomatisasi pengambilan data dengan persyaratan tinggi untuk anonimitas dan menghindari sistem anti-bot, kami merekomendasikan untuk mencoba proxy residensial — mereka memberikan stabilitas maksimum saat bekerja dengan situs mana pun, termasuk media sosial, platform e-commerce, dan layanan dengan perlindungan canggih. Untuk tugas di mana kecepatan pemrosesan volume data besar sangat penting, proxy data center akan menjadi pilihan optimal dalam hal rasio harga-kinerja.