如何使用 Puppeteer 避免机器人检测
Puppeteer 是一个 Node.js 库,它提供了一个高层次的 API 用于控制无头浏览器 Chromium。由于网络爬虫的普及,许多网站已经实现了各种检测机制来防止机器人访问。为了避免被检测到,我们需要采取一些措施来模拟真实用户的行为。以下是一些常用的策略和相应的示例代码。
一、安装 Puppeteer
首先,确保你已经安装了 Puppeteer。你可以使用 npm 或 yarn 来安装它:
npm install puppeteer
# 或者使用 yarn
yarn add puppeteer
二、基本的 Puppeteer 示例
以下是一个使用 Puppeteer 的基本示例,打开一个网页并截图。
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: false }); // headless: false 用于可视化浏览器
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({ path: 'example.png' });
await browser.close();
})();
三、避免检测的策略
1. 设置 User-Agent
许多网站会通过 User-Agent 来判断请求是否来自真实用户。我们可以自定义 User-Agent。
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36');
2. 禁用 WebGL 和 WebRTC
一些网站会使用 WebGL 和 WebRTC 进行硬件检测,禁用这些功能可以降低被检测的风险。
await page.evaluate(() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
window.open = function() {};
window.alert = function() {};
window.confirm = function() {};
});
3. 随机化访问时间
模拟真实用户的访问行为,添加随机的等待时间。
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
await page.goto('https://example.com');
await delay(Math.random() * 5000 + 2000); // 随机等待 2 到 7 秒
4. 使用代理
使用代理可以隐藏真实的 IP 地址,减少被封禁的风险。
const browser = await puppeteer.launch({
headless: false,
args: ['--proxy-server=http://my-proxy-server:port'] // 替换为你的代理地址
});
5. 模拟真实用户输入
在页面中模拟真实用户的输入行为,而不是直接填充表单。
await page.type('#inputField', 'Hello World!', { delay: 100 }); // 添加输入延迟
await page.click('#submitButton');
6. 处理 Cookies 和 Sessions
在访问页面时,可以保留之前的 Cookies,以模拟用户的登录状态。
const cookies = await page.cookies();
await page.setCookie(...cookies);
7. 避免快速请求
连续快速请求会被视为爬虫行为,可以通过设置合适的请求间隔来避免。
await page.goto('https://example.com/page1');
await delay(3000); // 等待3秒
await page.goto('https://example.com/page2');
四、完整示例代码
以下是一个完整的示例代码,结合了上述所有策略:
const puppeteer = require('puppeteer');
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
(async () => {
const browser = await puppeteer.launch({
headless: false,
args: ['--proxy-server=http://my-proxy-server:port'] // 替换为你的代理地址
});
const page = await browser.newPage();
// 设置 User-Agent
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36');
// 禁用 WebGL 和 WebRTC
await page.evaluate(() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
window.open = function() {};
window.alert = function() {};
window.confirm = function() {};
});
// 模拟用户行为
await page.goto('https://example.com');
await delay(Math.random() * 5000 + 2000); // 随机等待 2 到 7 秒
// 填充表单并提交
await page.type('#inputField', 'Hello World!', { delay: 100 });
await page.click('#submitButton');
// 继续进行其他操作
await delay(3000); // 等待3秒
// 截图
await page.screenshot({ path: 'screenshot.png' });
await browser.close();
})();
五、总结
在使用 Puppeteer 进行网页抓取时,避免机器人检测是一个重要的考量。通过设置 User-Agent、禁用 WebGL 和 WebRTC、随机化访问时间、使用代理、模拟真实用户输入等方式,可以有效降低被检测的风险。通过合理运用这些策略,您可以更安全地使用 Puppeteer 进行自动化操作和数据抓取。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)