Selenium 指南 · 1 分钟阅读

在 Python 和 Java 中设置 Selenium 代理

Selenium 可以通过几行代码将浏览器路由到代理——但需要身份验证的代理需要扩展或出站助手,因为 Chrome 不会在命令行中接受 USER:PASS。这里是可靠的模式。

Selenium中的身份验证问题

Setting an unauthenticated proxy in Selenium is trivial: add --proxy-server=http://host:3128 to Chrome options, or fill Selenium's Proxy object, and you are done. The moment the proxy needs a username and password, that simple path breaks — Chrome refuses credentials inline, and unlike Puppeteer or Playwright, Selenium has no built-in authenticate() hook to answer the 407 challenge.

这个强大、跨语言的解决方案是一个在运行时生成的小型 Chrome 扩展,它携带您的凭据并通过 webRequest API 回应代理的认证请求。它可以无头运行,不需要额外的服务,并且在 Python 和 Java 中表现相同。使用 s4m,您可以将扩展指向 proxy.s4m.online:3128 (HTTP) 和您的 USER:PASS。请参阅 代理页面 和 认证指南 以获取背景信息;在测试期间,对于无认证选项,免费列表 中有可以直接放入命令行标志的开放代理。

通过生成的扩展进行身份验证的代理

这个Python助手编写一个一次性Chrome扩展,携带您的凭据,然后加载它。在运行之前替换USER:PASS。

python
import os, zipfile, tempfile
from selenium import webdriver

HOST, PORT, USER, PASS = "proxy.s4m.online", 3128, "USER", "PASS"

manifest = '{"version":"1.0.0","manifest_version":2,"name":"s4m-proxy",'\
  '"permissions":["proxy","webRequest","webRequestBlocking","<all_urls>"],'\
  '"background":{"scripts":["bg.js"]}}'

bg = ('var c={mode:"fixed_servers",rules:{singleProxy:'
      '{scheme:"http",host:"%s",port:%d}}};'
      'chrome.proxy.settings.set({value:c,scope:"regular"},function(){});'
      'chrome.webRequest.onAuthRequired.addListener('
      'function(d){return {authCredentials:{username:"%s",password:"%s"}};},'
      '{urls:["<all_urls>"]},["blocking"]);') % (HOST, PORT, USER, PASS)

path = os.path.join(tempfile.mkdtemp(), "s4m_proxy.zip")
with zipfile.ZipFile(path, "w") as z:
    z.writestr("manifest.json", manifest)
    z.writestr("bg.js", bg)

opts = webdriver.ChromeOptions()
opts.add_extension(path)
driver = webdriver.Chrome(options=opts)
driver.get("https://api.ipify.org")
print("Exit IP:", driver.find_element("tag name", "body").text)
driver.quit()

# ----- Java (unauthenticated proxy) -----
// Proxy p = new Proxy();
// p.setHttpProxy("proxy.s4m.online:3128");
// ChromeOptions o = new ChromeOptions();
// o.setProxy(p);
// WebDriver driver = new ChromeDriver(o);

选择您的方法

根据代理是否需要凭据进行选择。

没有认证?使用标志

对于未认证的代理,只需将--proxy-server=http://host:3128添加到ChromeOptions,或设置Selenium的Proxy对象。无需其他操作。

认证?生成一个扩展

对于USER:PASS代理,发送一个小的运行时扩展,响应onAuthRequired。它在无头模式下工作,并在不同语言中表现相同。

浏览器的 HTTP 端点

使用proxy.s4m.online:3128 (HTTP)。在浏览器中经过身份验证的SOCKS5不可靠,因此将SOCKS5保留用于CLI和库客户端。

保持扩展的私密性

生成的扩展将你的凭据嵌入临时文件。将其写入私有临时目录,并在运行后清理。

可靠性和诚实的期望

Selenium 驱动真实浏览器,这既是它的优势也是它的成本:它比原始的 HTTP 客户端更重,因此请保持会话的目的性并及时关闭驱动程序。如果您只需要 HTML,代理后面的 HTTP 客户端要便宜得多——请参见使用请求进行抓取。当需要 JavaScript 渲染或真实用户交互时,请使用 Selenium。

和往常一样,代理会更改您的 IP,而不是您的指纹。s4m 代理是数据中心——非常适合功能测试、监控和适度抓取,但在敌对网站上可被检测为数据中心。当登录或白名单期望一个稳定的地址时,请添加一个专用个人 IP。对于较新的项目,请考虑Playwright,其原生代理身份验证完全避免了扩展程序的麻烦。使用工具验证出口,并阅读API 文档以自动化凭证轮换。

FAQ

问题,已解答

为什么我不能在Selenium的代理标志中放入USER:PASS?

Chrome 忽略 --proxy-server 标志中的凭据,而是提出一个本地身份验证提示,无法由无头浏览器回答。可靠的解决方案是一个小型运行时 Chrome 扩展,它在 onAuthRequired 时用您的用户名和密码进行响应。

有没有更简单的方法来使用未认证的代理?

是的。如果没有凭据,您可以只需将 --proxy-server=http://host:3128 添加到 ChromeOptions,或者在 Java 中填写 Selenium 的 Proxy 对象。当代理需要 USER:PASS 时,才需要扩展。

我应该在Selenium中使用SOCKS5还是HTTP?

在端口 3128 上使用 HTTP 端点进行浏览器访问。浏览器中的经过身份验证的 SOCKS5 不可靠;将 SOCKS5 保留用于命令行和库客户端。

使用Playwright会更容易吗?

通常是的。Playwright 在其代理对象中原生支持代理凭证,因此您可以完全跳过扩展。当您的项目已经依赖于它时,Selenium 仍然是正确的选择。

通过代理驱动浏览器

在 proxy.s4m.online 上的经过身份验证的数据中心代理,准备通过生成的扩展用于 Selenium。按需计费,提供专用 IP 选项以实现稳定登录。

人们通过搜索找到此页面

此页面回答的真实搜索短语 — 链接的短语打开详细覆盖它们的页面。