ProxyScrape + Puppeteer:如何通过 HTTP 和 SOCKS5 代理路由 Node.js 爬虫
一份分步指南,介绍如何在 Puppeteer 中配置 ProxyScrape 住宅和数据中心代理,包括 HTTP 代理的身份验证以及 SOCKS5 的本地中继。
概述
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 项目
- 创建一个新目录并初始化项目:
mkdir puppeteer-proxyscrape && cd puppeteer-proxyscrape npm init -y - 安装 Puppeteer:
这会下载兼容的 Chromium 构建。npm install puppeteer
步骤 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 代理。
-
安装
gost(一个简单的代理中继)。在 macOS 上使用 Homebrew:brew install gost在 Linux 上,从 gost 发布页面 下载二进制文件。 在 Windows 上,从同一页面下载
.exe。 -
启动
gost,使用 HTTP 监听器和 SOCKS5 转发器:gost -L http://:8080 -F socks5://your-username:[email protected]:1080将用户名、密码、主机和端口替换为你的 ProxyScrape SOCKS5 详细信息。
-
将 Puppeteer 指向本地 HTTP 中继:
const browser = await puppeteer.launch({ args: ['--proxy-server=http://127.0.0.1:8080'] });不需要
page.authenticate(),因为本地中继处理身份验证。 -
使用相同的
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。