在写代码之前,需要先明确一件事: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.exe http://www.ip138.com --load-extension=SwitchyOmega
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.json 和 background.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.webRequest 与 onAuthRequired。常见做法是通过 addListener 注册监听器,在目标请求触发认证时返回用户名和密码。
官方文档里也给出了 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 没变化,通常问题不在 Selenium,而在代理配置没有真正传递到浏览器网络层。
6. 代理 IP 的选择技巧
- 速度与稳定性:优先选择响应快、连接稳定的代理,避免请求时快时慢。
- 安全性:确认代理服务是否可靠,避免把敏感请求直接暴露给不可信节点。
- 地理位置:根据目标网站的访问区域,选择更合适的代理出口。
7. 结语
在网络爬虫场景里,Selenium 与代理 IP 的组合非常常见。只要把思路从“给 Selenium 配代理”切换成“给浏览器配代理”,很多问题都会一下子变得清楚。
命令行参数适合快速验证,扩展插件适合集中管理,自定义扩展则更适合需要认证和自动切换的复杂场景。选哪种方式,取决于你的项目规模和可维护性要求。