使用 Playwright Stealth 避免机器人检测

使用 Playwright Stealth 插件巧妙地避开机器人检测。我们的快速指南向您展示如何将 Stealth 集成到您的 Playwright 脚本中,保持您的网页自动化流畅且不可检测。
4 min read
使用Playwright Stealth避免机器人检测

本教程将介绍:

  • 什么是机器人检测以及为什么它对 Playwright 构成问题。
  • 什么是 Playwright Stealth。
  • 如何在 Python 和 JavaScript 中使用它以避免被阻止。

让我们开始吧!

机器人检测是 Playwright 的最大限制

Playwright 是最受欢迎的 Python 浏览器自动化库之一。它由微软直接开发和维护,具有可靠性和广泛使用的特点。其高级和直观的 API 使得可以在不同编程语言中轻松控制无头或有头浏览器。这意味着 Playwright 是跨浏览器和跨平台机器人开发、自动化测试和网页抓取的绝佳工具。

Playwright 是最受欢迎的 Python 浏览器自动化库之一。它由微软直接开发和维护,具有可靠性和广泛使用的特点。其高级和直观的 API 使得可以在不同编程语言中轻松控制无头或有头浏览器。这意味着 Playwright 是跨浏览器和跨平台机器人开发、自动化测试和网页抓取的绝佳工具。

该库的主要问题是,它在使用无头模式的浏览器时,容易被反机器人技术检测并阻止。为什么会这样?因为 Playwright 在控制无头浏览器时会自动更改某些特殊属性和标头的值。例如,它将 navigator.webdriver 的 Chrome 设置为 true

机器人检测解决方案意识到了这些配置,并分析它们以验证当前用户是人类还是机器人。当这些机制检测到任何可疑设置时,它们会将用户分类为机器人并立即阻止。

例如,考虑这个无头模式的机器人检测测试。在浏览器中访问该页面,您将看到:

无头Chrome检查器

完美,这就是您期望的结果!

现在,尝试在原生 Playwright 中访问同一页面并从页面中提取答案:

import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        # launch the browser
        browser = await p.chromium.launch()
        # open a new page
        page = await browser.new_page()

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

        # extract the answer contained on the page
        answer_element = page.locator("#res")
        answer = await answer_element.text_content()

        # print the resulting answer
        print(f'The result is: "{answer}"')

        # close the browser and release its resources
        await browser.close()

asyncio.run(main())

执行 Python 程序,它将打印:

The result is: "You are Chrome headless"

这意味着机器人自动化测试页面能够检测到您的自动化脚本发出的请求来自无头浏览器。

换句话说,Playwright 是一个有限的工具,容易被反机器人技术阻止。为了避免这种情况,您可以手动覆盖默认配置并期望成功。否则,请安装 Playwright Stealth 插件!

Playwright Stealth 插件:它是什么以及如何工作

playwright-stealth 是一个 Python 包,通过覆盖特定配置来避免机器人检测。Playwright Stealth 是 puppeteer-extra-plugin-stealth npm 包的移植版,它使用内置规避模块,避免泄露并更改暴露自动化浏览器为机器人的属性。例如,它删除 navigator.webdriver 属性,并从 Chrome 默认的无头模式的用户代理标头中删除“HeadlessChrome”。

Stealth 插件的目标是使自动化无头浏览器实例能够成功通过 sannysoft.com 上的所有机器人检测测试。截至写作时,这一目标已经实现。然而,正如官方文档中所提到的,仍然有检测无头浏览器的方法。所以今天有效的方法,明天可能就无效了。完全绕过所有机器人检测机制是不可能实现的,但该库旨在使这个过程尽可能具有挑战性。

如何使用 Playwright Stealth 避免机器人检测

按照以下步骤学习如何将 Playwright Stealth 集成到 playwright Python 脚本中,以避免被阻止。

步骤 1:设置 Playwright Python 项目

免责声明:如果您已经有一个Playwright Python 项目,可以跳过此步骤。

首先,确保您的计算机上安装了 Python 3。否则,下载安装程序,执行并按照安装向导操作。

接下来,使用以下命令设置一个名为 playwright-demo 的 Python 项目:

mkdir playwright-demo
cd playwright-demo

这些命令创建 playwright-demo 文件夹并在终端中进入该文件夹。

初始化Python 虚拟环境并激活它:

python -m venv env
env/Scripts/activate

使用以下命令安装 Playwright:

pip install playwright

这需要一些时间,请耐心等待。

之后,安装所需的浏览器:

playwright install

在您选择的 Python IDE 中打开项目文件夹,并创建一个 index.py 文件。使用以下几行初始化它:

import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        page = await browser.new_page()

        # browser automation logic...

        await browser.close()

