周一至周五 09:00 - 18:00(UTC+08:00) ©2026 NST LABS TECH LTD. 保留所有权利。
如何使用SeleniumBase与代理:2026完整指南
Ivy Lin Community & Content Lead
如何使用SeleniumBase与代理:2026完整指南
TL;DR
SeleniumBase 从三个可互换的入口点中读取代理 —— --proxy pytest CLI 标志、Driver() 的 proxy 参数或 SB() 上下文管理器的 proxy 参数 —— 并且这三者在内部都通过相同的驱动程序启动代码进行路由。
Chrome 和 Edge 上的经过身份验证的 HTTP/HTTPS 代理工作无需登录弹出窗口 ,因为 SeleniumBase 会动态编写一个 Manifest V3 浏览器扩展,自动响应每个 407 挑战;您在这两个浏览器上从不需要单独的匿名代理层。
Firefox 处理代理的方式不同,并且不会自动填充凭据。 SeleniumBase 设置 Firefox 的本机 network.proxy.* 首选项(包括 SOCKS4/5/5h),但没有凭据注入步骤,因此经过身份验证的代理仍会触发 Firefox 自己的登录提示。
SOCKS4、SOCKS5 和 SOCKS5h 是 CLI 标志和 Python 构造函数中的有效代理方案 (例如 socks5://host:port),直接从 SeleniumBase 4.51.10 的 proxy_helper.validate_proxy_string() 源进行了确认。
UC 模式接受与标准会话相同的 proxy= 参数 ,但 SeleniumBase 并未提供内置的每请求轮换调度程序 —— 请求之间轮换 IP 必须来自代理网关本身或通过新的值重新启动驱动程序。
Chrome 137 对扩展内部的更改短暂破坏了 SeleniumBase 的代理身份验证扩展。 当前版本包括修复;在新版本的 Chrome 构建中,如果仍然出现登录弹出窗口,则在导航之前切换到 CDP 模式是已记录的解决方法。
Nstproxy 的住宅网关通过一个字符串插入到三个集成点中的任何一个 (username:password@gw-us.nstproxy.com:24125),跳过普通 Selenium、Puppeteer 和 Playwright 设置通常需要的本地匿名代理层,以用于经过身份验证的代理。
介绍:SeleniumBase 的代理支持实际上涵盖了什么
SeleniumBase 是一个基于 Selenium WebDriver 和 pytest 的 Python 浏览器自动化和测试框架,它添加了一个代理层,超出了原始 Selenium 开箱即用的功能。普通 Selenium 的 --proxy-server Chrome 选项无法携带用户名和密码,SeleniumBase 解析 username:password@host:port 字符串,为 Chromium 浏览器动态构建一个小型浏览器扩展,并将该扩展接入以自动回答身份验证挑战。该框架在 ,当前版本为 4.51.10,由 Michael Mintz 在 上维护。该框架自己的代理文档在其 中涵盖了本指南中使用的 CLI 标志语法。
本指南涵盖了三种向 SeleniumBase 提供代理的方式、经过身份验证的代理背后实际发生的情况、SOCKS5 和 UC 模式的适用位置、真实的限制(Firefox 凭据处理、缺乏轮换调度程序、实际的 Chrome 版本回归)以及如何将设置指向 Nstproxy 的住宅网关。
安装 SeleniumBase 并确认设置 安装 SeleniumBase 会一次性拉取 Selenium、pytest 和框架自己的驱动程序管理工具:
pip install seleniumbase
seleniumbase install chromedriver
seleniumbase install chromedriver 下载与机器上已安装的 Chrome 版本匹配的 chromedriver 构建,这使得后续的代理测试可预测 —— 驱动程序 / 浏览器不匹配会产生与代理配置无关的连接错误,容易误诊为代理问题。使用以下命令确认安装:
python -c "import seleniumbase; print(seleniumbase.__version__)"
配置代理:CLI 标志、Driver() 和 SB() SeleniumBase 用一句话回答这个问题:将代理作为字符串传递,格式无论是来自命令行还是 Python 都是相同的。CLI 以 pytest 标志的形式接受它:
pytest my_test.py --proxy = SERVER:PORT
pytest my_test.py --proxy = USERNAME:PASSWORD@SERVER:PORT
Python API 在 Driver() 和 SB() 上下文管理器的关键字参数中暴露相同的值 —— 通过直接检查已安装软件包中这两个签名得到了确认:
from seleniumbase import Driver
import inspect
print ( inspect . signature ( Driver ) . parameters [ "proxy" ] . default ) # None
from seleniumbase import Driver
driver = Driver ( browser = "chrome" , headless = True , proxy = "USERNAME:PASSWORD@SERVER:PORT" )
driver . get ( "https://example.com" )
driver . quit ( )
未经身份验证的代理完全省略了 USERNAME:PASSWORD@ 部分;SeleniumBase 的 validate_proxy_string() 函数将裸露的 ip_address:port 或 server:port 视为同样有效。
基本实现:端到端的认证代理 将 proxy="user:pass@host:port" 传递给 Driver() 时,在 Chrome 和 Edge 中会通过一种特定机制作出响应:SeleniumBase 的 create_proxy_ext() 函数使用 chrome.proxy.settings.set() 调用编写一个 Manifest V3 扩展,并添加一个 chrome.webRequest.onAuthRequired 监听器,任何时候代理发出 407 挑战时都会返回存储的凭据。为了验证这是真实的而不仅是文档中的行为,本指南在本地认证代理(mitmproxy,配置了测试用户名和密码)上运行并捕获了流量:
from seleniumbase import Driver
driver = Driver (
browser = "chrome" ,
headless = True ,
proxy = "testuser:testpass123@127.0.0.1:8899" ,
)
driver . get ( "http://internal-test-host:9000/" )
print ( driver . page_source [ : 80 ] )
driver . quit ( )
代理自身的日志确切显示出 SeleniumBase 源代码所暗示的顺序:浏览器的第一次请求没有认证头,并收到了 407 Proxy Authentication Required 响应,然后扩展的 onAuthRequired 回调被触发,相同的请求被使用存储的凭据重试,返回 200 OK 和预期的页面内容——没有弹出窗口,没有手动重试,也没有额外库。这个握手,而不仅仅是 proxy 参数的存在,就是 SeleniumBase 中“认证代理支持”的含义。
快速查看
如果您的 SeleniumBase 运行不断遭遇代理认证弹窗或在会话中被阻塞,Nstproxy 的住宅网关为您提供稳定、预先认证的 `username:password@host:port` 字符串,内置会话控制,因此上面的 `proxy=` 参数继续有效。
验证代理是否实际处于活动状态 确认代理活动意味着检查目标网站看到的 IP,而不仅仅是检查 driver.get() 返回了一个页面:
from seleniumbase import Driver
driver = Driver ( browser = "chrome" , headless = True , proxy = "USERNAME:PASSWORD@SERVER:PORT" )
driver . get ( "https://api.ipify.org" )
print ( "退出 IP:" , driver . get_text ( "body" ) )
driver . quit ( )
如果打印的 IP 与代理自身的地址匹配,而不是机器的真实 IP,那么代理就在请求路径中。在这里的不匹配通常意味着代理值格式错误(在已经带有方案前缀的 SOCKS 字符串前加上一个多余的 http:// 前缀是一个常见原因),而不是认证失败,因为 Chrome 中的认证失败通常表现为空白标签页或中止的导航,而不是错误的 IP。
为浏览器自动化选择代理提供商 代理字符串的可靠性仅与其背后的 IPs 相同,浏览器自动化在代理池中的工作比简单的 HTTP 请求更困难:一个多页面的 SeleniumBase 流程需要相同的退出 IP 在多个导航中保持一致,而被标记或过度使用的数据中心 IP 明显显示为登录失败和验证码墙,而不是干净的错误。Nstproxy 是一款代理基础设施提供商,其住宅线路正是围绕这种持久性要求构建的,可以按需付费的流量或按月套餐出售,适合通过 SeleniumBase 等工具进行抓取、价格监控或帐户管理自动化的团队,而不是通过原始的 HTTP 客户端。网关使用本指南中一直采用的 username:password@host:port 形式,因此将测试套件从临时代理更改为生产代理只需一行代码的更改。
按需的粘性或轮换会话 — 住宅高级代理 支持固定会话(在登录流程或多页面爬虫需要的时间内使用相同的退出 IP)和每请求轮换,匹配 SeleniumBase 的 proxy= 参数将会话视为驱动程序生命周期内的一个固定端点。
同一网关上的 HTTP(S) 和 SOCKS5 — 两种协议直接映射到 SeleniumBase 的 validate_proxy_string() 已接受的方案值(http、https、socks4、socks5、socks5h),因此测试这两种传输只需一行代码的更改,而不是不同的集成。
195个跟踪位置,具有国家、城市和ASN目标 — 当SeleniumBase套件需要检查页面如何在特定区域渲染或获取内容时,非常有用。
一个小型套件的预付费入口点 — Residential Lite Proxies 覆盖200多个国家和地区的5000万以上IP,按从10美元起的预付费套餐(10GB,1.00美元/GB) 收费,这在项目需要Residential Prime Proxies的会话控制之前是一个合理的起点。
Residential Prime Proxies在超过110M的住宅IP中列出99.98%的成功率,价格为50GB套餐上的1.60美元/GB ,而Residential Lite Proxies的成功率为99.5%;这两个数据都来自Nstproxy自己的定价页面,在以此为基础进行购买决策之前值得再次检查,因为代理提供商频繁更新池大小和定价。
from seleniumbase import Driver
driver = Driver (
browser = "chrome" ,
headless = True ,
proxy = "USERNAME:PASSWORD@gw-us.nstproxy.com:24125" ,
)
driver . get ( "https://api.ipify.org" )
print ( "出口IP:" , driver . get_text ( "body" ) )
driver . quit ( )
Nstproxy自己的原生Selenium、Puppeteer和Playwright集成示例通过proxy-chain库路由相同的网关,以解决这些工具缺乏内联代理凭证的问题 — 这一点SeleniumBase的内置扩展处理使其不再必要。
高级模式:SOCKS5、UC模式和轮换 SOCKS5通过相同的proxy=参数工作,只是将方案拼写出来:
from seleniumbase import Driver
driver = Driver ( browser = "chrome" , headless = True , proxy = "socks5://USERNAME:PASSWORD@SERVER:PORT" )
driver . get ( "https://api.ipify.org" )
driver . quit ( )
SeleniumBase的方案解析器还接受socks4://和socks5h://(后者通过代理解析DNS而不是本地),并将检测到的任何方案传递到处理HTTP认证的相同Chrome扩展中,因此经过身份验证的SOCKS5代理通过上述确认的相同onAuthRequired流程,而不是单独的代码路径。
UC模式 — SeleniumBase的无检测chromedriver集成,适用于具有更严格机器人检测的网站 — 采用相同的参数:
from seleniumbase import Driver
driver = Driver ( uc = True , headless = False , proxy = "USERNAME:PASSWORD@SERVER:PORT" )
driver . uc_open_with_reconnect ( "https://example.com" , reconnect_time = 4 )
driver . quit ( )
UC模式没有添加的功能是旋转调度程序。SeleniumBase在seleniumbase/config/proxy_list.py中提供了一个静态的PROXY_LIST“通讯录”,以便命名键可以在CLI中代替完整的代理字符串,并存在一个--multi-proxy标志,专门用于让并行的pytest工作者(pytest -n)各自构建自己的代理扩展,而不会出现文件锁定竞争 — 这两者在单次运行中的请求之间并不会轮换出口IP。在请求之间的轮换必须通过使用不同的代理值重新启动驱动程序或通过网关本身在服务器端轮换IP来实现,这就是轮换会话代理计划的目的。
诚实限制 有三个限制值得在项目中规划,而不是在过程中发现。首先,Firefox并不是Chrome的直接替代品:SeleniumBase通过本机的network.proxy.type、network.proxy.http和network.proxy.socks*首选项设置Firefox的代理,包括完整的SOCKS4/5/5h支持,但没有相当于Chrome扩展的凭证自动填充,因此在Firefox上的经过身份验证的代理仍会产生一个本地浏览器登录提示,而无头运行无法关闭。其次,基于扩展的机制与Chrome自己的扩展平台相连,这意味着当Chrome更改该平台时可能会出现故障:Chrome 137更新以破坏的方式更改了扩展的内部,使SeleniumBase的临时代理认证扩展在2025年的一段时间内失效,详细记录在维护者讨论线程 中,而修复是在SeleniumBase的发布中完成的,而不是用户可以在自己的测试代码中绕过的东西。第三,如上所述,没有内置的轮换调度程序 — SeleniumBase为您提供了一个干净的单代理每会话原语,建立在其之上的轮换策略(或从代理提供商购买一个)则留给调用者。
故障排除常见代理错误 代理身份验证弹窗在正确格式的 proxy="user:pass@host:port" 字符串出现,几乎总是与 Chrome 版本问题有关,而不是凭证问题:请确认 SeleniumBase 是最新版本(pip install -U seleniumbase),在非常近期的 Chrome 版本中,如果仍然出现弹窗,SeleniumBase 的维护者建议在第一次导航之前启用 CDP 模式,这样可以绕过受影响的扩展 API。
如果出现 407 Proxy Authentication Required 的情况,并且呈现为空白页面而非弹窗,通常意味着凭证错误或账户的 IP 白名单不包括该机器的当前 IP,这两者都值得在触及测试代码之前直接在代理提供商的仪表板中进行检查。
一个能够连接但返回错误出口 IP 的代理(如上述验证部分所示)通常可以追溯到代理字符串格式错误——在 socks5:// 前面多了一个 http://,或缺少端口——而不是坏代理。
通过工作的正确身份验证代理发出的缓慢或间歇性响应指向代理池本身:带宽受到限制或过载的住宅出口节点表现得就像慢网络,而不是配置错误。
结论 SeleniumBase 的代理支持归结为一个字符串格式,该格式在 CLI 标志、Driver() 和 SB() 中始终如一,实际复杂性隐藏在 Chrome 与 Firefox 上经过身份验证的代理之间的差异及请求之间没有任何自动轮换的情况中。在每次代理更改后验证出口 IP,保持 SeleniumBase 更新以避免偶尔出现的 Chrome 扩展回归,以及选择一个能够自行处理会话持久性和轮换的代理网关,而不是期待测试代码去做的,将覆盖大部分实际中出现的问题。
常见问题 问:SeleniumBase 支持没有第三方库的认证代理吗?
是的——将 proxy="username:password@host:port" 传递给 Driver()、SB() 或 --proxy CLI 标志对于 Chrome 和 Edge 是足够的,因为 SeleniumBase 会生成自己的 Manifest V3 扩展来应对代理的身份验证挑战;并不需要像某些原生 Selenium 设置那样使用 proxy-chain 风格的匿名层。
问:SeleniumBase 的认证代理支持在 Firefox 上工作吗?
不,不是自动部分——Firefox 的代理设置通过本地 network.proxy.* 首选项进行,涵盖 SOCKS4/5/5h,但 SeleniumBase 不会为 Firefox 注入已保存的凭证,因此认证代理仍会触发 Firefox 自己的登录提示。
问:SeleniumBase 能在测试运行期间自动轮换代理吗?
不——SeleniumBase 提供了每个会话一个代理的基本功能和一个静态命名的 PROXY_LIST 查找,但没有内置的每请求轮换调度器;跨请求轮换 IP 需要重新启动驱动程序并使用新的代理值,或者使用能够自行轮换 IP 的代理网关。
问:为什么即使有正确的 proxy= 字符串,仍然会出现代理身份验证弹窗?
这通常是 Chrome 版本问题:Chrome 137 的更改暂时破坏了 SeleniumBase 用于代理身份验证的扩展机制,而当前的 SeleniumBase 版本已包含修复,对于仍然出现弹窗的新 Chrome 版本,CDP 模式是记录的解决方法。
问:SeleniumBase 支持 SOCKS5 代理吗?
是的——socks4://、socks5:// 和 socks5h:// 都是有效的方案前缀,可以在用于 HTTP 代理的相同代理字符串中使用,而经过身份验证的 SOCKS5 代理则通过与经过身份验证的 HTTP 代理相同的 Chrome 扩展身份验证流程。
问:在我没有拥有的网站上使用 SeleniumBase 代理是否安全?
只有在自动化仍然符合该站点的服务条款和适用法律的情况下——一个代理会改变请求显示的出口IP,但它并不会改变抓取、账户自动化或针对特定目标的负载是否被授权,因此这一检查应该在代理配置之前进行,而不是之后。
立即访问住宅、数据中心、IPv6 与 ISP 高质量代理池。 创建免费账号并立即试用 ->