为什么 Puppeteer 需要代理
Puppeteer 的代理功能允许该工具通过不同的 IP 地址建立连接,而不是始终使用运行它的机器的 IP 地址。这对于基于位置的任务、测试、监控以及其他需要考虑连接来源的任务非常有用。
Puppeteer 仍负责处理主要任务,而代理则负责处理连接的来源。

Carl Gamutan
更新于:2026年10月7日
发布于:2022年4月8日
Puppeteer 是一个 Node.js 库,为用户提供了一个高级的无界面 Chrome API。下面介绍如何为其创建一个代理服务器!
Puppeteer 的代理功能允许该工具通过不同的 IP 地址建立连接,而不是始终使用运行它的机器的 IP 地址。这对于基于位置的任务、测试、监控以及其他需要考虑连接来源的任务非常有用。
Puppeteer 仍负责处理主要任务,而代理则负责处理连接的来源。
如果没有代理,网站会持续检测到同一个IP地址。随着活动量的增加,该IP可能会触发速率限制或被封禁。
地理位置同样重要。从德国访问的页面可能与从美国访问的页面显示的内容不同。
Puppeteer 代理可让您在需要时通过不同的 IP 地址和地理位置进行连接。
合适的代理类型取决于具体任务。
| 代理类型 | 数据抓取 | 账户管理 | 测试 | 监控 |
|---|---|---|---|---|
| 住宅型 | 当地理位置和 IP 来源重要时适用 | 账户需要住宅 IP 时有用 | 适用于基于地理位置的测试 | 用于检查不同地理位置的内容 |
| ISP | 需要稳定 IP 时适用 | 适合在单个 IP 上进行较长时间的会话 | 适合使用固定 IP 进行测试 | 适合从同一 IP 进行持续检查 |
| 数据中心 | 适合追求速度和较大请求量 | 当不需要住宅 IP 时更佳 | 适合常规测试 | 适合频繁的自动化检查 |
当 IP 来源和位置至关重要时,住宅代理非常有用。当需要同一 IP 保持更长时间的活跃状态时,ISP 代理表现出色。当主要关注速度和规模时,数据中心代理是理想选择。
最佳选择还取决于任务是否需要地理定位、稳定的连接,或是访问更大的IP池。
Puppeteer 的代理配置需要 Geonode 中的主机、端口、用户名和密码。请将这些凭据保存在环境变量中,然后在代码中配置代理时加载它们。
对于 Puppeteer,在启动浏览器时,通过 ``--proxy-server`
` 传递代理主机和端口:
import puppeteer from "puppeteer";
import "dotenv/config";
const browser = await puppeteer.launch({
headless: true,
args: [
`--proxy-server=http://${process.env.GEONODE_PROXY_HOST}:${process.env.GEONODE_PROXY_PORT}`,
],
});
然后创建页面并提供代理凭据:
const page = await browser.newPage();
await page.authenticate({
username: process.env.GEONODE_PROXY_USER,
password: process.env.GEONODE_PROXY_PASS,
});
请将实际的用户名和密码保存在环境变量中,而不是直接写在源文件里。在我们的测试中,此配置成功通过代理返回了 HTTP 200 状态码。
Geonode
可获取四个值:
proxy.geonode.io:PORT:USERNAME:PASSWORD
对于 Puppeteer,请将这些值分开存储。将其存储在环境变量中:
GEONODE_PROXY_HOST=proxy.geonode.io
GEONODE_PROXY_PORT=9000
GEONODE_PROXY_USER=USERNAME
GEONODE_PROXY_PASS=PASSWORD
通过 --proxy-server
加载主机和端口,然后对页面进行身份验证:
const browser = await puppeteer.launch({
headless: true,
args: [
`--proxy-server=http://${process.env.GEONODE_PROXY_HOST}:${process.env.GEONODE_PROXY_PORT}`,
],
});
const page = await browser.newPage();
await page.authenticate({
username: process.env.GEONODE_PROXY_USER,
password: process.env.GEONODE_PROXY_PASS,
});
我们使用有效的凭据进行了测试,并收到了 HTTP 200 响应。当密码错误时,代理返回了 HTTP 407 状态码以及:
Authentication error. Please check your authentication settings.
如果请求无需保持相同的 IP 地址,请使用 IP 轮换。
在本次测试中,我们通过 HTTP 轮换端口启动了 Puppeteer:
const browser = await puppeteer.launch({
headless: true,
args: ["--proxy-server=http://proxy.geonode.io:9000"],
});
const page = await browser.newPage();
await page.authenticate({
username: process.env.GEONODE_PROXY_USER,
password: process.env.GEONODE_PROXY_PASS,
});
。我们使用新的浏览器会话发起了五次请求:
Request 1: 108.31.182.167
Request 2: 45.186.93.125
Request 3: 109.254.131.42
Request 4: 109.153.11.141
Request 5: 37.113.173.139
。唯一 IP 地址数:5
IP 轮换:是
在此测试中,所有五个请求返回的 IP 地址均不相同。这证实了轮询功能在本次运行中有效,但不能保证未来的每个请求都会获得新的 IP 地址。
如果相关请求需要保持相同的 IP 地址,请改用粘性会话。使用粘性端口,并将会话详细信息添加到用户名中:
const browser = await puppeteer.launch({
headless: true,
args: ["--proxy-server=http://proxy.geonode.io:10000"],
});
const page = await browser.newPage();
await page.authenticate({
username:
`${process.env.GEONODE_PROXY_USER}-session-blogpuppeteer01-lifetime-10`,
password: process.env.GEONODE_PROXY_PASS,
});
我们使用同一会话发起了三个请求:
Request 1: 178.64.64.40
Request 2: 178.64.64.40
Request 3: 178.64.64.40
IP 地址相同:是
这三个请求均使用了相同的 IP 地址。
有关可用设置,请参阅 Geonode
如果代理无法正常工作,请先检查连接信息。先核对用户名和密码,然后检查主机、端口和协议。Puppeteer 返回的错误信息通常有助于缩小问题范围。
407 错误通常表明存在身份验证问题。
当我们在测试 Puppeteer 时使用了错误的密码,代理返回了以下响应:
HTTP status: 407
Authentication error. Please check your authentication settings.
请先检查用户名和密码。如果它们正确,请确保在创建页面后调用了 page.authenticate()。
连接错误通常意味着 Puppeteer 无法连接到代理服务器。
请先检查主机名和端口。然后确保协议与所使用的代理服务器匹配。
在我们的连接失败测试中,Puppeteer 并未返回 ERR_TUNNEL_CONNECTION_FAILED
。当使用无法连接的代理端口时,返回结果为:
net::ERR_CONNECTION_RESET at http://ip-api.com/json
。因此,根据连接失败的具体情况,Chromium 返回的错误信息可能会有所不同。
超时是指页面在配置的时间内未收到响应。
首先,请检查目标 URL 是否正常,以及代理是否能连接。如果两者均正常,请检查传递给 ``page.goto()`
` 的超时时间。
在我们的测试中,我们使用了一个超时时间为 5 秒的不可路由代理:
await page.goto(url, {
timeout: 5000,
});
。Puppeteer 返回的结果为:
TimeoutError: Navigation timeout of 5000 ms exceeded
。设置显式超时时间有助于在代理连接挂起时让脚本快速失败。
我们发现的一个与Puppeteer相关的问题是,将用户名和密码直接写入--proxy-server
中。
此配置失败:
--proxy-server=http://USERNAME:PASSWORD@proxy.geonode.io:9000
Puppeteer 返回:
net::ERR_NO_SUPPORTED_PROXIES
解决方法是仅通过启动参数传递代理服务器:
args: ["--proxy-server=http://proxy.geonode.io:9000"]
然后单独进行身份验证:
await page.authenticate({
username: process.env.GEONODE_PROXY_USER,
password: process.env.GEONODE_PROXY_PASS,
});
修改配置后,请求成功返回 HTTP 200 状态码。
Puppeteer 负责处理应用程序中的请求或连接。Geonode 负责处理代理连接。
您可以根据具体任务选择家庭、ISP 或数据中心代理,并在需要时使用轮询、粘性会话和地理定位功能。这样可以将代理配置与应用程序的其他代码分离。
套餐根据代理类型而异,部分选项按 GB 计费。
常见问题解答
在我们测试的 Puppeteer 配置中,需要身份验证的 SOCKS5 无法正常工作。
我们尝试了 Geonode 提供的 SOCKS5 轮换端口,并使用 page.authenticate(),但 Puppeteer 返回了以下错误:
net::ERR_SOCKS_CONNECTION_FAILED
我们还尝试将凭据嵌入到 --proxy-server 中,结果返回:
net::ERR_NO_SUPPORTED_PROXIES
由于所有测试过的需要身份验证的 SOCKS5 配置均未成功,因此使用 --proxy-server 和 page.authenticate() 的经过验证的 HTTP 配置是此场景下更安全的选择。
是的,如果通过轮换代理配置启动浏览器,Puppeteer 可以使用轮换代理。
在我们的测试中,五个新的浏览器会话返回了五个不同的 IP 地址。这证实了测试期间确实发生了 IP 轮换,但不能保证每个请求或浏览器会话都会获得不同的 IP 地址。
有。Geonode 提供免费试用,因此您可以在升级到付费套餐之前,先使用 Puppeteer 测试该代理。查看当前的免费试用和套餐。
在 ``puppeteer.launch()`
中使用 ``--proxy-server
` 设置代理主机和端口。
然后在创建每个页面后调用 ``page.authenticate()`
` 来提供用户名和密码:
const browser = await puppeteer.launch({
args: ["--proxy-server=http://proxy.geonode.io:9000"],
});
const page = await browser.newPage();
await page.authenticate({
username: process.env.GEONODE_PROXY_USER,
password: process.env.GEONODE_PROXY_PASS,
});
这是我们在测试中验证有效的配置。
不应该。在使用此 Puppeteer 配置时,请将凭据单独保存。
在我们的测试中,将 USERNAME:PASSWORD@ 直接嵌入到 --proxy-server 中,返回了 ERR_NO_SUPPORTED_PROXIES。而仅在该处传入主机名和端口,然后使用 page.authenticate() 提供凭据,则能成功运行。