集成 · 中级

在 Puppeteer 和无头 Chrome 中使用代理

在浏览器启动时或受支持的 Puppeteer 上下文中设置代理,并在导航前提供凭据。请在每个上下文内检查分配的出口,并为独立流程使用独立会话。

阅读约需 2 分钟 5 个章节 审核日期 编辑团队 Proxy Cyber

使用代理启动并进行身份验证#

Node.js
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。

您的账户

在一个账户中管理代理服务

在同一控制台比较网络、下单并查看余额与支持请求。团队人工核验付款,交付后提供连接信息。

创建账户