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
相关产品推荐
相关产品推荐

