Selenium 代理:如何在 Python 中设置并轮换代理

一份在 Selenium Python 中配置、认证、验证和轮换代理的实用指南。
代理位于 Selenium 控制的浏览器与其加载的网站之间。网站看到的是代理的 IP 地址,而不是你的。本指南将介绍如何在 Selenium Python 中设置代理、如何处理认证、如何确认代理确实生效,以及如何在不同会话之间轮换代理。
什么是 Selenium 代理?
Selenium 代理服务器就是一个 IP 地址,由 WebDriver 在浏览器启动时传递给浏览器。一旦如此,浏览器发出的每个请求都会经由该地址传输,而不再使用您的直连线路。
Selenium 依然控制浏览器本身: 打开页面、点击元素、填写表单、等待内容加载。而用于 Selenium 的代理则控制网络路径:目标网站看到的是哪个 IP 地址,以及该 IP 通常显示为属于哪个国家或城市。
Selenium 代理配置通常出现在以下几种场景中:
- 网络爬虫,即网站会限制单个 IP 在特定时间窗口内能够发送的请求数量。
- 需要并行运行大量会话、并使用多个出口地址的浏览器自动化。
- 地理位置测试,即页面需要像来自特定国家的真实访客打开时那样加载。
- QA 工作流程 ,用于检查地区限定内容、默认货币或本地化定价。
如何在 Selenium 中使用 Python 设置代理
Selenium 通过 代理 class in selenium.webdriver.common.proxy来配置代理,并在驱动启动前将其应用到浏览器的 Options 对象上。这正是 selenium.dev 官方文档所记载的方式,在 Chrome、Firefox 和 Edge 上的用法完全相同。
如果您的环境中尚未安装 Selenium,请先安装:
下面是一个完整示例 ,它在 Selenium 中添加代理、打开测试页面,并干净地关闭浏览器:
替换 PROXY_HOST 和 PROXY_PORT 替换为你的服务商网关地址和端口。 http_proxy 和 ssl_proxy 这两个字段同时覆盖普通 HTTP 和 HTTPS 流量,因为如今大多数网站都通过 HTTPS 加载。如果驱动启动时没有报错,并且 driver.title 打印出了值,说明浏览器已正确打开。
但这还不能证明代理已被使用, 该验证会在后面的章节中进行。如果浏览器在启动时卡住,请先确认主机和端口正确无误、并且可以从你的机器访问,再去怀疑 Selenium 出了问题。
Chrome Selenium 代理配置
当 ChromeOptions 携带一个 代理 对象时,Selenium 会将其转换为 W3C 的 代理 能力项,并在会话启动时发送给 ChromeDriver。随后 ChromeDriver 在启动浏览器进程时把该地址传给 Chrome 本身,效果类似于直接使用 –proxy-server 命令行参数:
对于无需认证的代理,这两种方式都适用于 ChromeDriver Selenium 代理配置。
关键细节在于时机: Chrome 只在启动时读取一次代理配置。这两种方式都无法在浏览器已经运行的情况下更改代理,因为 Selenium 无法对正在运行的 Chrome 进程重新配置网络。
要确认 Selenium 代理设置确实生效, 打开一个 IP 检测页面,将在下一节中介绍。
如何在 Selenium 中使用需要认证的代理
实际使用中会遇到两类代理。有些代理只需要主机和端口。另一些还需要用户名和密码才会转发流量。大多数付费服务商,包括 NodeMaven 在内,默认都使用需要认证的代理。
Selenium 的 代理 类没有用户名或密码字段。 这是一个真实存在的限制,而不是疏漏。Selenium 只是把代理地址交给浏览器,认证握手由 Chrome 自身在网络层完成。
当 Chrome 连接到需要认证的代理而地址中未嵌入凭据时,它会弹出一个原生浏览器对话框,要求输入用户名和密码,而 该对话框位于页面 DOM 之外,因此诸如 find_element 之类的标准 WebDriver 命令无法操作它。
在当前版本的 Chrome 中,真正行之有效的 Selenium Python 代理使用方式有两种。
IP 白名单
这种方式不发送凭据,而是由代理服务商允许来自你机器公网 IP 地址的连接,无需登录。NodeMaven 专门针对 Selenium 推荐这种方式。
自动生成的 Chrome 扩展
当白名单方式不可行时,例如在 IP 会变动的机器上,标准的变通做法是使用一个 小型未打包的 Chrome 扩展 ,它会自动使用 chrome.webRequest.onAuthRequired 事件。Selenium 通过以下方式加载该扩展: ChromeOptions.add_extension():
只要扩展配置正确, Chrome 就能自动提供代理凭据, 在代理要求身份验证时自动填写。如果仍然弹出身份验证对话框,请检查扩展是否在浏览器启动前加载、扩展文件是否有效,以及代理凭据和主机设置是否正确。
这种方式可能存在兼容性限制,具体取决于 Chrome 版本、Selenium 配置以及浏览器是否以无头模式运行。如果扩展方式不适合你的环境, IP 白名单是更简单的替代方案, 前提是你的代理服务商支持该功能。
如何检查你的 Selenium 代理是否正常工作
在代码中设置代理 并不能保证浏览器真的使用了它。 端口写错、网关不可达,或某项能力被静默忽略,都可能让浏览器仍在使用你的正常连接,而且不会报错。要确认设置是否生效,就要 打开一个能显示出口 IP 地址的页面,并与你的真实 IP 进行对比。
api.ipify.org 会以 JSON 格式返回你的出口 IP。示例代码读取页面内容并解析 JSON 响应,从中提取 IP 地址。
把脚本运行两次: 一次不配置代理,一次配置代理。 对比以下内容:
- 直连 IP 与代理 IP
- 国家/地区,以及端点是否报告了具体的省/州或城市
- 目标页面能否加载,以及大致需要多长时间
- HTTPS 页面加载时是否出现证书警告
IP 检测工具可以确认对外显示的 IP 地址,并有助于验证代理所在位置。它无法衡量代理质量的方方面面,例如 IP 信誉、有多少用户共用同一个 IP,或长期可用性。
如何在 Selenium 中使用 Python 轮换代理
Selenium 中的代理配置作用于整个 WebDriver 会话, 而非单个请求。正在运行的 Chrome 进程只在启动时读取一次代理设置,因此在 webdriver.Chrome() 已经启动之后再修改 Python 变量,对运行中的浏览器不会产生任何影响。 Selenium 代理是在会话级别轮换的,而不是在会话进行中轮换。
在实际操作中,Selenium 轮换代理归结为以下几种方式:
- 手动修改代理配置 ,在两次独立的脚本运行之间进行。
- 启动新的 WebDriver 会话 ,为每个工作单元使用不同的代理地址。
- 将所有会话都指向同一个轮换网关端点 ,由服务商侧为每次连接分配一个新的 IP。
- 使用粘性会话,即在设定的时长内,跨一次或多次页面加载始终保持分配同一个 IP。
在 Selenium 中轮换代理最常见的做法,是为每个代理关闭浏览器并启动一个全新的会话,因为这正是 Selenium 确实读取了新的代理设置:
每次循环迭代都会先用以下方法关闭上一个浏览器 driver.quit() 然后再打开一个新的浏览器,这才是真正促成新代理连接的关键。
如果你通过扩展程序的方式使用需要认证的代理, 请为每一组凭据分别构建一个扩展程序 zip 包,因为每个 driver 实例只会加载一次扩展程序。
轮换代理与粘性会话
| 选项 | 最适合 | IP 行为 | 会话连续性 |
| 轮换代理 | 需要在请求或会话之间更换 IP 的工作流程 | IP 会按照提供商设定的轮换规则更换 | 较低 |
| 粘性会话 | 多步骤浏览器会话,例如登录或结账流程 | 在设定时间内保持同一 IP | 较高 |
A 轮换代理 适合由大量彼此独立的页面加载组成的任务,其中每次加载都能从不同的地址中获益。粘性会话则适合任何需要网站在多个步骤中看到同一个 IP 的工作流程,因为会话中途更换 IP 在某些网站看来可能像是换了一个访客,从而中断登录或购物车。
Selenium 代理测试
仅凭配置并不能证明代理设置端到端可用。以下这三项测试 涵盖了值得检查的核心行为 ,然后再放心地将其用于真实的自动化任务。
测试 1:直连与代理对比
目的: 确认 Selenium 确实在使用代理,而不是本地连接。
第一项测试检查 Selenium 是否真的将浏览器流量通过代理进行路由。
我们在配置代理和不配置代理的情况下运行了同样的 IP 检测。直连返回了一个公网 IP,而使用代理的 Selenium 会话返回了另一个不同的 IP。这确认了浏览器流量确实经由代理路由。
随后我们用一款 IP 地理定位工具检查了该代理 IP。该 IP 被识别为 法国, 罗纳-阿尔卑斯大区, 里昂,与为该代理所选择的位置一致。
| 测试项 | 结果 |
| 直接连接 | 检测到一个公网 IP |
| 代理连接 | 检测到不同的公网 IP |
| IP changed | 是 |
| 所选代理位置 | 法国里昂 |
| 检测到的国家/地区 | 法国 |
| 检测到的地区 | 罗纳-阿尔卑斯大区 |
| 检测到的城市 | 里昂 |
| 浏览器连接 | 成功 |
该测试确认了两个重要点。第一,Selenium 成功使用了所配置的代理,而不是本地连接。第二,代理 IP 的地理位置定位到了所请求的城市和国家。
测试 2:粘性会话
目的: 确认在同一个浏览器会话中始终保持同一个 IP。
我们为法国里昂配置了一个 NodeMaven 粘性代理,并在同一个 WebDriver 会话中三次检查了对外显示的 IP。
| 检查 | 结果 |
| Page 1 | 相同 IP |
| Page 2 | 相同 IP |
| Page 3 | 相同 IP |
| 会话期间 IP 发生变化 | 否 |
| 代理连接 | 成功 |
| 位置 | 法国里昂 |
结果: 在全部三次检查中,代理都保持了相同的 IP。这确认了粘性会话在整个 Selenium WebDriver 会话期间保持了一致的 IP。
该测试确认了 会话级别的 IP 稳定性.
测试 3:轮换代理
目的: 确认代理轮换确实会在不同会话之间提供不同的 IP。
我们在不同的浏览器会话中运行了相同的 Selenium 代理配置。在每个会话内部,三次检查中检测到的 IP 均保持不变。而当启动一个新的 WebDriver 会话时,则分配到了一个不同的 IP。
| 测试项 | 结果 |
| Session 1 | 3 次检测均为同一 IP |
| Session 2 | 3 次检测均为同一 IP |
| 两次会话之间 IP 发生变化 | 是 |
| 代理连接 | 成功 |
| 轮换行为 | 为新会话分配不同的 IP |
结果: 该测试确认,轮换代理在启动新的 Selenium 会话时会提供不同的 IP,同时在每个单独的会话内保持所分配的 IP 稳定不变。
这体现了两者之间的区别: 会话级别的稳定性 和 会话之间的 IP 轮换.
在 Selenium 中使用 NodeMaven 代理
以上三项测试使用的是 NodeMaven 住宅代理,并配合 法国里昂 定位。结果显示,同一套代理配置如何支持不同的 Selenium 工作流程。
NodeMaven 提供 住宅代理 使用 国家、地区、城市、ISP 和 ZIP 级别的定位。您还可以在轮换会话和粘性会话之间进行选择。粘性会话会在设定的时间内保持相同的 IP,而轮换会话则会根据所选的轮换设置提供新的 IP。

