接入指南
Puppeteer 代理设置:用户名与密码
Chrome 通过启动参数接收代理地址,登录则另外询问。Puppeteer 用 page.authenticate 回应这次登录,而且必须在第一次导航之前调用。
开始之前
- 安装了 Puppeteer 的 Node.js:npm i puppeteer,它会同时下载匹配的 Chrome。
- 服务页面上的 HOST、PORT、USERNAME 和 PASSWORD。
你的连接信息
登录控制台,打开你购买的服务。服务页面上会显示该服务的主机、端口、用户名和密码。ProxyPanda 没有一个统一的固定地址,所以每次都请从那里复制。指南中的代码使用下面这些占位符,请逐一替换成你自己的值。
- HOST
- 该服务的代理地址,按服务页面上显示的原样填写。
- PORT
- 要连接的端口。请和主机一起复制,因为不同服务的端口可能不同。
- USERNAME
- 你的代理登录名。它与你登录控制台所用的邮箱是分开的。
- PASSWORD
- 请完整复制。住宅代理在控制台中选择的选项会附加在密码末尾,凭记忆手动输入的密码会丢失这些选项。
把你用来连接的 IP 地址加入服务的白名单,就可以不用用户名和密码。这时代码里只需要 HOST 和 PORT。
示例都使用 HTTP,它可以通过加密隧道访问 https 网站。SOCKS5 同样可用:住宅代理的端口两种都接受,ISP 和数据中心代理在控制台里切换协议。
步骤
用 --proxy-server 启动 Chrome
参数里只写协议、主机和端口。Chrome 不接受写在其中的用户名或密码。
在 page.goto 之前调用 page.authenticate
这样 Chrome 会用你的凭据回应代理的 407 验证。脚本会打印 api.ipify.org 看到的地址,应当是代理的地址。
check-ip.mjs import puppeteer from 'puppeteer'; const browser = await puppeteer.launch({ args: ['--proxy-server=http://HOST:PORT'], }); const page = await browser.newPage(); await page.authenticate({ username: 'USERNAME', password: 'PASSWORD' }); await page.goto('https://api.ipify.org?format=json'); console.log(await page.evaluate(() => document.body.innerText)); await browser.close();减少页面下载的内容
请求拦截可以在图片、媒体和字体加载前将其中止。它可以和 page.authenticate 同时使用,并让按 GB 计费的住宅流量只花在你用得上的部分。
block-media.mjs await page.setRequestInterception(true); page.on('request', (request) => { if (['image', 'media', 'font'].includes(request.resourceType())) request.abort(); else request.continue(); });
轮换 IP 与粘性 IP
传给 page.authenticate 的凭据只对当前页面有效。每打开一个新页面都要再调用一次,否则该页面的请求到达代理时不带登录信息。
住宅代理选“随机 IP”时,同一个页面背后的多条连接可能从不同地址发出。需要看起来像同一个访客的流程,请用“粘性 IP”,或者用不会变化的 ISP 或数据中心 IP。
常见错误与解决办法
net::ERR_NO_SUPPORTED_PROXIES
--proxy-server 参数里写了用户名和密码。那里只保留 http://HOST:PORT,登录信息交给 page.authenticate。
页面是空白的,响应状态为 407
没有调用 page.authenticate,或者它在 page.goto 之后才运行。把它移到 browser.newPage() 之后紧接着调用。
net::ERR_PROXY_CONNECTION_FAILED
Chrome 连不上 HOST:PORT。与服务页面逐一核对,并确认服务没有过期。
Navigation timeout exceeded
出口偶尔会慢,住宅代理上更常见。给 page.goto 传一个更大的 timeout,放弃这个网址之前先重试一次。
其他接入指南
有不明白的词? 术语表用大白话解释。
卡在某一步了?
把命令和报错贴到 Discord,记得先删掉密码。那里的人大多遇到过这些错误。