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

Python Selenium如何为Chrome配置带账号密码认证的代理?

解决方案

问题根因

Chrome原生的--proxy-server启动参数不支持传入包含账号密码认证信息的代理URL,因此你当前的写法无法生效,带身份认证的代理需要通过扩展或手动配置的方式实现,动态生成临时Chrome扩展是最适合Selenium自动化场景的实现方案。

实现步骤

1. 方案原理

我们会动态生成一个最小化的Chrome扩展,用于自动响应代理的身份认证请求,无需手动打包扩展安装包,也无需修改系统配置,Linux无桌面环境也可正常运行。

2. 完整代码示例

首先需要确保你使用的Chrome版本 >= 112,方便使用支持扩展的新headless模式,代码如下:

import os
import tempfile
from urllib.parse import urlparse
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

def get_chrome_options_with_proxy(proxy_url):
    chrome_options = Options()
    # 解析代理URL获取认证信息和代理地址
    parsed_proxy = urlparse(proxy_url)
    proxy_user = parsed_proxy.username
    proxy_pass = parsed_proxy.password
    proxy_host = parsed_proxy.hostname
    proxy_port = parsed_proxy.port

    # 生成临时扩展目录
    ext_dir = tempfile.mkdtemp()

    # 写入扩展配置文件manifest.json
    manifest_content = """
    {
        "version": "1.0.0",
        "manifest_version": 2,
        "name": "Proxy Auto Auth",
        "permissions": [
            "proxy",
            "webRequest",
            "webRequestBlocking",
            "<all_urls>"
        ],
        "background": {
            "scripts": ["background.js"]
        },
        "minimum_chrome_version": "76.0.0"
    }
    """
    with open(os.path.join(ext_dir, "manifest.json"), "w") as f:
        f.write(manifest_content)

    # 写入扩展逻辑文件background.js
    background_content = f"""
    var config = {{
        mode: "fixed_servers",
        rules: {{
            singleProxy: {{
                scheme: "{parsed_proxy.scheme}",
                host: "{proxy_host}",
                port: {proxy_port}
            }},
            bypassList: ["localhost", "127.0.0.1"]
        }}
    }};
    chrome.proxy.settings.set({{value: config, scope: "regular"}}, function() {{}});

    function callbackFn(details) {{
        return {{
            authCredentials: {{
                username: "{proxy_user}",
                password: "{proxy_pass}"
            }}
        }};
    }}

    chrome.webRequest.onAuthRequired.addListener(
        callbackFn,
        {{urls: ["<all_urls>"]}},
        ['blocking']
    );
    """
    with open(os.path.join(ext_dir, "background.js"), "w") as f:
        f.write(background_content)

    # 加载扩展
    chrome_options.add_argument(f"--load-extension={ext_dir}")
    # 如果使用无桌面模式,必须使用新headless参数,旧headless不支持扩展
    chrome_options.add_argument("--headless=new")
    # Linux环境下Selenium运行常用配置
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-dev-shm-usage")
    return chrome_options

# 调用示例
if config.proxy:
    chrome_options = get_chrome_options_with_proxy(config.proxy)
driver = webdriver.Chrome(options=chrome_options)

3. 可选替代方案

如果你使用的Chrome版本低于112无法使用新headless模式,可以改用本地代理转发方案:在本地安装tinyproxy等轻量代理服务,配置上游为需要认证的目标代理,再将Selenium的代理地址指向本地tinyproxy的监听端口即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:39:01