周一至周五 09:00 - 18:00(UTC+08:00) 
©2026 NST LABS TECH LTD. 保留所有权利。Lena ZhouGrowth & Integration Specialist
如何设置 Puppeteer 进行网页爬虫 | 2026 指南
TL;DR
- Puppeteer 代理通常通过 Chrome 的
--proxy-server 启动参数在浏览器范围内应用。 该浏览器进程中的每个页面都使用此路由,除非 Chrome 绕过规则另有说明。
- 需要身份验证的 HTTP 代理在常见的 Puppeteer 工作流程中需要单独的
page.authenticate() 调用。 将用户名和密码保存在环境变量或秘密管理器中。
- 在抓取目标之前,请验证浏览器上下文中的出口 IP。 这可以及早捕获错误凭据、绕过规则和意外的直接连接。
- 一个浏览器进程自然映射到一个代理端点。 要实现多个同时出口,请创建受限的浏览器工作进程,而不是更改现有浏览器的启动代理。
- Puppeteer 应仅以尊重的速度抓取公共或授权页面。 代理不会覆盖访问控制、条款、机器人指令或隐私义务。
Puppeteer 代理的作用是什么?
Puppeteer 代理通过在浏览器启动时配置的中介路由 Chrome 的网络流量。目的地看到代理的出口 IP,同时 Puppeteer 仍然控制导航、JavaScript 执行、选择器、截图和浏览器生命周期。Nstproxy 代理基础设施 可以提供端点,但 Node.js 应用程序仍然负责浏览器行为和数据处理。
Puppeteer 通过其 JavaScript API 控制 Chrome 或 Chromium。现代 Chrome Headless 共享浏览器的核心实现,如Chrome 的无头模式文档中所述。当授权页面需要 JavaScript 渲染时,浏览器是有用的;当数据已经通过允许的 API 或静态响应可用时,请使用直接 HTTP 客户端。
有关设置背后的网络模型,请阅读HTTP 代理是什么。
Puppeteer 网络爬虫的先决条件
您需要支持的 Node.js 运行时、当前的 Puppeteer 包、由该软件包提供或识别的 Chrome 安装、代理连接值以及一个公共或授权的目标。
mkdir puppeteer-proxy-demo
cd
puppeteer-proxy-demo
npm
init
-y
npm
install
puppeteer
PROXY_SERVER=http://proxy.example:8000
PROXY_USERNAME=channel-or-user
PROXY_PASSWORD=stored-in-a-secret-manager
在Puppeteer 的配置指南中描述的 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY 变量适用于 Puppeteer 的浏览器下载和执行配置。要可预测地路由页面流量,请传递 Chrome 的代理启动参数。
如何设置 Puppeteer 代理
使用 --proxy-server 启动 Puppeteer,将一个端点应用于浏览器进程。在启动 Chrome 之前验证 PROXY_SERVER 是否存在。
import puppeteer from 'puppeteer';
const proxyServer = process.env.PROXY_SERVER;
if (!proxyServer) {
throw new Error('PROXY_SERVER is required');
}
const browser = await puppeteer.launch({
headless: true,
args: [`--proxy-server=${proxyServer}`],
});
try {
const page = await browser.newPage();
await page.goto('https://api.ipify.org?format=json', {
waitUntil: 'domcontentloaded',
timeout: 30_000,
});
console.log(await page.evaluate(() => document.body.innerText));
} finally {
await browser.close();
}
IP 响应应与直接连接不同,并应匹配预期的区域或提供者。ipify API 报告透明显示给服务的公共地址;它并不能证明所有其他浏览器协议都遵循相同的路线。
如何认证 Puppeteer 代理
对于需要用户名和密码的 HTTP 代理,在导航之前调用 page.authenticate()。请勿将凭据放置在启动参数中或记录环境对象。
import puppeteer from 'puppeteer';
const required = ['PROXY_SERVER', 'PROXY_USERNAME', 'PROXY_PASSWORD'];
for (const name of required) {
if (!process.env[name]) throw new Error(`${name} is required`);
}
const browser = await puppeteer.launch({
headless: true,
args: [`--proxy-server=${process.env.PROXY_SERVER}`],
});
try {
const page = await browser.newPage();
await page.authenticate({
username: process.env.PROXY_USERNAME,
password: process.env.PROXY_PASSWORD,
});
await page.goto('https://api.ipify.org?format=json', {
waitUntil: 'domcontentloaded',
timeout: 30_000,
});
console.log(await page.evaluate(() => document.body.innerText));
} finally {
await browser.close();
}
身份验证错误通常显示为 net::ERR_INVALID_AUTH_CREDENTIALS 或 HTTP 407。在添加重试之前,请确认端点协议和提供商生成的用户名格式。
快速浏览
生成一个 Nstproxy 端点,为每个浏览器工作者绑定一个特定会话,并在访问授权目标之前验证浏览器的退出 IP。
通过 Puppeteer 抓取公共页面
一个负责任的 Puppeteer 抓取示例应该请求一个绑定的公共页面,等待一个稳定的选择器,仅提取所需字段,并在导航失败时关闭浏览器。
import puppeteer from 'puppeteer';
const browser = await puppeteer.launch({
headless: true,
args: [`--proxy-server=${process.env.PROXY_SERVER}`],
});
try {
const page = await browser.newPage();
if (process.env.PROXY_USERNAME && process.env.PROXY_PASSWORD) {
await page.authenticate({
username: process.env.PROXY_USERNAME,
password: process.env.PROXY_PASSWORD,
});
}
await page.setUserAgent('AuthorizedResearchBot/1.0 (+contact@example.com)');
await page.goto('https://example.com/', {
waitUntil: 'domcontentloaded',
timeout: 30_000,
});
const result = await page.$eval('main, body', (root) => ({
title: document.title,
heading: root.querySelector('h1')?.textContent?.trim() ?? null,
url: location.href,
}));
console.log(JSON.stringify(result, null, 2));
} finally {
await browser.close();
}
example.com 保留用于文档,由 IANA 的示例域政策 提供。对于真实项目,只有在检查授权目标后,才能替换选择器,并优先考虑稳定的语义标记,而不是生成的类名。
选择 Nstproxy 用于 Puppeteer
Nstproxy 住宅优质代理 适用于需要住宅出口、可选择区域或适用于多页授权工作流程的 Puppeteer 任务。Puppeteer 通过 Chrome 的标准代理配置消费端点,因此无需特定于提供商的浏览器库。Nstproxy 目前的文档描述了通道、网关端点、国家参数、会话持续时间、会话 ID,以及对 HTTP/HTTPS/SOCKS5 的支持。这种组合适合公共页面渲染、本地化检查、广告验证和价格监控,只要目标允许自动化。代理不能保证访问,脚本仍需控制并发、导航超时和响应验证。
- 会话控制: 在浏览器工作流依赖于 Cookies 或分页状态时,保持相同的文档会话 ID;当需要更换时,独立作业之间进行更改。
- 住宅优质定价: 支持不同浏览器流量配置的套餐和按需付款选项;在选择计划之前,请验证当前费率和转移量。
- 区域网关: 选择离工作者最近的网关以改善连接环节,然后单独请求退出国家。
- 协议选择: HTTP/HTTPS 是最简单的 Puppeteer 身份验证路径。在标准化之前,测试 SOCKS5 行为在确切的 Chrome 构建上。
更广泛的 代理服务器工具指南 将浏览器自动化与更轻量级的 HTTP 客户端进行了比较,而 抓取代理指南 解释了何时适用住宅、数据中心或持久 ISP 出口来处理工作负载。
在浏览器工作者之间轮换代理
一个启动的浏览器有一个 --proxy-server 值,因此多个并发出口应使用独立的浏览器进程或专用的路由层。保持代理池足够小,以适应机器和目标策略。
import puppeteer from 'puppeteer';
async function runWorker(proxy) {
const browser = await puppeteer.launch({
headless: true,
args: [`--proxy-server=${proxy.server}`],
});
try {
const page = await browser.newPage();
await page.authenticate({
username: proxy.username,
password: proxy.password,
});
await page.goto('https://example.com/', {
waitUntil: 'domcontentloaded',
timeout: 30_000,
});
return await page.title();
} finally {
const proxies = JSON.parse(process.env.PROXY_POOL_JSON ?? '[]').slice(0, 2);
const titles = await Promise.all(proxies.map(runWorker));
console.log(titles);
示例将池限制为两个工作者。生产限制应考虑内存、带宽、页面重量、目标速率限制和代理计划。如果合规批次可以重用同一个浏览器和一个稳定会话,请不要为每个 URL 创建一个新浏览器。
## 在不隐藏行为的情况下减少浏览器流量
请求拦截可以在授权提取不需要大的资产时跳过它们。阻止图像和字体减少传输,但阻止脚本可能会更改页面或移除正在收集的数据。
```javascript
await page.setRequestInterception(true);
page.on('request', (request) => {
const blocked = new Set(['image', 'font', 'media']);
if (blocked.has(request.resourceType())) {
request.abort();
} else {
request.continue();
}
});
在导航之前注册请求处理程序。测试每次更改后返回的 DOM,而不是假设较低的字节数能保持正确性。
解决 Puppeteer 代理错误
Puppeteer 代理调试应从一个新的浏览器进程中的单个 IP 检查页面开始。
| 症状 | 可能的边界 | 检查 |
|---|
ERR_PROXY_CONNECTION_FAILED | 主机、端口、防火墙或不可用的网关 | 验证终端拼写和从工作者的连通性 |
ERR_INVALID_AUTH_CREDENTIALS 或 407 | 代理身份验证 | 在导航之前调用 page.authenticate() 并验证生成的凭证 |
| 页面加载但 IP 是直接的 | 代理参数缺失或绕过 | 打印启动参数并测试页面内部的 IP 端点 |
| 导航超时 | 慢路由、重页面、目标行为或被阻止的资源 | 测试轻量端点,故意增加超时并检查请求失败 |
| 空白或不完整提取 | 选择器已更改或 JavaScript 尚未完成 | 等待稳定的选择器或相关响应,而不是任意延迟 |
| 内存增长 | 浏览器或页面未关闭 | 使用 finally 块并限制同时工作者 |
| 页面之间会话中断 | 在有状态工作期间退出旋转 | 重用一个提供者会话和浏览器进行序列 |
负责任的网页抓取与 Puppeteer
Puppeteer 应仅为特定目的收集公共或授权数据。审查条款和机器人指导,适当时识别爬虫,尊重速率限制,最小化保留字段,并提供持续收集的删除或联系流程。
不要使用代理轮换来规避访问控制、CAPTCHA、账户限制或明确拒绝。如果一个站点提供所需信息的 API 或数据导出,优先选择该受支持的接口。
结论
在浏览器启动时设置 Puppeteer 代理,在导航之前对每个页面进行身份验证,并在 Chrome 中验证退出 IP。对于有状态的工作,保留一个代理会话,并且仅在独立任务需要不同出口时使用少量单独的浏览器工作者。可靠的抓取在很大程度上依赖于选择器、超时、生命周期清理和权限,正如它依赖于网络路由。
体验 Nstproxy — 今日开始您的免费试用
从一个无头浏览器和一个 IP 检查导航开始,然后将经过验证的代理会话转入一个有界的授权 Puppeteer 工作。
常见问题
在 puppeteer.launch() 的 args 数组中传递 --proxy-server=PROTOCOL://HOST:PORT。当代理端点更改时,启动一个新的浏览器进程。
问:我如何在 Puppeteer 中添加代理身份验证?
在第一次导航之前调用 page.authenticate({ username, password }) 以用于经过身份验证的 HTTP 代理。从受保护的运行时配置中加载这两个值。
问:每个 Puppeteer 页面可以使用不同的代理吗?
Chrome 的标准启动代理是跨浏览器的,因此不同的端点通常需要独立的浏览器进程。路由中介可以提供更细的控制,但它需要验证另一个组件。
问:为什么我的 Puppeteer 代理 IP 不改变?
启动参数可能缺失、格式不正确或被绕过,测试可能在浏览器上下文之外运行。请将Puppeteer页面本身导航到一个IP检查服务并检查结果。
不。对于相关页面、cookies和分页,请保持一个会话;仅在工作流程和目标政策允许的情况下,在独立的工作单元之间进行轮换。
合法性取决于数据、授权、合同、管辖权和预期用途。仅抓取公共或允许的页面,尽量减少数据,并遵循网站的适用规则。
Marcus Chen
Aug. 7th 2026
立即访问住宅、数据中心、IPv6 与 ISP 高质量代理池。