如何为Puppeteer配置多代理?现有方案报错求助
Puppeteer多代理配置问题解决
问题说明
原本单代理配置可正常运行,但尝试为每个独立Chrome窗口配置不同代理以实现隔离并行爬取时,出现net::ERR_NO_SUPPORTED_PROXIES错误。
错误信息
Error: net::ERR_NO_SUPPORTED_PROXIES at https://dnsleaktest.com
正常单代理代码
const puppeteer = require('puppeteer'); const proxy = 'myip:myport'; const username = 'myusername'; const password = 'mypassword'; (async () => { // 传入代理地址到--proxy-server参数 const browser = await puppeteer.launch({ args: [`--proxy-server=${proxy}`], headless: false, ignoreHTTPSErrors: true }); const page = await browser.newPage() page.setDefaultNavigationTimeout(0); // 使用账号密码认证代理 await page.authenticate({ username, password }); await page.goto('https://dnsleaktest.com'); })();
用户的多代理问题代码
const puppeteer = require('puppeteer'); (async () => { let browsers = []; const proxies = [ 'socks5://myuser:mypass@host:port', 'socks5://myuser:mypass@host:port', 'socks5://myuser:mypass@host:port', ]; const openWindow = async (proxy) => { try { const browser = await puppeteer.launch({ headless: false, ignoreHTTPSErrors: true, args: [`--proxy-server=${proxy}`] }); const page = await browser.newPage(); browsers.push({ browser, page }); page.setDefaultNavigationTimeout(0); await page.setViewport({ width: 992, height: 607 }); await page.goto('chrome://new-tab-page/', { waitUntil: 'load' }); await page.goto('https://dnsleaktest.com/', { waitUntil: 'load' }); console.log(`Window opened with proxy: ${proxy}`); } catch (error) { console.error(`Error opening window with proxy ${proxy}: ${error}`); } }; // 批量启动代理窗口 const openWindowPromises = proxies.map(proxy => openWindow(proxy)); await Promise.all(openWindowPromises); console.log('All windows opened or skipped due to dead proxies.'); })();
问题原因
Chrome的--proxy-server参数不支持直接在代理URL中嵌入用户名和密码(如socks5://myuser:mypass@host:port格式),这种写法会导致代理配置无法被识别,进而抛出ERR_NO_SUPPORTED_PROXIES错误。正确的做法是将代理地址与认证信息分离,通过page.authenticate()单独传入账号密码。
修正后的多代理代码
const puppeteer = require('puppeteer'); (async () => { let browsers = []; // 改为存储代理地址、账号、密码的对象数组 const proxyConfigs = [ { proxy: 'socks5://host:port', username: 'myuser', password: 'mypass' }, { proxy: 'socks5://host:port', username: 'myuser', password: 'mypass' }, { proxy: 'socks5://host:port', username: 'myuser', password: 'mypass' } ]; const openWindow = async (config) => { try { const browser = await puppeteer.launch({ headless: false, ignoreHTTPSErrors: true, args: [`--proxy-server=${config.proxy}`] }); const page = await browser.newPage(); browsers.push({ browser, page }); page.setDefaultNavigationTimeout(0); await page.setViewport({ width: 992, height: 607 }); // 添加代理认证步骤 await page.authenticate({ username: config.username, password: config.password }); await page.goto('https://dnsleaktest.com/', { waitUntil: 'load' }); console.log(`Window opened with proxy: ${config.proxy}`); } catch (error) { console.error(`Error opening window with proxy ${config.proxy}: ${error}`); } }; // 并行启动所有代理窗口 const openWindowPromises = proxyConfigs.map(config => openWindow(config)); await Promise.all(openWindowPromises); console.log('All windows opened or skipped due to dead proxies.'); })();
额外注意事项
- 确保代理地址格式正确(如
socks5://host:port,不要附带认证信息) - 若使用HTTP/HTTPS代理,将协议改为
http://或https://即可 - 并行启动多个浏览器实例时,注意系统资源占用,避免因资源不足导致异常
内容的提问来源于stack exchange,提问作者Parvinder
相关产品推荐
相关产品推荐

