使用 ChangeMyIP 住宅代理和 Playwright 进行高级网页抓取
将 ChangeMyIP 的轮换住宅代理与 Playwright 结合,大规模抓取动态网站。本高级教程涵盖按请求轮换 IP、浏览器指纹规避以及稳健的错误处理。
概述
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 项目
- 创建一个新目录并初始化 npm:
mkdir changeMyIP-playwright-scraper
cd changeMyIP-playwright-scraper
npm init -y
- 安装 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 多个国家/地区和多种协议,使其成为这些任务的合适选择。