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 进行自动化操作和数据抓取。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