使用Python为Chrome 59+配置基础认证弹窗信息
解决Chrome 64+ ChromeDriver代理基础认证弹窗无法填充的问题
我之前也踩过Chrome 64+版本代理认证的坑,确实Chrome 59之后官方就移除了直接通过Driver参数传递代理认证信息的支持,老方法完全失效。结合你用EC2上Squid代理的场景,给你几个可行的解决方案:
方案一:用Chrome扩展自动处理认证弹窗
这是最可靠的通用方案,原理是通过Chrome扩展在页面加载前注入脚本,自动处理代理认证的弹窗:
先创建一个简单的Chrome扩展,包含两个文件:
- manifest.json:
{ "manifest_version": 2, "name": "Proxy Auth AutoFill", "version": "1.0", "permissions": ["<all_urls>", "webRequest", "webRequestBlocking"], "background": { "scripts": ["background.js"] } } - background.js:
chrome.webRequest.onAuthRequired.addListener( function(details) { return { authCredentials: { username: "你的代理用户名", password: "你的代理密码" } }; }, {urls: ["<all_urls>"]}, ["blocking"] );
- manifest.json:
把这两个文件打包成CRX扩展(或者直接用文件夹),然后在ChromeOptions中加载这个扩展:
// Java示例,其他语言逻辑类似 ChromeOptions options = new ChromeOptions(); options.addExtensions(new File("path/to/your/extension.crx")); // 也可以直接加载扩展文件夹 // options.addArguments("--load-extension=path/to/extension/folder"); WebDriver driver = new ChromeDriver(options);
方案二:把认证信息嵌入代理URL(注意安全风险)
Chrome 64+支持将用户名密码直接嵌入到代理地址中,格式如下:
http://用户名:密码@代理IP:端口
然后在ChromeOptions中配置代理:
ChromeOptions options = new ChromeOptions(); Proxy proxy = new Proxy(); proxy.setHttpProxy("http://user:pass@ec2-squid-ip:3128"); proxy.setSslProxy("http://user:pass@ec2-squid-ip:3128"); options.setCapability("proxy", proxy); WebDriver driver = new ChromeDriver(options);
⚠️ 注意:这种方法安全风险很高,用户名和密码会明文出现在日志、进程参数中,不建议在生产环境使用。
方案三:给EC2节点配置Squid IP白名单(最安全的方案)
既然你的Squid代理和ChromeDriver都运行在EC2环境(或固定IP机器),完全可以通过Squid配置跳过该IP的认证:
编辑Squid的配置文件(通常是
/etc/squid/squid.conf):# 添加ACL规则,允许你的EC2节点IP访问 acl ec2_node src 你的EC2节点IP/32 # 允许该ACL跳过认证 http_access allow ec2_node # 保持原有的认证规则在后面 http_access allow authenticated http_access deny all重启Squid服务:
sudo systemctl restart squid
这样你的ChromeDriver访问代理时就不会弹出认证窗口了,而且完全没有安全风险,是最适合你场景的方案。
内容的提问来源于stack exchange,提问作者user1592380
相关产品推荐
相关产品推荐

