避免因Puppeteer Stealth被屏蔽

3 min read

本 Puppeteer Stealth 教程将涵盖以下内容:

  • 什么是机器人检测以及为什么它对 Puppeteer 来说是一个问题。
  • Puppeteer Extra 是什么。
  • 如何使用 Puppeteer Extra Stealth 插件来避免屏蔽。

机器人检测:Puppeteer 的最大敌人

Puppeteer 是浏览器自动化中使用最广泛的 JavaScript 库之一。 它之所以如此受欢迎,是因为它得到了 Google Chrome 团队的支持。 其高级 API 允许您通过 DevTools 协议控制无头或有头浏览器,使其成为网络抓取、自动化测试和机器人开发的绝佳工具。

然而,Puppeteer 很容易被机器人检测技术阻止。 当使用 Chrome/Chromium无头模式时尤其如此。 为什么? 因为 Puppeteer 会自动设置默认属性和标头,使受控制的浏览器显示为无头实例。 例如,它将Chrome 设置设定为:navigator.webdriver: true。

反机器人解决方案了解这一点并分析这些设置以确定当前用户是人类还是机器人。 当他们发现一些可疑配置时,访问用户就会被标记为机器人。

例如,这个无头模式机器人检测测试。 如果您在浏览器中打开测试页面,您将看到:

现在,尝试使用 Puppeteer vanilla 访问该站点并从中提取测试结果:

import puppeteer from "puppeteer"

(async () => {
    // set up the browser and launch it
    const browser = await puppeteer.launch()

    // open a new blank page
    const page = await browser.newPage()

    // navigate the page to the target page
    await page.goto("https://arh.antoinevastel.com/bots/areyouheadless")

    // extract the message of the test result
    const resultElement = await page.$("#res")
    const message = await resultElement.evaluate(e => e.textContent)

    // print the resulting message
    console.log(`The result of the test is "%s"`, message);

    // close the current browser session
    await browser.close()
})()

启动上面的脚本,你会看到:

The result of the test is "You are Chrome headless"

这意味着测试失败,因为页面能够检测到来自无头浏览器的自动请求。

默认设置情况下,Puppeteer 是一个有限的工具。 为了避免机器人检测,您必须手动调整它并覆盖默认配置。 使用 Puppeteer Extra 可以避免这一切!

Puppeteer Extra:Puppeteer 的可扩展版本

Puppeteer Extra 是一个围绕 Puppeteer 构建的轻量级包装器,通过插件支持对其进行了扩展。 换句话说, puppeteer-extra 是 puppeteer 的直接替代品。 除了像流行的浏览器自动化库一样工作之外,它还提供 use() 方法来注册插件。

每个插件都为 Puppeteer 添加了额外的功能。 一些最有用的插件是:

  • puppeteer-extra-plugin-stealth:使机器人检测技术更难检测无头浏览器实例。
  • puppeteer-extra-plugin-recaptcha:自动解决reCAPTCHAs和 hCaptchas 。
  • puppeteer-extra-plugin-adblocker:删除广告和跟踪器,从而减少带宽和加载时间。
  • puppeteer-extra-plugin-devtools:通过创建到 DevTools 的安全隧道,使浏览器调试成为可能。
  • puppeteer-extra-plugin-repl:通过交互式 REPL(读取-评估-打印-循环)界面使调试变得有趣。
  • puppeteer-extra-plugin-block-resources:动态阻止页面资源,例如图像、媒体、CSS 和 JS 文件。
  • puppeteer-extra-plugin-anonymize-ua:匿名化页面导航上的 User-Agent 标头。 在我们的用户代理在网络数据抓取指南中了解为什么这很重要。
  • puppeteer-extra-plugin-user-preferences:设置自定义 Chrome/Chromium 用户首选项。

现在让我们更深入地研究 Puppeteer Stealth 插件。

Puppeteer Extra Stealth 插件是什么?有什么用途?

puppeteer-extra-plugin-stealth 是 Puppeteer Extra 的插件,其中包含一组避免机器人检测的配置。 具体来说,Puppeteer Stealth 依赖于内置的规避模块,这些模块会覆盖 Puppeteer 的泄漏和将其暴露为机器人的属性。 例如,它从 User-Agent 标头中删除“HeadlessChrome”,并删除 Puppeteer 默认设置的 navigator.webdriver 属性。

Puppeteer Extra Stealth 插件的目标是使通过 Puppeteer 控制的无头 Chromium 实例通过sannysoft.com上的所有机器人检测测试。 截至撰写本文时,它已经实现了目标。 同时,正如官方文档中所说,仍然有方法可以检测headless Chromium。 这意味着不可能绕过所有机器人检测机制,但该项目处长是让这些检测过程不能轻易完成。

