SeleniumBase UC 模式代理无法工作:原因与解决方案

抱怨总是相同的:UC 模式在没有代理的情况下可以绕过 Cloudflare,但使用代理时却失败,或者 IP 根本没有变化。这两种症状都有具体原因——而且都不是 SeleniumBase 的问题。

搜索 seleniumbase uc mode proxy,你会找到相同的三个页面:一个 Stack Overflow 问题,三个不同的代理服务中 IP 从未改变,GitHub 问题 seleniumbase/SeleniumBase#3046(“UC 模式与代理不兼容”,2024 年 8 月在版本 4.29.9 上提交,因无法重现而关闭),以及一个讨论线程,维护者的回答只有两句话:需要身份验证的代理需要 Chrome 扩展,你可能只是用了一个不好的代理。这个答案的两部分都是正确的,结合起来几乎可以解释所有失败。以下是详细版本,以及找到原因的调试顺序。

看起来相同的两种不同失败

在更改任何内容之前,先弄清楚你遇到了哪个问题,因为解决方案完全不同。失败 A:出口 IP 从未改变。你的脚本运行,页面加载,目标看到的是你的真实地址——代理从未在路径中。失败 B:代理工作但网站封锁你。UC 模式在没有代理时可以通过 Cloudflare,但一旦添加代理就会遇到挑战循环,这正是问题 #3046 描述的。失败 A 是管道问题。失败 B 是 IP 声誉问题。将一个当作另一个来处理是这些线程持续数页的原因。

为什么需要身份验证的代理需要扩展——以及这在 UC 模式中为何重要

Chrome 没有命令行方式提供代理凭据。--proxy-server 标志会静默丢弃你嵌入的任何 user:pass@,结果 407 挑战会以 WebDriver 无法触及的本机对话框形式出现。因此,当你传递包含凭据的代理字符串时,SeleniumBase 会即时生成一个小型 Chrome 扩展,将其写入临时文件夹,并在启动时加载以便为你回答挑战。这就是维护者所指的机制,也是我们在 Selenium 中的身份验证代理指南中描述的相同机制。

UC 模式在此基础上增加了活动部件:它首先启动 Chrome,然后附加一个修补过的 chromedriver,并在隐身操作期间断开驱动程序。扩展必须在所有这些发生之前加载,如果没有,什么也不会引发异常——Chrome 直接浏览,你会得到失败 A。通常的原因是版本漂移。Chrome 137 改变了扩展行为,足以在 SeleniumBase 发布更新之前破坏代理身份验证,因此旧的固定版本加上当前的 Chrome 每次都会静默失败。先升级,再调试。

SeleniumBase UC 模式代理格式实际上可行

格式错误占据了“代理被忽略”报告的惊人份额。SeleniumBase 将代理作为纯字符串接收,无论是否包含凭据,在 DriverSB 管理器以及命令行中:

from seleniumbase import Driver, SB

# Authenticated: SeleniumBase builds a proxy-auth extension for this
driver = Driver(uc=True, proxy="USER:PASS@gate.quantumproxies.io:PORT")

# IP-whitelisted: no credentials, no extension
with SB(uc=True, proxy="gate.quantumproxies.io:PORT") as sb:
    sb.uc_open_with_reconnect("https://httpbin.org/ip", 4)
    print(sb.get_text("body"))     # must NOT be your own IP

# Same thing from pytest:
#   pytest test_x.py --uc --proxy=USER:PASS@gate.quantumproxies.io:PORT

由此产生的三个规则。不要同时用 http:// 和凭据包装字符串,除非你已验证你的版本可以处理它——USER:PASS@HOST:PORT 是记录的格式。不要指望带凭据的 SOCKS5 能正常工作:这是 Chromium 的限制,与我们在 Playwright SOCKS5 身份验证中介绍的相同,没有框架可以绕过它。如果你的密码包含 @:,请将其更改为字母数字组合,而不是调试解析器。

消除整个失败类别的解决方案

如果运行你的爬虫的机器有一个稳定的公共 IP,请对其进行身份验证而不是请求。将地址注册到你的提供商——每个 QuantumProxies 计划都支持 IP 白名单和用户:密码——然后传递一个裸 host:port。没有凭据意味着没有扩展:一个更少的组件会在 Chrome 更新时中断,一个更少的文件加载到你希望保持不显眼的浏览器中。在 VPS 上,这是本文中价值最高的更改。

限制是拓扑上的,而不是技术上的:白名单对机器进行身份验证,因此自动扩展的容器、CI 运行器和任何位于旋转 NAT 后面的东西仍然需要凭据。对于这些,保持扩展路径并保持 SeleniumBase 最新。

SeleniumBase UC 模式如何启动代理 Chrome 浏览器的流程图:身份验证扩展、延迟 chromedriver 附加、干净的住宅出口 IP
每个框都是代理可能脱离链条的地方。白名单删除了第一个,这也是在 Chrome 更新时中断的那个。

在责怪 UC 模式之前验证出口 IP

这是第零步,大多数人会跳过它。在你接触隐身设置之前,证明流量通过代理独立离开。首先在浏览器外测试相同的凭据——如果 curl 无法使用它们,没有框架可以:

