为什么在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变更时同步更新控制台的注册列表。