如何在抓取网页数据时使用 Puppeteer Stealth 避免机器人检测

是时候了解如何将 Puppeteer Stealth 集成到 puppeteer 抓取脚本中以避免被阻止。

请按照以下步骤操作!

第 1 步:安装 Puppeteer Extra 和 Stealth 插件

启动以下命令将 Puppeteer Extra 和 Puppeteer Stealth 插件添加到项目的依赖项中:

npm install puppeteer-extra puppeteer-extra-plugin-stealth

非常好,您刚刚做好了将 Stealth 插件集成到 Puppeteer 自动化脚本中的准备。

第 2 步:设置 Puppeteer Extra 并注册 Stealth 插件。

首先,用以下指令替换 puppeteer import 语句:

import puppeteer from "puppeteer-extra"

换句话说,请确保从“puppeteer-extra”而不是“puppeteer”导入 puppeteer 对象。

然后,从 puppeteer-extra-plugin-stealth 导入 StealthPlugin:

import StealthPlugin from "puppeteer-extra-plugin-stealth"

如果您是 CommonJS 用户,您将需要:

const puppeteer = require("puppeteer-extra")
const StealthPlugin = require("puppeteer-extra-plugin-stealth")

接下来,通过 use() 方法将 Stealth 插件传递给 puppeteer 对象来注册 Stealth 插件:

puppeteer.use(StealthPlugin())

非常好!您刚刚将插件支持的默认规避功能添加到 Puppeteer 中。

请注意,StealthPlugin() 构造函数接受一个可选对象,其中包含与要启用的规避相对应的字符串集:

// enable only a few evasion techniques
puppeteer.use(StealthPlugin({
    enabledEvasions: new Set(["chrome.app", "chrome.csi", "defaultArgs", "navigator.plugins"])
}))

否则,使用以下逻辑从 Stealth 插件中动态删除特定的规避策略:

const stealthPlugin = StealthPlugin()
puppeteer.use(stealthPlugin)

// ...

// remove the "user-agent-override" evasion method
pluginStealth.enabledEvasions.delete("user-agent-override")

第三步:归纳总结

将 Puppeteer Extra 及其 Stealth 插件集成到您在文章开头看到的脚本中:

import puppeteer from "puppeteer-extra"
import StealthPlugin from "puppeteer-extra-plugin-stealth"

(async () => {
    // configure the stealth plugin
    puppeteer.use(StealthPlugin())
    // set up the browser and launch it
    const browser = await puppeteer.launch()

    // open a new blank page
    const page = await browser.newPage()

    // navigate the page to the target page
    await page.goto("https://arh.antoinevastel.com/bots/areyouheadless")

    // extract the message of the test result
    const resultElement = await page.$("#res")
    const message = await resultElement.evaluate(e => e.textContent)

    // print the resulting message
    console.log(`The result of the test is "%s"`, message);

    // close the current browser session
    await browser.close()
})()

运行此代码片段,它现在将打印:

The result of the test is "You are not Chrome headless"

瞧! 具有机器人检测功能的所选页面不再能够将您的 Puppeteer 自动化脚本标记为机器人。

恭喜! 您现在是一名 Puppeteer Stealth 忍者,任何机器人检测技术都不会再吓到您。

总结

在本文中,您了解了为什么机器人检测对 Puppeteer 来说是一个挑战以及如何应对它。 借助 Puppeteer Extra,使用插件扩展 Puppeteer 的功能。 特别是,Stealth 插件是避免机器人检测的好帮手,在这里您学习了如何使用它。

无论您的 Puppeteer Extra 多么复杂,Cloudflare 等先进的反机器人技术仍然能够发现并阻止您的脚本。 您可以选择另一个浏览器自动化软件包,但检测的原因是浏览器,而不是库。 该解决方案是一个具有反机器人绕过功能的可扩展浏览器,可以与任何浏览器自动化库集成。 该浏览器是存在的,它就是亮数据浏览器/Scraping Browser

Bright Data 的亮数据浏览器/Scraping Browser 是一款高度可扩展的云浏览器,可与 Puppeteer, Playwright, Selenium等配合使用。 它会根据每个请求自动轮换退出 IP,并可以为您处理浏览器指纹识别、验证码解析和自动重试。 这要归功于它所依赖的基于代理网络的解锁功能。

Bright Data 的代理被财富 500 强公司和超过 20,000 名客户使用。 这个可靠的全球代理网络包含以下代理:

联系我们的销售,了解Bright Data的哪种产品最适合您的需求。