如何在 Node.js 中使用 ProxyScrape 住宅代理与 Puppeteer 进行网页抓取
一份逐步指南,介绍如何在 Node.js 中将 ProxyScrape 住宅代理和数据中心代理与 Puppeteer 集成。学习 HTTP 代理配置、身份验证、轮换以及用于高级抓取的 SOCKS5 桥接。
概述
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 池和稳定的正常运行时间使其成为网页抓取项目的可靠选择。