Geonode logo
Carl Gamutan

Carl Gamutan

更新于:2026年10月7日

发布于:2022年4月8日

如何在 Puppeteer 中使用代理

Puppeteer 是一个 Node.js 库,为用户提供了一个高级的无界面 Chrome API。下面介绍如何为其创建一个代理服务器!

为什么 Puppeteer 需要代理

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

Puppeteer 仍负责处理主要任务,而代理则负责处理连接的来源。

没有代理会怎样:IP封禁、速率限制、地理限制

如果没有代理,网站会持续检测到同一个IP地址。随着活动量的增加,该IP可能会触发速率限制或被封禁。

地理位置同样重要。从德国访问的页面可能与从美国访问的页面显示的内容不同。

Puppeteer 代理可让您在需要时通过不同的 IP 地址和地理位置进行连接。

Puppeteer 应使用哪种代理类型

合适的代理类型取决于具体任务。

代理类型数据抓取账户管理测试监控
住宅型当地理位置和 IP 来源重要时适用账户需要住宅 IP 时有用适用于基于地理位置的测试用于检查不同地理位置的内容
ISP需要稳定 IP 时适用适合在单个 IP 上进行较长时间的会话适合使用固定 IP 进行测试适合从同一 IP 进行持续检查
数据中心适合追求速度和较大请求量当不需要住宅 IP 时更佳适合常规测试适合频繁的自动化检查

当 IP 来源和位置至关重要时,住宅代理非常有用。当需要同一 IP 保持更长时间的活跃状态时,ISP 代理表现出色。当主要关注速度和规模时,数据中心代理是理想选择。

最佳选择还取决于任务是否需要地理定位、稳定的连接,或是访问更大的IP池。

如何在 Puppeteer 中连接代理

Puppeteer 的代理配置需要 Geonode 中的主机、端口、用户名和密码。请将这些凭据保存在环境变量中,然后在代码中配置代理时加载它们。

使用 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 状态码。

认证格式为 host:port:user:pass,访问

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.

Puppeteer 中的 IP 轮换与粘性会话

如果请求无需保持相同的 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 中常见的代理错误及解决方法

如果代理无法正常工作,请先检查连接信息。先核对用户名和密码,然后检查主机、端口和协议。Puppeteer 返回的错误信息通常有助于缩小问题范围。

407 需要代理身份验证

407 错误通常表明存在身份验证问题。

当我们在测试 Puppeteer 时使用了错误的密码,代理返回了以下响应:

HTTP status: 407
Authentication error. Please check your authentication settings.

请先检查用户名和密码。如果它们正确,请确保在创建页面后调用了 page.authenticate()。

ERR_TUNNEL_CONNECTION_FAILED / 连接被拒绝

连接错误通常意味着 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

。设置显式超时时间有助于在代理连接挂起时让脚本快速失败。

ERR_NO_SUPPORTED_PROXIES

我们发现的一个与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:您将获得什么

Puppeteer 负责处理应用程序中的请求或连接。Geonode 负责处理代理连接。

您可以根据具体任务选择家庭、ISP 或数据中心代理,并在需要时使用轮询、粘性会话和地理定位功能。这样可以将代理配置与应用程序的其他代码分离。

套餐根据代理类型而异,部分选项按 GB 计费。

常见问题解答

Puppeteer 是否支持 SOCKS5 代理?

在我们测试的 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 地址?

是的,如果通过轮换代理配置启动浏览器,Puppeteer 可以使用轮换代理。

在我们的测试中,五个新的浏览器会话返回了五个不同的 IP 地址。这证实了测试期间确实发生了 IP 轮换,但不能保证每个请求或浏览器会话都会获得不同的 IP 地址。

有免费试用吗?

有。Geonode 提供免费试用,因此您可以在升级到付费套餐之前,先使用 Puppeteer 测试该代理。查看当前的免费试用和套餐。

在 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,
});

这是我们在测试中验证有效的配置。

我应该将代理用户名和密码填入 --proxy-server 参数中吗?

不应该。在使用此 Puppeteer 配置时,请将凭据单独保存。

在我们的测试中,将 USERNAME:PASSWORD@ 直接嵌入到 --proxy-server 中,返回了 ERR_NO_SUPPORTED_PROXIES。而仅在该处传入主机名和端口,然后使用 page.authenticate() 提供凭据,则能成功运行。