最后更新:2026 年 10 月 31 日。

如何在 Python Selenium 中使用代理

Selenium 可以通过 HTTP 代理访问网站,但配置代理地址只是整个过程的一部分。你还需要选择浏览器支持的认证方式,并验证浏览器流量是否确实通过预期的网络出口。

本文将介绍如何在 Python Selenium 4 中配置 HTTP/HTTPS 代理、使用 IP 白名单进行代理认证、验证浏览器出口 IP,以及排查常见的 Chrome 和 ChromeDriver 问题。本文的完整示例使用本地安装的 ChromeDriver,以及通过 IP 白名单认证的代理节点。

获取完整且经过测试的 Python 示例: kindproxy-selenium-proxy-python GitHub 仓库 。

如果你还需要了解另一种浏览器自动化方案,可以阅读:如何在 Playwright 中使用住宅代理 。本文重点介绍 Selenium WebDriver。

Selenium 代理会改变什么?

当 Selenium 启动配置了代理的浏览器时,浏览器会通过该代理发送网页请求。代理可以提供不同的网络出口,例如指定国家或地区的出口 IP。但它不会改变浏览器语言、自动登录网站,也不能保证目标网站一定返回正常页面。

需要区分以下几项检查:

检查项目可以说明什么
WebDriver 成功启动Selenium 能够启动浏览器或连接到浏览器。
IP 检测请求成功浏览器能够通过当前网络路径访问 IP 检测服务。
出口 IP 或国家/地区符合预期当前网络出口看起来位于预期位置。
目标网页表现符合预期网站返回了测试所需的页面或地区化内容。

1. 安装 Selenium 并准备 Chrome 环境

创建 Python 虚拟环境:

python3 -m venv .venv

激活虚拟环境并安装 Selenium:

# macOS / Linux
source .venv/bin/activate

# Windows PowerShell
# .venv\Scripts\Activate.ps1

python -m pip install --upgrade pip
python -m pip install "selenium>=4.20,<5"

你还需要在运行浏览器的机器上安装 Google Chrome,以及与 Chrome 版本兼容的 ChromeDriver。

检查它们的版本:

google-chrome --version
chromedriver --version

请确保 Chrome 和 ChromeDriver 版本兼容。如果你使用其他浏览器,或者安装路径不同,需要相应调整后续配置中的路径。

为什么本文使用本地 ChromeDriver?

较新版本的 Selenium 可以通过 Selenium Manager 自动查找或下载浏览器驱动。在很多环境中,这种方式非常方便。不过,在 Chrome 启动之前,Selenium Manager 可能需要访问外部驱动下载服务。

在我们的 Ubuntu 测试环境中,Selenium Manager 尝试通过已配置的代理访问 Chrome for Testing 元数据接口时,遇到了 Proxy Authentication Required 隧道错误。我们在本地安装 Chrome 和 ChromeDriver,然后将 ChromeDriver 的明确路径传给 Selenium,从而避开了运行时下载驱动的步骤。

这并不意味着所有 Selenium 环境都必须手动安装驱动。当 Selenium Manager 无法访问驱动下载服务时,这是一种实用的解决办法。

2. 获取代理地址并选择认证方式

在代理控制面板中,复制 HTTP/HTTPS 网关的主机地址和端口,并选择所需的国家/地区及会话设置。代理网关可能类似于:

gw.kindproxy.com:12200

请使用账户中实际分配的主机地址和端口。本文示例使用 IP 白名单认证,因此不需要在代理 URL 中填写用户名或密码。

将服务器公网 IP 添加到 KindProxy 白名单

使用 IP 白名单认证时,代理服务商会授权来自指定公网 IP 的连接。你只需要将该 IP 添加到账户白名单中,浏览器就可以在 Selenium 配置中不填写用户名或密码的情况下连接代理网关。

按照以下步骤操作:

  1. 找到准备运行 Chrome 的机器的公网出口 IP。你可以在启动浏览器之前,从该机器直接发起 IP 检测请求。
  2. 登录 KindProxy 控制面板并打开 IP 白名单页面 。
  3. 将这台机器的公网 IP 地址添加到白名单。
  4. 保存设置。
  5. 打开 KindProxy 流量代理控制面板 生成代理参数。将认证方式选择为 Whitelist,然后根据测试需求选择国家/地区、协议、主机类型、端口和会话类型。
  6. 将生成的网关主机地址和端口复制到 PROXY_SERVER 环境变量中。

