Tetapan proxy Selenium, sambungkan SOCKS5·HTTP proxy ke Chrome dan Firefox
Panduan untuk menyambung HTTP dan SOCKS5 proxy Socks5Proxy semasa melancarkan Chrome dan Firefox dengan Selenium 4, serta tetapan menggunakan pengesahan IP kerana pilihan pelancaran Chrome tidak menerima kata laluan proxy.
Mengapa pengesahan proxy dalam Selenium sukar?
Chrome menerima alamat proxy melalui argumen --proxy-server, tetapi tidak menerima username dan password di dalamnya. Jika Anda menghubungkan ke proxy yang memerlukan username dan password, browser akan menampilkan jendela autentikasi, yang sulit diisi dengan Selenium.
Penyelesaian paling kemas ialah pengesahan IP. Daftarkan IPv4 pelayan atau PC yang menjalankan Selenium di dashboard, dan proxy akan menerima sambungan dari IP itu tanpa nama pengguna/kata laluan. Chrome hanya perlu ip:port. Sehingga 10 IP boleh didaftarkan untuk kegunaan pelbagai pelayan.
Contoh menggunakan IP 198.51.100.23, port HTTP 8000, dan port SOCKS5 1080.
pip install seleniumBagaimana cara menghubungkan HTTP proxy ke Chrome?
Selepas mendaftarkan pengesahan IP, tambahkan alamat dalam argumen --proxy-server ChromeOptions. Selenium 4.6 dan ke atas mempunyai Selenium Manager yang memuat turun chromedriver yang sesuai secara automatik tanpa perlu pemasangan berasingan.
Parameter yang sama juga digunakan dalam mod headless. Untuk mengesahkan sambungan, buka alamat semakan IP dan pastikan IP pada skrin adalah IP proksi.
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 dalam --proxy-server. Chrome menggunakan SOCKS5 untuk menyelesaikan nama domain melalui proksi, tetapi dalam beberapa persekitaran, resolusi DNS dalaman mungkin masih berlaku, jadi banyak yang menggunakan argumen --host-resolver-rules untuk menghalang resolusi nama tempatan.
SOCKS5 juga menggunakan pengesahan IP untuk sambungan kerana Chrome tidak menyokong pengesahan nama pengguna dan kata laluan 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 Firefox?
Firefox menentukan proxy melalui nilai preferensi. Set network.proxy.type ke 1 (manual) dan masukkan alamat HTTP atau SOCKS dan port. Untuk SOCKS5, set network.proxy.socks_version ke 5 dan network.proxy.socks_remote_dns ke True agar proxy memeriksa nama.
Firefox juga tidak memiliki cara untuk memasukkan password proxy melalui pengaturan eksekusi, jadi menggunakan IP authorization adalah yang paling sederhana.
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 untuk membuka pelbagai pelayar dengan IP yang berbeza secara serentak?
Tetapkan alamat proksi yang berbeza untuk setiap pelayar dan jalankan secara berasingan. Kod di bawah adalah contoh untuk menerima senarai ip:port melalui API dan membuka tiga pelayar dengan IP yang berbeza. Oleh kerana satu pelayar menggunakan banyak memori, tetapkan bilangan pelayar yang boleh dijalankan secara serentak mengikut saiz pelayan anda.
Untuk tugas yang menggunakan browser untuk tempoh yang panjang seperti sesi log masuk, adalah lebih baik menggunakan satu IP tetap untuk satu browser dan tidak menukarnya sehingga 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 saya perlu menggunakan pengesahan nama pengguna/kata laluan?
Jika dalam persekitaran yang tidak boleh menggunakan pengesahan IP, contohnya persekitaran dengan IP keluar yang sentiasa berubah, terdapat dua kaedah. Pertama, menggunakan perpustakaan proksi perantaraan seperti selenium-wire untuk memasukkan maklumat pengesahan, kedua, menjalankan proksi perantaraan tempatan tanpa pengesahan pada pelayan yang sama, di mana Chrome menyambung ke alamat tempatan dan proksi perantaraan menyambung ke Socks5Proxy dengan nama pengguna dan kata laluan.
Kedua-dua kaedah menambah satu komponen, menjadikan pengurusan lebih rumit. Jika boleh, menggunakan pengesahan IP dari pelayan IP tetap adalah yang paling mudah dan pantas.
Apakah yang perlu ditetapkan untuk menyesuaikan persekitaran pelayar dengan negara tersebut?
Dengan menukar argumen --lang Chrome dan tetapan Accept-Language mengikut negara IP, halaman akan dibuka dalam bahasa negara tersebut. Untuk laman yang penting dengan zon waktu, anda juga boleh menyesuaikan zon waktu dengan arahan CDP Emulation.setTimezoneOverride.
Tetapkan saiz tetingkap dengan argumen --window-size, dan gunakan tetapan emulasi peranti mudah alih jika anda memerlukan skrin telefon. Dengan menyimpan nilai ini sebagai tetapan negara, anda boleh menjalankan ujian yang sama secara konsisten di pelbagai 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()Adakah tetapan yang sama digunakan dalam Selenium Grid atau pelayar jauh?
Ya. ChromeOptions dan FirefoxOptions tetap berlaku dalam eksekusi jarak jauh. Menambahkan opsi yang sama ke webdriver.Remote akan membuat browser di node Grid terhubung melalui proxy tersebut. IP yang didaftarkan untuk IP authorization adalah IP keluar dari node Grid tempat browser dijalankan, bukan PC yang menjalankan kode.
Jika terdapat beberapa nod, daftarkan semua IP nod tersebut. Anda boleh mendaftarkan sehingga 10 IP. Jika nod awan sering berubah, menetapkan IP tetap pada nod akan memudahkan pengurusan.
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()Apakah yang perlu diperiksa apabila sambungan tidak berjaya?
ERR_PROXY_CONNECTION_FAILED sering terjadi karena alamat atau port yang salah. Pastikan Anda tidak memasukkan port SOCKS5 ke alamat HTTP. Jika Anda mendapatkan ERR_TUNNEL_CONNECTION_FAILED atau jendela autentikasi muncul, kemungkinan IP yang terdaftar di IP authorization berbeda dengan IP yang keluar. Periksa IP yang keluar dengan membuka api.ipify.org tanpa proxy dari server dan daftarkan nilainya.
Pelayan awan mungkin menukar IP keluar selepas reboot. Gunakan IP tetap, atau kemas kini senarai pendaftaran di papan pemuka apabila IP berubah.