You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ruby环境下Selenium WebDriver配置Luminati代理认证求助

解决Selenium Chrome驱动中Luminati代理的认证问题

我完全懂你的困扰——直接在--proxy-server里嵌用户名密码不仅报错,浏览器还弹认证框,而Puppeteer的page.authenticate()又没法直接套用到Selenium上。别担心,这里有两种可靠的解决方案:

方案1:使用Chrome扩展自动处理代理认证

这是目前最稳定的方法,通过一个小型Chrome扩展拦截代理认证请求,自动填入你的账号密码。

步骤1:创建Chrome扩展文件

先在本地新建一个文件夹(比如proxy_auth_extension),里面创建两个核心文件:

  1. manifest.json(扩展配置文件):
{
  "manifest_version": 3,
  "name": "Proxy Auth AutoFill",
  "version": "1.0",
  "permissions": ["proxy", "tabs", "storage", "webRequest", "webRequestAuthProvider"],
  "host_permissions": ["<all_urls>"],
  "background": {
    "service_worker": "background.js"
  }
}
  1. background.js(处理认证逻辑):
// 替换成你的Luminati账号密码
const USERNAME = 'lum-customer-zone-residential-country-us';
const PASSWORD = 'asasass';

chrome.webRequest.onAuthRequired.addListener(
  function(details, callbackFn) {
    callbackFn({
      authCredentials: {
        username: USERNAME,
        password: PASSWORD
      }
    });
  },
  {urls: ["<all_urls>"]},
  ['blocking']
);

步骤2:在Selenium中加载该扩展

修改你的Ruby代码,添加加载扩展的参数:

def build_driver
  @driver = Selenium::WebDriver.for :chrome, options: web_driver_options
end

def web_driver_options
  @web_driver_options ||= begin
    options = Selenium::WebDriver::Chrome::Options.new
    options.add_argument('--ignore-certificate-errors')
    options.add_argument('--disable-dev-shm-usage')
    # 只配置代理服务器,不要在这里加用户名密码
    options.add_argument('--proxy-server=http://zproxy.lum-superproxy.io:22225')
    # 加载本地的代理认证扩展,替换成你实际的文件夹路径
    options.add_argument("--load-extension=/your/local/path/proxy_auth_extension")
    options
  end
end

方案2:通过Chrome Preferences配置认证(部分版本适用)

有些Chrome版本支持直接通过Preferences注入认证信息,但兼容性不如扩展方案,你可以试试:

def web_driver_options
  @web_driver_options ||= begin
    options = Selenium::WebDriver::Chrome::Options.new
    options.add_argument('--ignore-certificate-errors')
    options.add_argument('--disable-dev-shm-usage')
    options.add_argument('--proxy-server=http://zproxy.lum-superproxy.io:22225')
    
    # 设置代理相关偏好,禁用系统密码管理器干扰
    prefs = {
      "proxy" => {
        "mode" => "fixed_servers",
        "server" => "zproxy.lum-superproxy.io:22225"
      },
      "credentials_enable_service" => false,
      "profile" => {
        "password_manager_enabled" => false
      }
    }
    options.add_preference(:prefs, prefs)
    
    options
  end
end

为什么直接嵌入用户名密码会报错?

Chrome在较新版本中限制了--proxy-server参数里直接用username:password@的形式,尤其是Luminati这类需要复杂认证逻辑的代理服务,这种方式会被浏览器拦截或判定为无效,所以才会弹出认证框。

内容的提问来源于stack exchange,提问作者Vishal G

火山引擎 最新活动