下方截图展示了如何选择 Whitelist 认证方式,以及代理连接参数所在的位置。根据你购买的产品、地区和具体配置,可选项可能有所不同。

KindProxy 控制面板中的 Whitelist 认证方式和代理参数设置

你可以打开 KindProxy 流量代理控制面板 生成或查看代理参数。

重要提示: 应添加运行 Chrome 的机器的公网 IP,而不是浏览器通过代理访问外网时返回的代理出口 IP。如果你使用 Selenium Grid 或 Remote WebDriver,通常需要添加的是浏览器节点的公网出口 IP,而不是运行 Python 客户端的电脑的 IP。如果这台机器的公网 IP 发生变化,请及时更新白名单。

白名单页面属于 KindProxy 控制面板,需要登录账户后才能管理已授权的 IP 地址。

如果需要使用用户名/密码认证怎么办?

Selenium Python 的 Proxy 对象提供了 http_proxy 和 ssl_proxy 等代理地址字段。其文档模型也包含 SOCKS 用户名和密码属性,但没有提供通用的 HTTP 代理用户名和密码属性。具体可参考官方文档:Selenium Proxy API 。

仅仅配置代理地址,并不代表经过用户名/密码认证的 HTTP 代理就一定能够正常工作。Chrome 和 Firefox 对代理认证的处理方式可能不同。如果使用浏览器专用扩展或认证桥接工具,需要针对实际使用的浏览器、驱动和代理端点进行测试。不要认为在代理 URL 中加入 username:password@host 就能在所有浏览器中生效。

本文的完整示例使用 IP 白名单认证。如果你的代理服务商要求使用用户名/密码认证,而你又无法使用 IP 白名单,则可能需要额外的认证层。常见方案包括使用能够处理代理凭据的浏览器扩展,或者通过本地代理中间件,将浏览器流量转发到需要认证的上游代理。

这些方案取决于浏览器和具体配置。在正式使用前,请针对实际的浏览器、驱动和代理端点进行测试。同时妥善保护代理凭据,避免将账号密码硬编码在脚本中,或意外输出到日志里。

你可能会在一些较旧的教程中看到 selenium-wire。该项目原始仓库已于 2024 年 1 月归档,维护者也明确表示项目不再维护。因此,本文不建议将它作为新项目的依赖。详情可查看 selenium-wire 项目公告 。

3. 在 Selenium 4 中配置 HTTP/HTTPS 代理

Selenium 的 Proxy 对象可以指定 HTTP 和 SSL 代理端点。在 Selenium 4 中,可以通过 options.proxy 将代理配置分配给浏览器选项,并在创建 WebDriver 会话之前完成设置。这样,代理能力配置就会随浏览器会话配置一起传递给 ChromeDriver。

下面是核心配置代码:

import os

from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType
from selenium.webdriver.chrome.service import Service

proxy_server = os.environ["PROXY_SERVER"]
chromedriver_path = os.environ.get(
    "CHROMEDRIVER_PATH",
    "/usr/local/bin/chromedriver",
)
chrome_binary = os.environ.get(
    "CHROME_BINARY",
    "/usr/bin/google-chrome",
)

proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = proxy_server
proxy.ssl_proxy = proxy_server

options = webdriver.ChromeOptions()
options.binary_location = chrome_binary
options.proxy = proxy
options.add_argument("--headless")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")

service = Service(executable_path=chromedriver_path)

driver = webdriver.Chrome(
    service=service,
    options=options,
)

代理网关和目标网站是两个不同的地址:

  • PROXY_SERVER 是代理主机地址和端口,例如 gw.kindproxy.com:12200。
  • TARGET_URL 是你希望 Chrome 访问的网站,例如 https://example.com/。

完整脚本还会检查本机直连 IP、检查浏览器实际使用的出口 IP、验证目标网页、处理常见错误,并在 finally 代码块中关闭 Chrome。

获取完整 Python 脚本

为了避免维护两份略有差异的长代码,建议直接使用公开 GitHub 仓库中的完整示例:

在 GitHub 上查看 selenium_proxy_check.py

仓库中还包含 requirements.txt、.env.example、.gitignore,以及介绍环境配置步骤的 README 文件。

4. 配置环境变量并运行测试

在 Shell 中设置代理网关和目标网页:

