Socks5Proxy

Selenium代理设置,Chrome和Firefox连接SOCKS5·HTTP代理

本指南介绍Selenium 4运行Chrome/Firefox时连接Socks5Proxy的HTTP/SOCKS5代理的方法,以及因Chrome启动参数不支持密码而改用IP认证的配置方案。

为什么在Selenium中代理认证很困难?

Chrome通过--proxy-server参数接收代理地址,但不支持在地址中直接传递用户名和密码。如需使用带认证的代理,浏览器会弹出认证窗口,这在Selenium中难以自动填写。

最简洁的解决方案是IP授权。在仪表板登记运行Selenium的服务器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授权,有两种方案:1) 通过selenium-wire等代理库自动注入认证;2) 在服务器部署本地中转代理,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会更便于管理。

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通常由地址或端口错误导致。请检查是否在HTTP地址中误填SOCKS5端口。若出现ERR_TUNNEL_CONNECTION_FAILED或认证弹窗,可能是IP授权中登记的IP与实际出口IP不符。请用服务器执行无代理的cURL访问api.ipify.org获取真实出口IP并登记。

云服务器重启后出口IP可能变化。请使用固定IP,或在IP变更时同步更新控制台的注册列表。

Selenium代理设置,Chrome·Firefox连接方法 | Socks5Proxy