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扩展,自动注入代理认证信息:
- 创建一个扩展文件夹(比如
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
相关产品推荐
相关产品推荐