# 1. Does the proxy work at all, outside any browser?
curl -x http://USER:PASS@gate.quantumproxies.io:PORT https://httpbin.org/ip

# 2. Is the toolchain current? (Chrome 137+ broke older extension handling)
pip install -U seleniumbase && sbase get chromedriver

# 3. Does the proxy work WITHOUT the stealth patches?
python -c "from seleniumbase import Driver; \
d=Driver(proxy='USER:PASS@gate.quantumproxies.io:PORT'); \
d.get('https://httpbin.org/ip'); \
print(d.find_element('tag name','body').text); d.quit()"

如果第 1 步失败,问题出在代理或凭据上。如果第 1 步通过而第 3 步失败,问题出在扩展或 Chrome 版本上。如果两者都通过,只有 uc=True 失败,那么——只有那时——才是 UC 模式的交互。知道你实际得到哪个出口与知道你得到了一个出口一样重要:我们的免费 IP 质量检查器报告地址、其类型和声誉,这是“代理工作”和“代理将通过”之间的区别。

当代理工作而 Cloudflare 仍然获胜时

这是失败 B,并且这不是任何东西的错误。UC 模式让浏览器看起来像人类;它无法让网络看起来像住宅。通过一个已经被数百个其他爬虫烧毁的数据中心子网路由一个隐身浏览器,你会得到挑战的困难版本——无论你点击多少次,它都不会解决。没有浏览器框架可以解决这个问题,因为判决是在指纹被读取之前做出的。我们关于 Cloudflare 错误 1020避免爬取时的 CAPTCHA 的笔记都落在同一个地方:CAPTCHA 是症状,IP 声誉是原因。

三件事改变结果。转向 住宅 IP:200 多个国家的真实家庭地址具有数据中心范围无法比拟的声誉。对于任何带有登录或购物车的内容使用粘性会话,因为流程中途的旋转被视为会话劫持,而对于广泛的无状态爬取使用 旋转出口。并且将出口国家与模拟的地区匹配——德国出口与 en-US 地区和纽约时区得分为异常。

两个环境细节闭合循环。UC 模式在无头模式下是可检测的,因此在 Linux 上使用虚拟显示(xvfb=True)而不是 headless=True——这就是为什么几个“在 Windows 上工作,在 Ubuntu 上崩溃”的报告在显示修复后解决,以及为什么基于 PyAutoGUI 的助手如 uc_gui_click_captcha() 需要显示才能点击任何东西。并且在使用身份验证代理时双向测试 incognito=True:扩展和隐身是一对脆弱的组合,你的凭据在扩展中传递。

SeleniumBase UC 模式代理问题的调试清单,从出口 IP 验证到隐身和代理类型更改的顺序
从左列自上而下工作。大多数工单在前两行关闭,远在任何人需要接触隐身设置之前。

调试清单,按顺序

CDP 模式,作为普通 UC 模式的记录继任者,并未改变这一切:代理限制来自 Chrome,而不是框架,因此相同的清单适用。对于支持身份验证代理的跨框架视图,我们的 反检测框架代理地图并排列出了它。

常见问题解答

为什么我的 IP 在使用 SeleniumBase UC 模式时没有改变?

几乎总是因为代理身份验证扩展没有加载,所以 Chrome 直接浏览。发生这种情况时不会引发错误。升级 SeleniumBase,确认代理字符串为 USER:PASS@HOST:PORT,并使用 curl 测试相同的凭据。如果机器有稳定的公共 IP,将其列入白名单并完全删除凭据。

为什么 UC 模式在没有代理时可以绕过 Cloudflare,而有代理时却不行?

因为你自己的连接有干净的声誉,而代理出口没有。共享的数据中心范围被严重标记,标记的 IP 会得到无法通过自动化清除的困难挑战。将任务移至住宅或移动出口,并在更改任何隐身设置之前重新测试——浏览器从来不是问题。

SeleniumBase UC 模式能与 SOCKS5 代理一起使用吗?

没有凭据可以。带凭据则不行——Chromium 从未实现 SOCKS5 用户名/密码身份验证,因此没有 Selenium 家族框架可以添加它。使用同一网关的 HTTP 端点和凭据,或将你的 IP 列入白名单并保持 SOCKS5 端点未认证。

我可以在无头模式下使用代理运行 UC 模式吗?

你可以,但不应该。UC 模式在无头模式下是可检测的,CAPTCHA 辅助方法需要真实显示,因为它们通过 PyAutoGUI 驱动鼠标。在 Linux 服务器上使用 xvfb=True 作为虚拟显示;这是维护的示例所针对的组合。

如何在 SeleniumBase 中使用代理轮换?

指向一个旋转网关,而不是管理一个列表:每个新连接从池中获得不同的出口,无需代码更改。对于必须在多个页面之间保持一个身份的流程,在用户名参数中请求粘性会话,以便出口在会话窗口中保持,并为每个身份启动一个新的驱动程序。

UC 模式并不是在对抗你的代理。它是在 Chrome 从未为自动化设计的凭据机制之上叠加一个隐身启动序列,然后一个烧毁的 IP 完成了工作。通过白名单移除扩展,在接触其他任何东西之前验证出口,并为浏览器提供一个尚未耗尽的 IP。

在干净的住宅 IP 上运行 UC 模式