Socks5Proxy

Pengaturan proxy Selenium, menghubungkan SOCKS5·HTTP proxy ke Chrome dan Firefox

Panduan ini menjelaskan cara menghubungkan HTTP proxy dan SOCKS5 proxy Socks5Proxy saat menjalankan Chrome dan Firefox dengan Selenium 4, serta pengaturan menggunakan IP authorization karena argumen Chrome tidak menerima kata sandi proxy.

Mengapa autentikasi proxy sulit di Selenium?

Chrome menerima alamat proxy melalui argumen --proxy-server, tetapi tidak menerima username dan password di dalam alamat tersebut. Jika mencoba menghubungkan ke proxy yang membutuhkan autentikasi, browser akan menampilkan popup login yang sulit diisi secara otomatis dengan Selenium.

Solusi paling rapi: IP authorization. Daftarkan IPv4 server/PC yang menjalankan Selenium di dashboard, lalu proxy akan menerima koneksi dari IP tersebut tanpa auth. Chrome hanya perlu ip:port. Bisa daftar hingga 10 IP untuk digunakan di banyak server.

Contoh menggunakan IP 198.51.100.23, port HTTP 8000, port SOCKS5 1080.

pip install selenium

Bagaimana cara menghubungkan HTTP proxy ke Chrome?

Setelah mendaftarkan IP authorization, tambahkan alamat ke argumen --proxy-server di ChromeOptions. Selenium 4.6+ dengan Selenium Manager akan otomatis mengunduh chromedriver yang sesuai tanpa perlu instalasi terpisah.

Parameter yang sama tetap berlaku dalam mode headless. Untuk memeriksa koneksi, buka alamat verifikasi IP dan pastikan IP yang ditampilkan adalah IP proxy.

from selenium import webdriver
from selenium.webdriver.common.by import By

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")  # this machine's IP is authorized in the dashboard
opts.add_argument("--headless=new")

driver = webdriver.Chrome(options=opts)
try:
    driver.get("https://api.ipify.org")
    print(driver.find_element(By.TAG_NAME, "body").text)  # should print the proxy IP
finally:
    driver.quit()

Bagaimana cara menggunakan SOCKS5 proxy di Chrome?

Masukkan alamat socks5:// ke --proxy-server. Chrome menggunakan SOCKS5 untuk resolusi DNS melalui proxy, tetapi di beberapa lingkungan, resolusi DNS internal mungkin masih terjadi, sehingga banyak yang menggunakan argumen --host-resolver-rules untuk memblokir resolusi nama lokal.

SOCKS5 juga menggunakan IP authorization karena Chrome tidak mendukung autentikasi username/password untuk SOCKS proxy.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=socks5://198.51.100.23:1080")
# make sure host names are resolved through the proxy
opts.add_argument('--host-resolver-rules=MAP * ~NOTFOUND , EXCLUDE 198.51.100.23')