export PROXY_SERVER="gw.kindproxy.com:12200"
export TARGET_URL="https://example.com/"
export EXPECTED_TEXT="Example Domain"

export CHROME_BINARY="/usr/bin/google-chrome"
export CHROMEDRIVER_PATH="/usr/local/bin/chromedriver"
export HEADLESS="true"

以下超时设置为可选项:

export PAGE_LOAD_TIMEOUT="60"
export IP_CHECK_TIMEOUT="20"
export TARGET_WAIT_TIMEOUT="30"

EXPECTED_TEXT 是可选变量。如果该变量为空或未设置,脚本只会加载目标网页,不会检查页面正文中是否包含指定文本。

运行脚本:

python selenium_proxy_check.py

如果使用 Windows PowerShell,可以在运行 Python 前设置相同的环境变量:

$env:PROXY_SERVER = "gw.kindproxy.com:12200"
$env:TARGET_URL = "https://example.com/"
$env:EXPECTED_TEXT = "Example Domain"
$env:CHROME_BINARY = "C:\Program Files\Google\Chrome\Application\chrome.exe"
$env:CHROMEDRIVER_PATH = "C:\tools\chromedriver.exe"
$env:HEADLESS = "true"

python .\selenium_proxy_check.py

请根据你自己的机器调整浏览器和驱动的安装路径。

不要将真实代理凭据、账户隐私信息或其他机密内容提交到公开代码仓库。本文示例使用 IP 白名单认证,不需要代理用户名或密码。

5. 分别验证出口 IP 和目标网页

脚本会执行以下检查:

  1. Python 发起一次直连 IP 检测请求,并禁用该请求自身的代理处理器。
  2. Selenium 控制的 Chrome 通过已配置的浏览器代理访问 IP 检测服务。
  3. 脚本比较本机直连 IP 与浏览器检测到的出口 IP。
  4. Chrome 再单独打开目标网页并检查页面响应。

一次成功运行的输出大致如下:

Direct connection IP: <your-server-public-ip>
Browser exit IP: <proxy-exit-ip>
Direct and browser IPs are different; the proxy route appears active.
Page title: 'Example Domain'
Current URL: https://example.com/
Page content preview: '...'
Target page loaded: https://example.com/
Target page check: passed

实际显示的 IP 地址会因环境而异。脚本不会要求代理出口 IP 必须固定不变。

如果直连 IP 与浏览器出口 IP 不同,说明 Chrome 很可能正在使用另一个网络出口。这是一个有用的诊断信号,但不能绝对保证所有目标网站都通过该出口访问。代理可能与其他网络路径共用出口,或者机器所在网络可能使用透明路由。

如果你关心代理出口所在的国家/地区,可以使用团队信任的 GeoIP 数据源检查浏览器出口 IP。不同 GeoIP 数据库可能存在差异,因此国家/地区结果只能作为参考,不能保证所有网站都会以相同方式判断访问者的位置。

之后还需要单独检查目标网页。除了 IP 所在地区,网站还可能根据 Cookie、已保存的市场区域、账户设置或手动选择的国家/地区来决定展示内容。成功访问 IP 检测服务,并不意味着其他网站一定能够正常加载,或一定会显示预期的本地化内容。

6. Chrome、Firefox 和 Remote WebDriver

本文完整示例使用本地 Chrome。Selenium 的 Proxy 对象属于 WebDriver 代理配置的一部分,但不同浏览器对代理功能和认证方式的支持可能存在差异。请将浏览器专属选项与代理端点配置区分开,并针对计划使用的浏览器进行实际测试。

环境浏览器配置位置需要注意的事项
ChromeChromeOptions需要单独验证 HTTP 代理认证是否正常,不能只检查代理地址。
FirefoxFirefoxOptions检查 Firefox 对所选代理类型和认证方式的支持情况。
Remote WebDriver / Grid发送给远程会话的浏览器能力配置浏览器节点必须能够访问代理;可能需要将该节点的出口 IP 添加到白名单。

对于 Remote WebDriver,需要将代理配置放在发送给远程会话的浏览器选项中。代理连接实际由运行浏览器的机器或容器发起,不一定是运行 Python 客户端的电脑。关于 Selenium 支持的代理字段,可以参考浏览器选项文档 。

7. 常见 Selenium 代理错误及排查方法