当 Selenium 工作流程有不同需求时,这种灵活性非常有用。粘性会话可以在整个多步骤浏览器会话中保持相同的 IP。 轮换代理 在启动独立会话或运行更大规模的自动化工作流程时,可以提供不同的 IP。
NodeMaven 还支持 HTTP 和 SOCKS5 连接。其住宅代理网络覆盖 190 多个国家,并支持位置定位。
在将代理连接到 Selenium 之前,您还可以使用 NodeMaven 的免费 Proxy Checker进行测试。该工具可以检查代理连通性、HTTP 状态、传输时间和带宽使用情况。
对于 Selenium 用户: 选择所需的位置和会话类型,验证代理连接,然后将其连接到 Selenium 并测试浏览器会话。
常见的 Selenium 代理问题及解决方法
代理身份验证失败
通常是由于凭据输入有误、密码过期,或者出现了 Selenium 无法响应的身份验证弹窗(因为它位于页面 DOM 之外)。
请对照服务商控制台仔细核对用户名和密码,并确认您使用的是 IP 白名单或可正常工作的身份验证扩展程序。
Chrome 未使用代理
这通常意味着代理能力是在驱动程序已经启动之后才设置的,或者主机或端口存在输入错误,导致该设置悄然失效。
请确认代理对象已赋值给 options.proxy 或通过 –proxy-server 传入,然后再调用 webdriver.Chrome(),并使用 IP 检查脚本进行验证。
代理连接超时
请检查主机和端口是否正确,以及代理在提供商一侧是否在线。你的计算机或网络上的防火墙也可能会阻止到代理端口的出站连接。
用一条简单的 curl 命令测试同样的主机和端口 在 Selenium 之外进行测试,可以确认问题出在代理上还是浏览器配置上。
IP 没有变化
如果你预期会轮换,却反复看到同一个 IP,请检查 是否启用了粘性会话,因为粘性会话会在其有效期内有意保持同一个 IP。
另外请确认你在每次检查之间确实关闭并重新启动了浏览器。
HTTPS 页面无法加载
有些代理不支持在与 HTTP 相同的端口上处理 HTTPS 流量,或者需要单独的 SSL 代理地址。
设置 proxy.ssl_proxy 此外还需设置 proxy.http_proxy,并与提供商为安全流量分配的端口保持一致。与代理无关的证书警告也可能来自目标网站本身。
结论
Selenium 的代理是通过在驱动启动前设置的浏览器配置生效的,而不是通过在已运行的会话中更改设置。一套可用的配置 仍需通过 IP 检查来验证,因为配置错误的代理可能会悄无声息地失效。
身份验证需要额外处理,可以采用 IP 白名单或生成扩展程序的方式,因为 Selenium 具有 没有用于代理凭据的原生字段。代理质量与代码本身同样重要,因为无论脚本怎么写,缓慢或不稳定的 IP 池最终都会表现为页面加载失败。
NodeMaven 的住宅代理和移动代理 试用套餐起价 $3.50,包含 750MB 流量,并同时支持本指南介绍的认证方式和会话模式。
想改用 Playwright?我们的 Playwright 与 Selenium 实操对比 并列讲解了环境搭建、数据抓取和代理认证,包括 Selenium 的认证弹窗在哪些地方构成了两款工具之间真正实际的差异。



