You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Selenium为每个Chrome窗口配置独立代理失败排查

解决Selenium配置Chrome带认证代理时的ERR_NO_SUPPORTED_PROXIES错误

问题分析

你遇到的ERR_NO_SUPPORTED_PROXIES错误,核心原因是Chrome的--proxy-server参数不支持直接传入包含用户名和密码的代理格式(比如134.202.29.0:61234:butterfly0:Q0ILdE2o)。这个参数仅接受[协议://]ip:port的格式,带认证信息的字符串会被Chrome判定为无效代理地址,导致无法连接。

解决方案

下面提供两种可行的实现方式,帮你给每个Chrome窗口配置独立的带认证代理:

方法1:使用Chrome DevTools协议(CDP)动态设置代理认证

这种方法不需要额外安装扩展,通过Selenium的CDP接口直接向Chrome注入代理认证信息,步骤如下:

  • 拆分代理字符串,提取IP、端口、用户名、密码
  • 仅将ip:port传入--proxy-server参数
  • 使用CDP的Network.setExtraHTTPHeaders和Network.enable方法注入认证头

修改后的get_driver函数示例:

def get_driver(proxy):
    # 拆分代理信息
    proxy_parts = proxy.split(':')
    proxy_ip = proxy_parts[0]
    proxy_port = proxy_parts[1]
    proxy_user = proxy_parts[2]
    proxy_pass = proxy_parts[3]

    options = Options()

    prefs = {"credentials_enable_service": False,
             "profile.password_manager_enabled": False}

    options.add_experimental_option("prefs", prefs)
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    options.add_experimental_option('excludeSwitches', ['enable-logging'])
    options.add_argument('--disable-blink-features=AutomationControlled')
    options.add_argument("--disable-extensions")
    options.add_argument("--disable-popup-blocking")
    options.add_argument("--disable-notifications")
    options.add_argument("--start-maximized")
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-dev-shm-usage")

    # 仅传入ip:port到proxy-server参数
    options.add_argument(f'--proxy-server=http://{proxy_ip}:{proxy_port}')

    ser = Service("chromedriver.exe")
    driver = webdriver.Chrome(service=ser, options=options)

    # 使用CDP设置代理认证
    auth_token = base64.b64encode(f"{proxy_user}:{proxy_pass}".encode()).decode()
    driver.execute_cdp_cmd('Network.enable', {})
    driver.execute_cdp_cmd('Network.setExtraHTTPHeaders', {
        'headers': {'Proxy-Authorization': f'Basic {auth_token}'}
    })

    return driver

方法2:使用自定义Chrome扩展自动处理代理认证

如果你需要长期使用,也可以制作一个简单的Chrome扩展,自动注入代理认证信息:

  1. 创建一个扩展文件夹(比如proxy_auth_extension),里面包含两个文件:
    • manifest.json:扩展配置文件
    • background.js:处理代理认证的脚本

manifest.json内容:

{
  "version": "1.0.0",
  "manifest_version": 3,
  "name": "Proxy Auth Auto",
  "permissions": ["proxy", "storage", "tabs", "webRequest", "webRequestAuthProvider"],
  "host_permissions": ["<all_urls>"],
  "background": {
    "service_worker": "background.js"
  }
}

background.js内容(需替换为对应代理信息,或动态生成):

const proxyConfig = {
  mode: "fixed_servers",
  rules: {
    singleProxy: {
      scheme: "http",
      host: "PROXY_IP",
      port: PROXY_PORT
    },
    bypassList: ["localhost"]
  }
};

chrome.proxy.settings.set({value: proxyConfig, scope: "regular"}, () => {});

chrome.webRequest.onAuthRequired.addListener(
  (details, callbackFn) => {
    callbackFn({
      authCredentials: {
        username: "PROXY_USER",
        password: "PROXY_PASS"
      }
    });
  },
  {urls: ["<all_urls>"]},
  ["blocking"]
);

然后在Selenium中加载这个扩展:

def get_driver(proxy):
    proxy_parts = proxy.split(':')
    # 可动态替换扩展脚本里的代理信息,或为每个代理生成单独扩展文件
    # 省略其他options配置...

    # 加载自定义扩展
    options.add_argument(r'--load-extension=./proxy_auth_extension')

    ser = Service("chromedriver.exe")
    driver = webdriver.Chrome(service=ser, options=options)
    return driver

注意:这种方法需要为每个不同代理生成对应扩展文件,或动态修改脚本内容,适合批量场景。

验证修改

修改后运行代码,Chrome窗口应该能正常通过代理加载网页,不会再出现ERR_NO_SUPPORTED_PROXIES错误。

内容的提问来源于stack exchange,提问作者Ahmed Zaidan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:05:34