Skip to content
Advanced / 3 min read

在 Windows 上使用 Dataimpulse 住宅代理和 Puppeteer 进行高级网页抓取

了解如何在 Windows 上将 Dataimpulse 轮换住宅代理与 Puppeteer 集成,以进行大批量、高级网页抓取。本指南涵盖设置、认证、代理轮换和并发处理。

Windows HTTP(S) 网页抓取

概述

Puppeteer 是一个强大的 Node.js 库,用于控制无头 Chrome。将其与 Dataimpulse 的轮换住宅代理结合使用时,你可以在不被封锁的情况下抓取大型网站。本教程向你展示如何在 Windows 上设置 Puppeteer 以使用 Dataimpulse 住宅代理、处理认证,并为大批量抓取实现高效的轮换。

先决条件

  • Windows 10 或更高版本。
  • 已安装 Node.js 14+(从 Node.js 官方网站下载)。
  • 拥有包含住宅代理凭证(用户名、密码、端点)的 Dataimpulse 账户。
  • 基本了解 JavaScript 和 async/await。

步骤 1:安装 Node.js 和 Puppeteer

如果尚未安装,请从官方网站安装 Node.js。然后创建一个新的项目文件夹并安装 Puppeteer。

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

步骤 2:获取 Dataimpulse 代理凭证

登录你的 Dataimpulse 仪表板并导航到住宅代理部分。你将找到:

  • 端点:主机和端口,例如 proxy.dataimpulse.com:12321(请检查你的仪表板以获取确切信息)。
  • 用户名:你的 Dataimpulse 用户名。
  • 密码:你的 Dataimpulse 密码。

Dataimpulse 使用轮换网关,因此通过此端点发出的每个请求都将使用池中的不同 IP(除非你使用粘性会话端口)。在本教程中,我们将使用轮换端点。

步骤 3:配置 Puppeteer 以使用代理认证

Puppeteer 可以在启动浏览器时通过传递 --proxy-server 参数来使用代理。认证通过 page.authenticate() 处理。创建一个文件 scrape.js:

const puppeteer = require('puppeteer');

const PROXY_HOST = 'YOUR_ENDPOINT_HOST'; // 替换为你的 Dataimpulse 代理主机
const PROXY_PORT = 'YOUR_ENDPOINT_PORT'; // 替换为你的 Dataimpulse 代理端口
const PROXY_USER = 'your_username';
const PROXY_PASS = 'your_password';

(async () => {
  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', { waitUntil: 'networkidle0' });
  const content = await page.content();
  console.log(content); // 应显示代理 IP

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

使用 node scrape.js 运行脚本。你应该会看到一个不是你自己的 IP 地址,确认代理正在工作。

步骤 4:实现轮换代理逻辑

由于 Dataimpulse 的端点会自动轮换 IP,你可以通过同一个浏览器实例发出多个请求,而每个请求都将使用不同的 IP。然而,为了更好地控制并避免被检测,你可以关闭并重新打开浏览器,或使用隐身上下文。以下是一个通过轮换抓取多个页面的示例:

const puppeteer = require('puppeteer');

const PROXY_HOST = 'YOUR_ENDPOINT_HOST';
const PROXY_PORT = 'YOUR_ENDPOINT_PORT';
const PROXY_USER = 'your_username';
const PROXY_PASS = 'your_password';

async function scrapeWithRotation(urls) {
  const browser = await puppeteer.launch({
    headless: true,
    args: [`--proxy-server=http://${PROXY_HOST}:${PROXY_PORT}`],
  });

  const results = [];
  for (const url of urls) {
    const page = await browser.newPage();
    await page.authenticate({ username: PROXY_USER, password: PROXY_PASS });
    try {
      await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
      const title = await page.title();
      results.push({ url, title });
    } catch (error) {
      console.error(`Error scraping ${url}:`, error.message);
    } finally {
      await page.close();
    }
  }

  await browser.close();
  return results;
}

const urls = [
  'https://example.com',
  'https://example.org',
  'https://example.net',
];

scrapeWithRotation(urls).then(console.log);

每个新页面都将使用 Dataimpulse 池中的轮换 IP。

步骤 5:处理并发和错误

对于大批量抓取,你需要优雅地处理并发和错误。使用 puppeteer-cluster 在遵守内存限制的同时并行管理多个页面。

npm install puppeteer-cluster
const { Cluster } = require('puppeteer-cluster');

const PROXY_HOST = 'YOUR_ENDPOINT_HOST';
const PROXY_PORT = 'YOUR_ENDPOINT_PORT';
const PROXY_USER = 'your_username';
const PROXY_PASS = 'your_password';

(async () => {
  const cluster = await Cluster.launch({
    concurrency: Cluster.CONCURRENCY_PAGE,
    maxConcurrency: 5, // 根据你的资源进行调整
    puppeteerOptions: {
      headless: true,
      args: [`--proxy-server=http://${PROXY_HOST}:${PROXY_PORT}`],
    },
  });

  cluster.on('taskerror', (err, data) => {
    console.error(`Error scraping ${data}:`, err.message);
  });

  await cluster.task(async ({ page, data: url }) => {
    await page.authenticate({ username: PROXY_USER, password: PROXY_PASS });
    await page.goto(url, { waitUntil: 'domcontentloaded' });
    const title = await page.title();
    console.log(`Scraped ${url} - Title: ${title}`);
  });

  const urls = [
    'https://example.com',
    'https://example.org',
    'https://example.net',
    // 添加更多 URL
  ];

  for (const url of urls) {
    cluster.queue(url);
  }

  await cluster.idle();
  await cluster.close();
})();

此设置允许你在利用 Dataimpulse 轮换代理的同时并发抓取多个页面。

步骤 6:测试与验证

运行你的脚本并验证:

  • IP 地址在请求之间发生变化(使用 https://httpbin.org/ip 检查)。
  • 没有发生代理认证错误。
  • 目标页面正确加载。

你还可以记录每个请求所使用的 IP,以确保轮换正在工作。

故障排除

  • 407 Proxy Authentication Required:请仔细检查你的用户名和密码。确保你使用的是正确的认证方法(page.authenticate())。
  • 连接超时:增加 page.goto() 中的 timeout 选项。同时,确保你的代理端点和端口正确。
  • 浏览器启动因代理错误而失败:确保 --proxy-server 参数使用正确的格式:http://host:port(URL 中不带凭证)。
  • 轮换不起作用:Dataimpulse 的轮换端点应为每个新连接提供一个新的 IP。如果你需要粘性会话,请使用仪表板中提供的专用粘性端口。

总结

你已经学习了如何在 Windows 上将 Dataimpulse 住宅代理与 Puppeteer 集成以进行高级网页抓取。通过利用 Puppeteer 的代理认证和 Dataimpulse 的轮换 IP 池,你可以构建可扩展的抓取器,避免 IP 封锁。请记住处理错误、管理并发,并遵守网站的服务条款。