Socks5Proxy

Selenium 代理設定:在 Chrome 與 Firefox 連接 SOCKS5·HTTP 代理

本指南示範Selenium 4啟動Chrome與Firefox時,連接Socks5Proxy的HTTP與SOCKS5代理方法,並說明因Chrome啟動參數不支援代理密碼,需改用IP授權的設定。

為什麼在 Selenium 中代理驗證較困難?

Chrome 雖然可以透過 --proxy-server 參數接收代理地址,但無法識別地址中的帳號密碼。當連接到需要驗證的代理時,瀏覽器會彈出認證視窗,這在 Selenium 中難以自動填寫。

最乾淨的解決方案是IP授權。在儀表板中註冊運行Selenium的服務器或PC的IPv4,代理將接受該IP的連接,無需用戶名和密碼。這樣在Chrome中只需輸入ip:port即可。最多可註冊10個IP,可在多台服務器上共享使用。

範例使用 IP 198.51.100.23,HTTP 端口 8000,SOCKS5 端口 1080。

pip install selenium

如何在 Chrome 上設定 HTTP 代理?

註冊 IP 授權後,將地址填入 ChromeOptions 的 --proxy-server 參數。Selenium 4.6 以上版本會自動透過 Selenium Manager 下載正確的 chromedriver,無需手動安裝。

即使在 headless 模式下,相同參數仍會生效。您可透過開啟 IP 檢查網站來確認頁面顯示的 IP 是否為代理 IP。

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()

如何在 Chrome 上使用 SOCKS5 代理?

在 --proxy-server 填入 socks5:// 地址即可。Chrome 使用 SOCKS5 時會由代理端解析域名,但某些環境可能仍會殘留內部 DNS 查詢,這時常用 --host-resolver-rules 參數來阻擋本地名稱解析。

SOCKS5 也使用 IP 授權連接,因為 Chrome 不支援 SOCKS 代理的帳號密碼驗證。

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()

如何在 Firefox 上連接?

Firefox 透過偏好設定值設定代理。將 network.proxy.type 設為 1(手動) 並填入 HTTP/SOCKS 地址與端口。SOCKS5 需設 network.proxy.socks_version 為 5,network.proxy.socks_remote_dns 為 True 讓代理端解析域名。

Firefox 同樣無法透過啟動參數設定代理密碼,使用 IP 授權最為簡便。

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()

如何讓多瀏覽器以不同IP同時運作?

為每個瀏覽器設定不同代理地址即可分別執行。以下範例透過API取得ip:port列表後,以3組不同IP啟動瀏覽器。請依伺服器規格調整同時執行數量,因單一瀏覽器記憶體消耗較大。

長時間使用瀏覽器進行操作時,建議固定單一IP並維持至任務完成,避免中途更換。

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()

若必須使用帳號密碼驗證該如何處理?

若無法使用 IP 授權,例如 IP 經常變更的環境,有兩種解決方法。第一種是使用 selenium-wire 等中介代理庫代為填入認證資訊,第二種是在同一伺服器上啟動無需認證的本地中繼代理,讓 Chrome 連接本地地址,本地中繼則使用用戶名·密碼連接 Socks5Proxy。

兩種方式都會增加一個管理元件。若條件允許,在固定IP伺服器使用IP授權是最簡單快速的方式。

如何設定瀏覽器環境符合目標國家?

根據 IP 國家調整 Chrome 的 --lang 參數與 Accept-Language 設定,頁面將以該國語言開啟。若時區對網站很重要,可使用 CDP 指令 Emulation.setTimezoneOverride 調整時區。

視窗大小可透過 --window-size 參數設定,若需手機畫面,可使用模擬行動裝置設定。將這些值設定為國家群組,即可在多國進行一致的測試。

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()

Selenium Grid 或遠端瀏覽器也用相同設定嗎?

是的。ChromeOptions和FirefoxOptions在遠端執行時也能正常傳遞。將相同選項傳遞給webdriver.Remote,Grid節點的瀏覽器將透過該代理連接。此時,IP驗證中註冊的IP是實際執行瀏覽器的Grid節點的出口IP,而非執行代碼的PC。

若有多個節點,請註冊所有節點的IP。最多可註冊10個。若雲端節點IP經常變動,為節點分配固定IP會更方便管理。

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()

連線失敗時的檢查步驟

ERR_PROXY_CONNECTION_FAILED 通常因地址或端口錯誤。請確認未將 SOCKS5 端口用於 HTTP 地址。若出現 ERR_TUNNEL_CONNECTION_FAILED 或認證彈窗,可能是 IP 授權白名單與實際出口 IP 不符。請在伺服器上透過無代理 cURL api.ipify.org 確認出口 IP 後重新註冊。

雲端伺服器重啟後出口 IP 可能變更。請使用固定 IP,或於 IP 變更時同步更新儀表板的註冊清單。

Selenium 代理設定:Chrome·Firefox 連接方法 | Socks5Proxy