如何启动带身份验证代理的Chrome并通过Puppeteer完成代理认证
问题解决方法
第一步:修正Chrome启动参数语法错误
你当前使用的启动参数中--user-data-dir的参数值缺少尾部闭合双引号,会导致后续--proxy-server参数被识别为用户数据目录路径的一部分,代理配置未实际生效,先修正为以下格式:
chrome --remote-debugging-port=${port} --user-data-dir="C:\\Users\\USER\\AppData\\Local\\Google\\Chrome\\User Data" --proxy-server=http://host:port
认证不生效的核心原因
page.authenticate() 仅对调用方法后当前页面实例发起的网络请求生效,如果调用方法前页面已经触发了代理407认证请求、或者Chrome全局已经发起过代理认证并缓存了失败状态,单页面的认证配置就不会生效。
解决方案
方案1:全局监听页面创建提前注入认证
监听所有新页面创建事件,在页面发起任何网络请求前就完成认证配置:
const browserURL = `http://127.0.0.1:9222`; const browser = await puppeteer.connect({browserURL, defaultViewport : null }); const username = "username"; const password = "password"; // 所有新页面创建时优先设置认证 browser.on('targetcreated', async (target) => { if (target.type() === 'page') { const page = await target.page(); await page.authenticate({ username, password }); } }); // 后续正常创建页面访问即可 const page = await browser.newPage(); await page.goto('需要访问的目标地址');
方案2:动态设置代理避免提前触发认证
如果方案1不生效,说明Chrome启动后已经触发过代理认证并缓存了失败状态,可去掉启动参数中的--proxy-server配置,等Puppeteer连接成功后通过CDP协议动态设置代理,确保认证配置早于代理生效:
- 调整后的Chrome启动参数:
chrome --remote-debugging-port=${port} --user-data-dir="C:\\Users\\USER\\AppData\\Local\\Google\\Chrome\\User Data"
- 调整后的Puppeteer代码:
const browserURL = `http://127.0.0.1:9222`; const browser = await puppeteer.connect({browserURL, defaultViewport : null }); const username = "username"; const password = "password"; // 提前绑定所有页面的认证配置 browser.on('targetcreated', async (target) => { if (target.type() === 'page') { const page = await target.page(); await page.authenticate({ username, password }); } }); // 动态设置全局代理 const page = await browser.newPage(); await page.authenticate({ username, password }); await page._client.send('Network.setProxy', { proxyRules: 'http://host:port', bypassList: '<local>' }); // 正常访问目标地址 await page.goto('需要访问的目标地址');
注意事项
如果使用的代理为SOCKS5/HTTPS类型,需要将proxyRules的前缀替换为对应类型,比如socks5://host:port、https://host:port。
内容的提问来源于stack exchange,提问作者Donald trump
相关产品推荐
相关产品推荐

