Skip to content
Intermediate / 2 min read

ProxyScrape + Puppeteer:如何通过 HTTP 和 SOCKS5 代理路由 Node.js 爬虫

一份分步指南,介绍如何在 Puppeteer 中配置 ProxyScrape 住宅和数据中心代理,包括 HTTP 代理的身份验证以及 SOCKS5 的本地中继。

Windows macOS Linux 网页抓取

概述

Puppeteer 是一个 Node.js 库,用于控制无头 Chrome 或 Chromium。在进行大规模抓取时,通过代理路由请求对于避免 IP 封禁和访问受地理限制的内容至关重要。本教程展示如何在 Puppeteer 中为 HTTP 和 SOCKS5 两种协议配置 ProxyScrape 住宅和数据中心代理。由于 Chromium 不直接支持需要身份验证的 SOCKS5 代理,你还将学习如何使用 gost 设置本地中继,以将 HTTP 身份验证桥接到 SOCKS5。

先决条件

  • 在 Windows、macOS 或 Linux 上安装 Node.js 18 或更高版本。
  • 拥有包含住宅或数据中心代理的 ProxyScrape 账户。从 ProxyScrape 仪表板记录你的代理主机、端口、用户名和密码。
  • 基本熟悉 JavaScript 和命令行。

步骤 1:设置新的 Node.js 项目

  1. 创建一个新目录并初始化项目:
    mkdir puppeteer-proxyscrape && cd puppeteer-proxyscrape
    npm init -y
    
  2. 安装 Puppeteer:
    npm install puppeteer
    
    这会下载兼容的 Chromium 构建。

步骤 2:配置带身份验证的 HTTP 代理

ProxyScrape HTTP 代理支持用户名/密码身份验证。Puppeteer 可以使用 page.authenticate() 方法传递代理凭据。

创建一个名为 http-proxy.js 的文件:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    headless: true,
    args: [
      '--proxy-server=http://proxy.proxyscrape.com:12345' // 替换为你的 ProxyScrape 主机和端口
    ]
  });

  const page = await browser.newPage();

  // 替换为你的 ProxyScrape 用户名和密码
  await page.authenticate({
    username: 'your-username',
    password: 'your-password'
  });

  await page.goto('https://httpbin.org/ip', { waitUntil: 'networkidle2' });
  const content = await page.content();
  console.log(content);

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

运行脚本:

node http-proxy.js

输出应显示代理 IP,以确认设置成功。

步骤 3:为每个请求轮换 HTTP 代理

对于大规模抓取,为每个页面或请求轮换代理。维护一个代理数组,并随机或按顺序选择一个。

const proxies = [
  { host: 'proxy1.proxyscrape.com', port: 12345, username: 'user', password: 'pass' },
  { host: 'proxy2.proxyscrape.com', port: 12345, username: 'user', password: 'pass' }
];

function getRandomProxy() {
  return proxies[Math.floor(Math.random() * proxies.length)];
}

(async () => {
  const proxy = getRandomProxy();
  const browser = await puppeteer.launch({
    args: [`--proxy-server=http://${proxy.host}:${proxy.port}`]
  });
  const page = await browser.newPage();
  await page.authenticate({ username: proxy.username, password: proxy.password });
  await page.goto('https://httpbin.org/ip');
  // ...
  await browser.close();
})();

如果你的 ProxyScrape 套餐提供轮换端点(即单个 host:port 会按每个请求轮换 IP),请使用该端点,而不是管理列表。

步骤 4:通过本地中继使用 SOCKS5 代理

Chromium 支持 SOCKS5 代理,但不支持对其使用用户名/密码身份验证。要使用带身份验证的 ProxyScrape SOCKS5 代理,请运行一个本地中继,该中继接受无需认证的 HTTP 并转发到已认证的 SOCKS5 代理。

  1. 安装 gost(一个简单的代理中继)。在 macOS 上使用 Homebrew:

    brew install gost
    

    在 Linux 上,从 gost 发布页面 下载二进制文件。 在 Windows 上,从同一页面下载 .exe。

  2. 启动 gost,使用 HTTP 监听器和 SOCKS5 转发器:

    gost -L http://:8080 -F socks5://your-username:[email protected]:1080
    

    将用户名、密码、主机和端口替换为你的 ProxyScrape SOCKS5 详细信息。

  3. 将 Puppeteer 指向本地 HTTP 中继:

    const browser = await puppeteer.launch({
      args: ['--proxy-server=http://127.0.0.1:8080']
    });
    

    不需要 page.authenticate(),因为本地中继处理身份验证。

  4. 使用相同的 httpbin.org/ip 检查进行测试。

步骤 5:验证代理是否正常工作

使用可靠的 IP 回显服务来确认代理处于活动状态,并且没有泄露你的真实 IP:

await page.goto('https://api.ipify.org?format=json');
const body = await page.evaluate(() => document.body.innerText);
console.log(JSON.parse(body).ip);

将返回的 IP 与你实际的 IP 进行比较。

故障排除

  • 407 需要代理身份验证:确保在 page.goto() 之前调用 page.authenticate()。对于 SOCKS5,确认中继凭据正确。
  • ERR_PROXY_CONNECTION_FAILED:检查代理主机和端口。对于 SOCKS5,确保 gost 中继正在运行且可访问。
  • SSL 错误:某些代理可能不支持 HTTPS 隧道。对 HTTPS 目标使用 HTTP 代理,或验证你的 SOCKS5 代理支持 CONNECT。
  • 响应缓慢:住宅代理可能较慢。使用 page.setDefaultNavigationTimeout(60000) 增加超时时间。
  • IP 未更改:如果使用静态代理列表,确认轮换逻辑。如果使用轮换端点,检查 ProxyScrape 轮换是否在你的仪表板中启用。

总结

你已成功配置 ProxyScrape HTTP 和 SOCKS5 代理与 Puppeteer 配合使用。对于 HTTP 代理,使用 --proxy-server 和 page.authenticate()。对于 SOCKS5,使用 gost 运行本地中继来处理身份验证。为每个请求轮换代理以分散流量并避免封锁。在启动大规模抓取之前,始终验证你的出口 IP。