Chrome 配置代理:ChromeOptions
Selenium 配置代理的位置在浏览器启动参数里,而不是 WebDriver 里。Chrome 走 ChromeOptions 添加 --proxy-server 参数,一行代码即可让整个浏览器实例的流量经过代理:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://113.120.10.5:8080")
driver = webdriver.Chrome(options=options)
driver.get("http://httpbin.org/ip")
print(driver.page_source) # origin 应为代理出口 IP
driver.quit()
协议前缀支持 http 与 socks5。若 socks5 代理需要远程解析域名,写成 socks5:// 前缀时注意区分本地解析与远端解析版本。
Firefox 配置代理:偏好设置
Firefox 不认 --proxy-server 参数,要通过一系列 preference 开关配置,含义与浏览器 about:config 中的网络选项一一对应:
from selenium import webdriver
options = webdriver.FirefoxOptions()
options.set_preference("network.proxy.type", 1) # 1 = 手动配置
options.set_preference("network.proxy.http", "113.120.10.5")
options.set_preference("network.proxy.http_port", 8080)
options.set_preference("network.proxy.ssl", "113.120.10.5")
options.set_preference("network.proxy.ssl_port", 8080)
options.set_preference("network.proxy.no_proxies_on", "localhost,127.0.0.1")
driver = webdriver.Firefox(options=options)
driver.get("http://httpbin.org/ip")
driver.quit()
network.proxy.type 设为 1 表示手动代理,设为 5 则是使用系统代理,按需切换。http 与 ssl 两项都要填,否则会出现网页走代理而接口直连的情况。
带认证代理的四种处理思路
--proxy-server 不支持在参数里带用户名密码,遇到带认证的代理可以按代价从低到高选择:
- IP 白名单绑定: 在代理商后台把运行爬虫的服务器公网 IP 加入白名单,代理变为免认证使用,改动成本为零。
- 本地中转: 用 gost 在本机起一个无认证入口,转发到上游认证代理:
gost -L=:8080 -F=http://user:pass@upstream:port,Selenium 只需连 127.0.0.1:8080。 - selenium-wire: 安装第三方库 selenium-wire 替换 webdriver,其 proxy 参数原生支持 user:pass@host:port 形式,还能顺带截获请求。
- 扩展注入: 为 Chrome 打包一个带 onAuthRequired 监听的扩展,在弹窗时自动填写凭据,实现较繁琐但零外部依赖。
验证与注意事项
- 先验证再上线: 启动后先访问 httpbin.org/ip 确认出口 IP,避免代理失效导致真实 IP 暴露。
- 每实例独立代理: 并发任务应为每个浏览器实例分配不同代理,通过随机读取代理池实现。
- 异常处理: 代理超时会让 driver.get 抛出 TimeoutException,捕获后应换代理重启浏览器而不是简单重试。
自动化采集请遵守目标网站的 robots 协议与服务条款,控制请求频率,不采集个人信息与受版权保护内容,遵守相关法律法规。
Article ID: 19
(本文仅供技术交流,请遵守法律法规)