Skip to content
Intermediate / 2 min read

如何在 Node.js 中使用 ProxyScrape 住宅代理与 Puppeteer 进行网页抓取

一份逐步指南,介绍如何在 Node.js 中将 ProxyScrape 住宅代理和数据中心代理与 Puppeteer 集成。学习 HTTP 代理配置、身份验证、轮换以及用于高级抓取的 SOCKS5 桥接。

Windows macOS Linux 网页抓取

概述

ProxyScrape 提供住宅、数据中心和移动代理,支持 HTTP 和 SOCKS5。当与 Puppeteer(一个用于 Node.js 的无头 Chrome 浏览器)结合使用时,您可以通过一个拥有 9700 万+ IP 的池路由流量,从而大规模自动化网页抓取。本教程向您展示如何在 Puppeteer 中配置 ProxyScrape 代理、进行身份验证、轮换 IP 以及处理常见错误。

先决条件

  • 已安装 Node.js 16 或更高版本。您可以从 Node.js 官方网站下载。
  • 一个拥有住宅或数据中心代理的 ProxyScrape 帐户。免费试用或付费计划均可。
  • 基本熟悉 JavaScript 和命令行。

第 1 步:创建一个新的 Node.js 项目

打开终端并运行:

mkdir puppeteer-proxyscrape
cd puppeteer-proxyscrape
npm init -y
npm install puppeteer

这将创建一个项目文件夹并安装 Puppeteer。请注意,Puppeteer 会自动下载兼容的 Chromium 版本。

第 2 步:获取您的 ProxyScrape 代理详细信息

登录您的 ProxyScrape 仪表板。导航到代理列表部分。您将看到每种代理类型的连接详细信息:

  • 住宅代理:轮换或粘性会话,使用用户名/密码身份验证。
  • 数据中心代理:静态 IP,同样需要身份验证。

请注意您所选代理的以下信息:

  • 主机(例如 gateway.proxyscrape.com — 请查看您的仪表板以获取确切主机)
  • 端口(例如 HTTP 为 8000,SOCKS5 为 1080 — 同样,在仪表板中确认)
  • 用户名
  • 密码

ProxyScrape 通常提供 HTTP 和 SOCKS5 端点。在本教程中,我们将从 HTTP 开始。

第 3 步:使用 HTTP 代理启动 Puppeteer

创建一个名为 scrape.js 的文件,并添加以下代码。将占位符替换为您的实际代理详细信息。

const puppeteer = require('puppeteer');

(async () => {
  const proxyHost = 'gateway.proxyscrape.com';
  const proxyPort = '8000';
  const proxyUser = 'your_username';
  const proxyPass = 'your_password';

  const browser = await puppeteer.launch({
    headless: true,
    args: [
      `--proxy-server=http://${proxyHost}:${proxyPort}`
    ]
  });

  const page = await browser.newPage();

  // 使用代理进行身份验证
  await page.authenticate({
    username: proxyUser,
    password: proxyPass
  });

  // 验证代理 IP
  await page.goto('https://httpbin.org/ip', { waitUntil: 'networkidle0' });
  const content = await page.content();
  console.log(content);

  await browser.close();
})();

运行脚本:

node scrape.js

您应该看到代理使用的 IP 地址,而不是您的真实 IP。

第 4 步:使用列表轮换代理

ProxyScrape 住宅代理通常支持通过使用不同的用户名或会话 ID 来轮换会话。一种常见模式是循环遍历代理端点列表。以下是在两个代理之间轮换的示例。

const proxies = [
  { host: 'gateway.proxyscrape.com', port: '8000', user: 'user1', pass: 'pass1' },
  { host: 'gateway.proxyscrape.com', port: '8000', user: 'user2', pass: 'pass2' }
];

(async () => {
  for (const proxy of proxies) {
    const browser = await puppeteer.launch({
      headless: true,
      args: [`--proxy-server=http://${proxy.host}:${proxy.port}`]
    });
    const page = await browser.newPage();
    await page.authenticate({ username: proxy.user, password: proxy.pass });

    await page.goto('https://httpbin.org/ip');
    const ip = await page.evaluate(() => document.body.innerText);
    console.log(`Proxy IP: ${ip}`);

    await browser.close();
  }
})();

对于大规模轮换,考虑使用代理管理器或类似 proxy-chain 的库来集中处理身份验证和轮换。

第 5 步:在 Puppeteer 中使用 SOCKS5 代理(高级)

Puppeteer 背后的浏览器 Chromium 本身不支持经过身份验证的 SOCKS5 代理。如果您必须使用 ProxyScrape 的 SOCKS5 端点,可以运行一个本地 HTTP 代理,将请求转发到 SOCKS5。一种选择是使用 proxy-chain npm 包。

安装它:

npm install proxy-chain

然后创建一个本地代理服务器:

const ProxyChain = require('proxy-chain');

(async () => {
  const socksUrl = 'socks5://username:[email protected]:1080';
  const localHttpProxy = await ProxyChain.anonymizeProxy(socksUrl);
  console.log(`Local HTTP proxy: ${localHttpProxy}`);

  // 在 Puppeteer 中将 localHttpProxy 作为 --proxy-server 传递
  const browser = await puppeteer.launch({
    headless: true,
    args: [`--proxy-server=${localHttpProxy}`]
  });

  const page = await browser.newPage();
  await page.goto('https://httpbin.org/ip');
  console.log(await page.content());
  await browser.close();
})();

这将经过身份验证的 SOCKS5 桥接到 Chromium 可以使用的未经身份验证的本地 HTTP 代理。

故障排除

  • ERR_PROXY_CONNECTION_FAILED:检查主机和端口。如果您使用基于 IP 的身份验证,请确保您的 IP 已列入白名单。ProxyScrape 默认使用用户名/密码,但请仔细检查您的仪表板。
  • 身份验证弹出窗口 / 407 错误:确保在导航之前调用 page.authenticate()。
  • 响应缓慢:尝试使用数据中心代理以提高速度,或使用住宅代理以提高隐蔽性。调整 Puppeteer 中的超时时间。
  • SOCKS5 不工作:请记住,Chromium 不直接支持 SOCKS5 身份验证。使用上面的 proxy-chain 解决方法。

总结

您已经学习了如何在 Node.js 中配置 ProxyScrape 住宅和数据中心代理与 Puppeteer。我们涵盖了 HTTP 代理设置、身份验证、轮换以及用于高级用例的 SOCKS5 桥接。对于可靠的基础设施,ProxyScrape 的 9700 万+ IP 池和稳定的正常运行时间使其成为网页抓取项目的可靠选择。