错误或现象排查方向
NoSuchDriverException 或 Selenium Manager 无法下载 ChromeDriver在本地安装 Chrome 和兼容的 ChromeDriver,然后设置 CHROME_BINARY 和 CHROMEDRIVER_PATH。这样可以避免运行时下载驱动。
407 Proxy Authentication Required检查代理网关主机地址、端口、协议和认证方式。如果使用 IP 白名单,请确认运行 Chrome 的机器的公网出口 IP 已添加到 KindProxy IP 白名单 。
Chrome 已启动,但浏览器出口 IP 检测超时检查代理端点、白名单、端口、出站网络访问,以及 IP 检测服务是否能够通过代理访问。即使浏览器成功启动,第一次代理请求仍可能无法完成。
直连 IP 与浏览器出口 IP 相同确认代理对象已附加到传递给 webdriver.Chrome() 的浏览器选项中。重新检查代理端点和浏览器实际使用的网络路径。
IP 检测成功,但目标网页访问失败单独测试目标网站。目标站点可能不可用,也可能返回验证挑战、访问错误或不同的地区化内容。
页面文本断言失败检查输出的页面标题、当前 URL 和正文预览。将 EXPECTED_TEXT 设置为页面中实际存在的文本,或者留空以关闭文本断言。
HTTPS 导航出现 TLS 或隧道错误确认 HTTP/HTTPS 代理端点设置,并检查浏览器实际返回的错误。不要将关闭证书检查作为通用解决方案。

如果你还想了解浏览器代理认证和连接错误,可以阅读:Playwright 代理认证:常见连接错误及解决方法 。虽然两种浏览器自动化工具的具体配置不同,但排查原则类似:分别测试浏览器启动、代理连接、出口 IP 和目标网页。

8. 在 Selenium 测试中使用住宅代理

面向特定国家/地区的住宅代理可以帮助 QA 团队检查自己的网站从其他市场访问时的表现。例如,你可以从两个不同地区测试语言选择器、价格展示,或特定国家/地区的落地页。

选择与浏览器流程相匹配的会话类型。只检查一个页面时,可能不需要特别的会话保持设置;但如果测试涉及多步骤结账流程,就可能需要在整个流程中保持一致的网络出口。代理只负责改变网络路径,仍然需要通过 Selenium 断言来确认网站实际展示了什么内容。

如果你需要住宅 IP 进行合规的地区化测试,可以了解 KindProxy 住宅代理套餐 。根据已验证的浏览器配置,选择合适的国家/地区、会话方式和认证方法。

常见问题(FAQ)

如何在 Python Selenium 中设置 HTTP 代理?

创建 Selenium Proxy 对象,设置 HTTP 和 SSL 代理地址,然后将其附加到用于启动浏览器的 Chrome 或 Firefox 选项中。浏览器启动后,检查实际出口 IP。

如何将我的 IP 添加到 KindProxy 白名单?

找到运行 Chrome 的机器的公网出口 IP,登录 KindProxy IP 白名单控制面板 并添加该 IP。如果使用 Selenium Grid,请添加浏览器节点的公网出口 IP。

Selenium 标准代理设置能否发送 HTTP 用户名和密码?

Selenium Python 标准代理模型没有定义通用的 HTTP 用户名和密码字段。认证行为取决于浏览器和代理配置,因此不要认为只在代理 URL 中填写凭据就一定有效。本文完整示例使用 IP 白名单认证。

这套配置适用于 Selenium Grid 吗?

代理设置可以通过浏览器能力配置发送给远程会话,但浏览器节点必须能够访问代理。如果使用 IP 白名单认证,请添加浏览器节点的公网出口 IP。

使用代理能阻止网站显示 CAPTCHA 吗?

不能。代理只会改变网络路径或出口位置。网站会自行决定返回目标内容、错误页面还是验证挑战。

总结

Selenium 的标准代理设置可以让浏览器流量通过 HTTP/HTTPS 代理端点传输。要获得可靠的配置,还需要选择兼容的认证方式,在使用 IP 白名单时添加正确的公网 IP,并分别检查代理出口 IP 和目标网页。

建议先使用自己有权测试的网站,将运行 Chrome 的机器的公网 IP 添加到代理白名单,确认浏览器的网络出口正常后,再根据测试目标添加地区化断言。

获取完整可运行示例,请访问 KindProxy Selenium 代理 Python GitHub 仓库 。如果你正在为地区化 QA 或浏览器测试配置住宅代理,也可以 查看 KindProxy 住宅代理套餐 。

延伸阅读