asyncio.run(main())

以上脚本在无头模式下启动 Chromium 实例,打开一个新页面,最后关闭浏览器。这是一个基本的 Playwright Python 脚本。

要执行它,请运行:

python index.py

太好了,您现在有一个准备扩展 Stealth 插件的 Playwright 项目!

步骤 2:安装和使用 Stealth 插件

使用以下命令安装 Playwright Stealth 插件:

pip install playwright-stealth

在您的 index.py 文件中,向 Playwright 脚本添加以下导入:

from playwright_stealth import stealth_async

如果您使用的是同步 API:

from playwright_stealth import stealth_sync

要在 Playwright 中注册它,请按以下方式将 page 对象传递给导入的函数:

await stealth_async(page)

如果您使用的是同步 API:

stealth_async(page)

stealth_async() 函数将通过覆盖一些默认配置来扩展 page,以避免机器人检测。

太棒了!只剩下访问目标页面并重复测试。

步骤 3:将它们整合在一起

将 Stealth 插件集成到本文开头介绍的 Playwright 脚本中:

import asyncio
from playwright.async_api import async_playwright
from playwright_stealth import stealth_async
async def main():
    async with async_playwright() as p:
        # launch the browser
        browser = await p.chromium.launch()
        # open a new page
        page = await browser.new_page()

        # register the Playwright Stealth plugin
        await stealth_async(page)

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

        # extract the message contained on the page
        message_element = page.locator("#res")
        message = await message_element.text_content()

        # print the resulting message
        print(f'The result is: "{message}"')

        # close the browser and release its resources
        await browser.close()

asyncio.run(main())

再次执行它,这次它将打印:

The result is: "You are not Chrome headless"

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

做得好!您现在已经掌握了 Playwright Stealth 的艺术,任何机器人检测技术都无法再吓唬您。

额外:JavaScript 中的 Playwright Stealth

如果您是 Playwright JavaScript 用户并希望达到相同的效果,您需要使用 puppeteer-extra-plugin-stealth npm 包。这适用于 Puppeteer ExtraPlaywright Extra。如果您不熟悉这些项目,它们本质上是两种浏览器自动化库的增强版。具体来说,它们通过插件为 Puppeteer 和 Playwright 添加扩展功能。

因此,假设您有以下 Playwright JavaScript 脚本并希望将其与 Stealth 插件集成:

import { chromium } from "playwright"

(async () => {
    // set up the browser and launch it
    const browser = await chromium.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 contained on the page
    const messageElement = page.locator('#res')
    const message = await messageElement.textContent()

    // print the resulting message
    console.log(`The result is: "${message}"`)

  // close the browser and release its resources
  await browser.close()
})()

首先,安装 playwright-extrapuppeteer-extra-plugin-stealth

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

接下来,从 playwright-extra 导入 chromium 而不是 playwright,并从 puppeteer-extra-plugin-stealth 导入 StealthPlugin

import { chromium } from "playwright-extra"
import StealthPlugin from "puppeteer-extra-plugin-stealth"

然后,使用以下命令注册 Stealth 插件:

chromium.use(StealthPlugin())

将它们整合在一起,您将得到:

import { chromium } from "playwright-extra"
import StealthPlugin from "puppeteer-extra-plugin-stealth"

(async () => {
    // configure the Stealth plugin
    chromium.use(StealthPlugin())

    // set up the browser and launch it
    const browser = await chromium.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 contained on the page
    const messageElement = page.locator('#res')
    const message = await messageElement.textContent()

    // print the resulting message
    console.log(`The result is: "${message}"`)

    // close the browser and release its resources
    await browser.close()
})()

太棒了!您刚刚在 JavaScript 中将 Stealth 插件集成到了 Playwright。

结论

在本指南中,您了解了为什么机器人检测对 Playwright 构成挑战以及如何解决它。感谢 Python 库 Playwright Stealth,您可以增强默认的浏览器配置以规避机器人检测。正如这里所证明的,类似的方法也可以应用于 JavaScript。

无论您的 Playwright 浏览器自动化脚本多么复杂,先进的机器人检测系统仍将是一个问题。虽然您可以考虑使用其他浏览器自动化包,但检测的根本原因在于浏览器,而不是库本身。解决方案在于一个具有防机器人绕过功能且能无缝集成任何浏览器自动化库的可扩展浏览器。这种浏览器被称为Scraping Browser

Bright Data 的 Scraping Browser 是一种高度可扩展的云浏览器,兼容 Playwright、Puppeteer 和 Selenium。它会在每个请求时自动旋转出口 IP,并能处理浏览器指纹识别、自动重试和CAPTCHA 解决。这些功能是通过它依赖的基于代理的解锁功能实现的。

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