如何在 Puppeteer 中配置带认证的代理(Node.js 指南)
更新于:
Puppeteer 基于 Chrome DevTools Protocol(CDP)控制 Chrome 与 Chromium,提供了原生的 await page.authenticate({ username, password }) API 来响应 HTTP 407 代理认证挑战。将 --proxy-server=http://ip:port 与 page.authenticate() 配合使用,即可让 Node.js 爬虫无缝通过 VinaProxy 静态代理路由,无需安装任何外部浏览器扩展插件。
--proxy-server=http://ip:port + page.authenticate({ username, password })- 1 个IP₫40,000
- 5+ 个IP₫35,000
- 10+ 个IP₫25,000
- 20+ 个IP₫25,000
- 50+ 个IP₫25,000
- 100+ 个IP₫25,000
- 200+ 个IP₫25,000
- 500+ 个IP₫25,000
- 1000+ 个IP₫22,000
- 2000+ 个IP₫20,000
- 1 个IP₫40,000
- 5+ 个IP₫35,000
- 10+ 个IP₫25,000
- 20+ 个IP₫25,000
- 50+ 个IP₫25,000
- 100+ 个IP₫25,000
- 200+ 个IP₫25,000
- 500+ 个IP₫25,000
- 1000+ 个IP₫22,000
- 2000+ 个IP₫20,000
Puppeteer 两步式代理配置流程
切勿将 user:pass@ 直接内嵌在 --proxy-server 启动参数中。正确的做法是在启动时传入主机与端口,并在 Page 实例上进行身份认证:
| 执行步骤 | Puppeteer 代码示例 | 技术要点与作用 |
|---|---|---|
| 1. 启动 Chromium | puppeteer.launch({ args: ['--proxy-server=http://ip:port'] }) | 将 Chromium 底层网络套接字定向至你的 VinaProxy 代理服务器 |
| 2. 认证页面会话 | await page.authenticate({ username, password }) | 通过 CDP 向浏览器提供凭据以解决 HTTP 407 代理验证挑战 |
| 3. 页面导航请求 | await page.goto(url, { waitUntil: 'domcontentloaded' }) | 经由已认证的加密安全隧道加载目标网页内容 |
借助 proxy-chain 在多标签页中轮换代理
- 注意
page.authenticate()的作用域仅限于单个Page标签页,由browser.newPage()返回的每个新标签页都必须单独调用认证 - 若要在单进程 Chromium 内的各无痕上下文中使用不同代理,可使用
proxy-chainnpm 包的anonymizeProxy()将每个http://user:pass@ip:port封装为本地中继,并传入browser.createBrowserContext({ proxyServer }) - 完全兼容
puppeteer-extra及其生态中的puppeteer-extra-plugin-stealth反检测插件
操作步骤
- 1
向 puppeteer.launch() 传入 --proxy-server 参数
使用
const browser = await puppeteer.launch({ args: ['--proxy-server=http://ip:port'] });启动浏览器。 - 2
在新建页面上调用 await page.authenticate()
新建标签页
const page = await browser.newPage();并执行await page.authenticate({ username: 'USER', password: 'PASS' });。 - 3
验证外部出口 IP 地址
运行
await page.goto('https://vinaproxy.com/api/my-ip');并打印检查返回的 JSON 数据。 - 4
回收并清理浏览器进程
抓取任务完成后,及时调用
await browser.close();关闭实例以释放资源。
常见问题
为什么 Puppeteer 会抛出 ERR_NO_SUPPORTED_PROXIES 异常?
当在启动参数中直接书写 --proxy-server=http://user:pass@ip:port 时便会触发该错误。启动参数只应包含 --proxy-server=http://ip:port,密码凭据必须通过 await page.authenticate({ username, password }) 传入。
为什么通过 browser.newPage() 打开的第二个标签页会出现 HTTP 407 错误?
因为 page.authenticate() 的授权仅对当前标签页生效。在任何通过 browser.newPage() 打开的新标签页发起导航前,必须先调用 await secondPage.authenticate({ username, password })。
使用无头 Chrome 进行网页抓取时,VinaProxy 代理会限制流量吗?
不会。所有 VinaProxy 独享 IPv4 与静态 ISP 套餐均包含无限制的月度流量。
使用高速静态 IP 赋能你的 Node.js Puppeteer 自动化集群
覆盖 7 大区域、即时交付且不限流量的独享 IPv4 与静态 ISP 代理服务。
购买 Puppeteer 代理