Skip to content
Advanced / 2 min read

使用 ChangeMyIP 住宅代理和 Playwright 进行高级网页抓取

将 ChangeMyIP 的轮换住宅代理与 Playwright 结合,大规模抓取动态网站。本高级教程涵盖按请求轮换 IP、浏览器指纹规避以及稳健的错误处理。

SOCKS5 网页抓取 隐私/匿名性

概述

Playwright 是一个强大的浏览器自动化库,支持 Chromium、Firefox 和 WebKit。与 ChangeMyIP 住宅代理结合使用时,它成为进行高级网页抓取的稳健工具,可以绕过地理限制和速率限制。本教程涵盖设置 Playwright 与 ChangeMyIP 轮换住宅代理、实现按请求轮换 IP、管理浏览器指纹以及处理动态内容。

先决条件

  • Node.js 16+ 和 npm
  • 拥有住宅代理访问权限的 ChangeMyIP 账户(如果更喜欢,也可以使用数据中心代理)
  • JavaScript/Node.js 基础知识

了解 ChangeMyIP 住宅代理端点

ChangeMyIP 在 40 多个国家/地区提供住宅代理。你可以使用用户名/密码进行认证。HTTP 代理的端点格式为:

http://<username>:<password>@<proxy-host>:<port>

对于 SOCKS5:

socks5://<username>:<password>@<proxy-host>:<port>

将占位符替换为 ChangeMyIP 仪表板中的凭据。轮换住宅代理默认会为每个请求分配一个新 IP,或者你可以通过在用户名中使用会话 ID 来维持粘性会话(请查阅 ChangeMyIP 文档)。本教程假设使用轮换模式。

第 1 步:设置 Playwright 项目

  1. 创建一个新目录并初始化 npm:
mkdir changeMyIP-playwright-scraper
cd changeMyIP-playwright-scraper
npm init -y
  1. 安装 Playwright 及其依赖项:
npm install playwright
npx playwright install

第 2 步:配置 Playwright 使用 ChangeMyIP 代理

创建文件 scraper.js 并添加以下代码。这会使用你的 ChangeMyIP 代理启动 Chromium 浏览器:

const { chromium } = require('playwright');

const proxyUrl = 'http://username:password@proxy-host:port'; // 替换为你的 ChangeMyIP 详细信息

(async () => {
  const browser = await chromium.launch({
    proxy: {
      server: proxyUrl,
    },
  });
  const page = await browser.newPage();
  await page.goto('https://httpbin.org/ip');
  const content = await page.textContent('body');
  console.log(content);
  await browser.close();
})();

使用 node scraper.js 运行它。你应该会看到代理 IP,而不是你的真实 IP。

第 3 步:实现按请求轮换代理

对于高级抓取,你可能希望每个页面或请求都使用新的 IP。由于 ChangeMyIP 住宅代理默认会在每个请求时轮换,你可以简单地为每个抓取任务创建一个新的浏览器上下文。如果需要强制使用新 IP,可以启动新的浏览器实例或使用新的代理会话。

以下是一个每次使用新 IP 抓取 URL 的函数:

async function scrapeWithNewIP(url) {
  const browser = await chromium.launch({
    proxy: { server: proxyUrl },
  });
  const page = await browser.newPage();
  await page.goto(url, { waitUntil: 'networkidle' });
  const data = await page.evaluate(() => document.body.innerText);
  await browser.close();
  return data;
}

为每个目标 URL 调用此函数。为了提高效率,可以重用浏览器,并使用不同的代理创建新的上下文(如果你的套餐允许多个端点)。否则,对于中等规模,启动新浏览器是可以接受的。

第 4 步:管理浏览器指纹以避免被封禁

反机器人系统会检测自动化。每个会话随机化浏览器属性。Playwright 允许设置用户代理、视口、时区等。可以使用 playwright-extra 和 puppeteer-extra-plugin-stealth 这样的库(通过 playwright-extra 与 Playwright 兼容)。或者手动设置请求头。

示例:使用自定义用户代理和视口启动:

const browser = await chromium.launch({
  proxy: { server: proxyUrl },
});
const context = await browser.newContext({
  userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
  viewport: { width: 1920, height: 1080 },
  locale: 'en-US',
  timezoneId: 'America/New_York',
});

每个会话从列表中轮换用户代理。

第 5 步:抓取动态内容并处理分页

Playwright 会自动等待元素。使用 page.waitForSelector 处理动态内容。对于无限滚动,滚动直到没有新项目加载。

示例:从具有无限滚动的电商页面抓取产品标题:

async function scrapeProducts(page) {
  await page.goto('https://example.com/products', { waitUntil: 'networkidle' });
  let previousHeight = 0;
  while (true) {
    const currentHeight = await page.evaluate(() => document.body.scrollHeight);
    if (currentHeight === previousHeight) break;
    previousHeight = currentHeight;
    await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
    await page.waitForTimeout(2000);
  }
  const products = await page.evaluate(() => {
    return Array.from(document.querySelectorAll('.product-title')).map(el => el.innerText);
  });
  return products;
}

第 6 步:使用新 IP 实现重试逻辑

当请求失败时(例如 CAPTCHA、超时),使用新 IP 重试。由于轮换代理会为每个请求更改 IP,只需重试可能就足够了。对于粘性会话,可以更改会话 ID。

async function scrapeWithRetry(url, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    const browser = await chromium.launch({ proxy: { server: proxyUrl } });
    try {
      const page = await browser.newPage();
      await page.goto(url, { timeout: 30000 });
      const data = await page.content();
      await browser.close();
      return data;
    } catch (error) {
      console.error(`Attempt ${i + 1} failed: ${error.message}`);
      await browser.close();
    }
  }
  throw new Error(`Failed after ${maxRetries} retries`);
}

故障排除

  • 认证错误:仔细检查用户名和密码。如果包含特殊字符,请确保它们经过 URL 编码。
  • 代理连接被拒绝:验证代理主机和端口。如果使用 IP 认证,请检查你的 IP 是否在白名单中(ChangeMyIP 支持用户名/密码,因此请使用该方式)。
  • CAPTCHA 或封禁:轮换用户代理并引入随机延迟。使用住宅代理以获得更高的成功率。
  • 性能缓慢:减少浏览器实例,使用无头模式,并通过 page.route 阻止不必要的资源(图像、CSS)。
  • 粘性会话不工作:查阅 ChangeMyIP 文档,了解用户名中正确的会话 ID 格式。

总结

你已经学习了如何将 ChangeMyIP 住宅代理与 Playwright 集成以进行高级网页抓取。通过轮换 IP、管理浏览器指纹和处理动态内容,你可以大规模抓取并避免封禁。请记住遵守网站的服务条款和 robots.txt。ChangeMyIP 的住宅代理网络提供 40 多个国家/地区和多种协议,使其成为这些任务的合适选择。