driver = webdriver.Chrome(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

Bagaimana cara menghubungkan ke Firefox?

Firefox mengatur proxy melalui preferensi. Setel network.proxy.type ke 1 (manual) dan masukkan alamat serta port HTTP/SOCKS. Untuk SOCKS5, setel network.proxy.socks_version ke 5 dan network.proxy.socks_remote_dns ke True agar DNS di-resolve oleh proxy.

Firefox juga tidak memiliki cara untuk memasukkan password proxy melalui opsi eksekusi, jadi otorisasi IP adalah solusi termudah.

from selenium import webdriver

opts = webdriver.FirefoxOptions()
opts.set_preference("network.proxy.type", 1)
opts.set_preference("network.proxy.socks", "198.51.100.23")
opts.set_preference("network.proxy.socks_port", 1080)
opts.set_preference("network.proxy.socks_version", 5)
opts.set_preference("network.proxy.socks_remote_dns", True)

driver = webdriver.Firefox(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

Bagaimana cara membuka beberapa browser dengan IP yang berbeda secara bersamaan?

Anda bisa menjalankan browser secara terpisah dengan memasukkan alamat proxy yang berbeda ke setiap browser. Kode di bawah ini adalah contoh mengambil daftar ip:port dari API dan membuka tiga browser dengan IP yang berbeda. Karena satu browser memakan banyak memori, tentukan jumlah yang bisa dijalankan bersamaan sesuai dengan ukuran server.

Untuk tugas yang memerlukan penggunaan browser dalam waktu lama seperti sesi masuk, sebaiknya tetapkan satu IP untuk satu browser dan jangan mengubahnya hingga tugas selesai.

import requests
from selenium import webdriver

KEY = "YOUR_API_KEY"
lines = requests.get(
    "https://socks5proxy.io/api/v1/proxies/download",
    params={"format": "ip:port", "protocol": "http"},
    headers={"Authorization": "Bearer " + KEY},
    timeout=30,
).text.split()

drivers = []
for line in lines[:3]:
    opts = webdriver.ChromeOptions()
    opts.add_argument("--headless=new")
    opts.add_argument("--proxy-server=http://" + line)
    drivers.append(webdriver.Chrome(options=opts))

for d in drivers:
    d.get("https://api.ipify.org")
    print(d.page_source)
    d.quit()

Bagaimana jika harus menggunakan autentikasi username/password?

Di lingkungan di mana IP authorization tidak bisa digunakan, misalnya IP keluar yang terus berubah, ada dua solusi. Pertama menggunakan library proxy perantara seperti selenium-wire untuk menyisipkan info autentikasi, atau kedua menjalankan proxy lokal tanpa autentikasi di server yang sama, di mana Chrome terhubung ke alamat lokal dan proxy lokal terhubung ke Socks5Proxy dengan username·password.

Kedua metode menambah satu komponen konfigurasi sehingga lebih banyak yang perlu dikelola. Jika memungkinkan, menggunakan IP authorization di server dengan IP tetap adalah yang paling sederhana dan cepat.

Apa yang harus disetel untuk menyesuaikan lingkungan browser dengan negara tersebut?

Sesuaikan argumen --lang Chrome dan pengaturan Accept-Language sesuai negara IP agar halaman terbuka dalam bahasa setempat. Untuk situs yang sensitif terhadap zona waktu, gunakan perintah CDP Emulation.setTimezoneOverride untuk menyesuaikan zona waktu.

Ukuran jendela ditentukan dengan argumen --window-size, dan jika Anda membutuhkan tampilan ponsel, gunakan pengaturan emulasi perangkat mobile. Dengan menyimpan nilai-nilai ini dalam pengaturan grup negara, Anda dapat menjalankan pengujian yang sama secara konsisten di berbagai negara.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")
opts.add_argument("--lang=de-DE")
opts.add_argument("--window-size=1366,900")

driver = webdriver.Chrome(options=opts)
driver.execute_cdp_cmd("Emulation.setTimezoneOverride", {"timezoneId": "Europe/Berlin"})
driver.get("https://example.com/")
driver.quit()

Apakah pengaturan yang sama digunakan di Selenium Grid atau browser remote?

Ya. ChromeOptions dan FirefoxOptions tetap berlaku untuk eksekusi remote. webdriver.Remote dengan opsi sama akan menggunakan proxy tersebut di node Grid. Untuk IP authorization, gunakan IP keluar node Grid, bukan PC lokal.

Jika Anda memiliki beberapa node, daftarkan semua IP node tersebut. Anda dapat mendaftarkan hingga 10 IP. Jika node cloud sering berubah, menambahkan IP tetap ke node akan memudahkan manajemen.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")  # authorize the Grid node IP, not this machine
driver = webdriver.Remote(command_executor="http://grid.example.internal:4444", options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

Apa yang harus diperiksa saat koneksi tidak berhasil?

ERR_PROXY_CONNECTION_FAILED biasanya terjadi karena alamat atau port salah. Pastikan tidak menggunakan port SOCKS5 untuk alamat HTTP. Jika muncul ERR_TUNNEL_CONNECTION_FAILED atau popup autentikasi, kemungkinan IP terdaftar di otorisasi IP tidak sesuai dengan IP keluar. Verifikasi IP keluar dengan cURL ke api.ipify.org tanpa proxy di server, lalu daftarkan IP tersebut.

Server cloud dapat mengubah IP keluar saat restart. Gunakan IP tetap atau perbarui daftar registrasi di dashboard saat IP berubah.

Pengaturan proxy Selenium, metode koneksi Chrome·Firefox | Socks5Proxy