使用代理启动并进行身份验证#
import puppeteer from "puppeteer";
const browser = await puppeteer.launch({
headless: true,
args: ["--proxy-server=http://res.proxy-cyber.com:9000", "--no-first-run"],
});
const page = await browser.newPage();
await page.authenticate({ username: "USER-cc-us-sid-run1-ttl-30m", password: "PASS" });
await page.goto("https://api.ipify.org", { waitUntil: "domcontentloaded", timeout: 45000 });
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();如果交付的网关支持会话标识,请为每个独立流程使用不同标识。允许的持续时间和地区参数应以连接信息为准。住宅设备可能提前离线,因此持续会话不保证数日使用同一 IP。需要固定地址时,应比较独享静态产品。
每个浏览器使用一个代理#
启动参数 --proxy-server 设置浏览器的默认路由。当前 Puppeteer 也支持在 browser.createBrowserContext() 中设置 proxyServer,并通过 page.authenticate() 提供凭据。不同代理应使用独立上下文;持久配置文件应使用不同数据目录。请在每个上下文中验证出口。
屏蔽图片、字体和媒体#
await page.setRequestInterception(true);
page.on("request", (req) => {
const t = req.resourceType();
if (["image", "media", "font", "stylesheet"].includes(t)) return req.abort();
req.continue();
});保持环境一致#
- 将
Accept-Language和时区设为出口所在国家/地区:使用page.setExtraHTTPHeaders({\"Accept-Language\": \"de-DE,de;q=0.9\"})和page.emulateTimezone(\"Europe/Berlin\")。 - 在启动参数中加入
--force-webrtc-ip-handling-policy=disable_non_proxied_udp,防止 WebRTC 泄漏。 - 每个账号使用一个浏览器;若账号需要表现为曾经访问过的设备,请复用其用户数据目录。
常见错误#
| 现象 | 原因 | 解决方法 |
|---|---|---|
| net::ERR_TUNNEL_CONNECTION_FAILED | 网关拒绝 CONNECT:凭据或参数错误,或没有可用出口 | 使用 cURL -v 重现问题并读取网关状态码 |
| net::ERR_PROXY_AUTH_UNSUPPORTED / 弹出提示 | 在导航后才调用 authenticate() | 在 goto 前调用 page.authenticate |
| 每个浏览器都显示相同 IP | 重复使用了同一个会话 ID | 每个浏览器使用不同的 -sid-,或将其省略 |
| 首次加载非常慢 | 家庭住宅出口加上资源繁重的页面 | 屏蔽资源;将超时提高至 45 秒 |
大家常问的问题#
Puppeteer 可以使用带密码的 SOCKS5 吗?
Chrome 不支持 SOCKS5 身份验证。请配合 page.authenticate 使用 9000 端口的 HTTP 代理,或将服务器 IP 加入白名单,并传入 --proxy-server=socks5://res.proxy-cyber.com:9001。