浏览器代理模式与 Selenium 实战

文章发布时间:

最后更新时间:

在写代码之前,需要先明确一件事:Selenium 本身并不负责“设置代理”,真正接收代理配置的是浏览器。也就是说,我们要理解的是浏览器如何工作,而不是把注意力全放在 Selenium API 上。

常见的浏览器代理设置方式大致有五种:使用系统代理、使用浏览器自身代理配置、通过自动检测网络配置代理、借助扩展插件控制代理,以及通过命令行参数直接指定代理。不同浏览器支持的方式并不完全一致,实际开发里最常见的还是命令行参数和插件扩展这两类方案。

1. 通过命令行参数指定代理

可以在启动 Chrome 浏览器时直接传入代理参数:

1
2
3
4
5
6
7
from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=127.0.0.1:8118")

browser = webdriver.Chrome(options=options)
browser.get("http://ip138.com")

这里的 --proxy-server 参数格式为 ip:port。需要注意的是,它并不支持 username:password@ip:port 这种带用户名和密码的写法。如果代理服务器需要认证,访问网页时通常会弹出认证对话框。

虽然 Selenium 也可以配合处理认证弹窗,但这种方式比较麻烦,而且每次启动浏览器时都可能再次触发。更实用的思路,是在浏览器层提前把代理认证配置好。

2. 使用插件配置代理

在 Selenium 中,也可以把预先配置好的浏览器扩展加载进去,这样就不需要每次启动都手动调整代理设置。

早些年 Chrome 上很流行的代理插件是 Proxy SwitchyOmega,不过随着新版 Chrome 的扩展机制变化,这类方案的可用性和兼容性已经不如以前稳定。实际使用时,可以考虑其他代理扩展,或者自己实现一个最小可用的扩展。

1
2
3
4
5
6
7
8
9
10
11
# Chrome 提供以下命令进行设置代理
chrome.exe http://www.ip138.com --load-extension=SwitchyOmega
# 需要注意的是 --load-extension 后面跟的是插件目录,而不是插件文件名。

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--load-extension=SwitchySharp")

browser = webdriver.Chrome(options=chrome_options)
browser.get("http://ip138.com")

如果你手里拿到的是 .crx 文件,也可以直接通过 add_extension 加载:

1
2
3
4
5
6
7
from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
chrome_options.add_extension("SwitchySharp.crx")

browser = webdriver.Chrome(options=chrome_options)
browser.get("http://ip138.com")

3. 自定义扩展实现代理切换

如果不想依赖现成插件,也可以自己写一个简单扩展,把代理规则和认证逻辑封装进去。最基础的结构通常只需要两个文件:manifest.jsonbackground.js

例如,下面这段代码可以把 Chrome 的代理模式设置成固定服务器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
chrome.proxy.settings.set({
value: {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "http",
host: "127.0.0.1",
port: 8118
},
bypassList: ["foobar.com"]
}
},
scope: "regular"
}, function () {});

如果你需要处理代理认证,可以重点关注 官方文档 里的 chrome.webRequestonAuthRequired。常见做法是通过 addListener 注册监听器,在目标请求触发认证时返回用户名和密码。

官方文档里也给出了 Chrome 网络请求流程图,理解这张图之后,再看代理认证、请求拦截和扩展注入,会清晰很多:

Chrome 网络请求流程图

4. 在 Selenium 中配置不同浏览器代理

4.1 使用 Chrome 浏览器

1
2
3
4
5
6
7
8
9
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

proxy_ip = "http://your-proxy-ip:port"
chrome_options = Options()
chrome_options.add_argument("--proxy-server=%s" % proxy_ip)

driver = webdriver.Chrome(options=chrome_options)
driver.get("https://www.example.com")

4.2 使用 Firefox 浏览器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from selenium import webdriver
from selenium.webdriver.firefox.options import Options

proxy_host = "your-proxy-ip"
proxy_port = 8080

firefox_options = Options()
firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.http", proxy_host)
firefox_options.set_preference("network.proxy.http_port", proxy_port)
firefox_options.set_preference("network.proxy.ssl", proxy_host)
firefox_options.set_preference("network.proxy.ssl_port", proxy_port)

driver = webdriver.Firefox(options=firefox_options)
driver.get("https://www.example.com")

5. 检测代理 IP 是否生效

浏览器启动之后,可以访问一个显示当前 IP 的网站,确认代理是否真的生效。例如:

1
2
driver.get("http://whatismyipaddress.com/")
# 手动查看当前显示的 IP 是否与代理 IP 一致

如果页面能打开,但 IP 没变化,通常问题不在 Selenium,而在代理配置没有真正传递到浏览器网络层。

6. 代理 IP 的选择技巧

  • 速度与稳定性:优先选择响应快、连接稳定的代理,避免请求时快时慢。
  • 安全性:确认代理服务是否可靠,避免把敏感请求直接暴露给不可信节点。
  • 地理位置:根据目标网站的访问区域,选择更合适的代理出口。

7. 结语

在网络爬虫场景里,Selenium 与代理 IP 的组合非常常见。只要把思路从“给 Selenium 配代理”切换成“给浏览器配代理”,很多问题都会一下子变得清楚。

命令行参数适合快速验证,扩展插件适合集中管理,自定义扩展则更适合需要认证和自动切换的复杂场景。选哪种方式,取决于你的项目规模和可维护性要求。