Избегайте блокировки с помощью Puppeteer Stealth

Узнайте, как интегрировать Puppeteer Stealth в скрипт скраппинга puppeteer, чтобы избежать блокировки.
3 min read
Avoid Getting Blocked With Puppeteer Stealth

В этом руководстве по Puppeteer Stealth мы рассмотрим:

  • Что такое обнаружение ботов и почему оно является проблемой для Puppeteer.
  • Что такое Puppeteer Extra.
  • Как использовать плагин Puppeteer Extra Stealth для обхода блокировок.

Обнаружение ботов: Самый большой враг Puppeteer

Puppeteer – одна из самых распространенных библиотек JavaScript для автоматизации браузеров. Она так популярна, потому что ее поддерживает команда Chrome в Google. Ее высокоуровневый API позволяет управлять безголовыми или головными браузерами через протокол DevTools, что делает ее отличным инструментом для веб-скрапинга, автоматизированного тестирования и разработки ботов.

Однако Puppeteer может быть легко остановлен технологиями обнаружения ботов. Это особенно актуально при использовании Chrome/Chromium в режиме headless. Почему? Потому что Puppeteer автоматически устанавливает свойства и заголовки по умолчанию, которые заставляют контролируемый браузер выглядеть как экземпляр без головы. Например, он устанавливает следующий параметр Chrome: navigator.webdriver: true.

Решения для борьбы с ботами знают об этом и анализируют эти настройки, чтобы определить, является ли текущий пользователь человеком или ботом. Если они находят подозрительные конфигурации, то помечают пользователя как бота.

Например, рассмотрим этот тест на обнаружение ботов в режиме headless. Если вы откроете тестовую страницу в браузере, то увидите:

Если вы откроете тестовую страницу в браузере, то увидите, что вы не Chrome headless.

Теперь попробуйте зайти на этот сайт с помощью 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: автоматическое решение reCAPTCHA и hCaptchas.
  • puppeteer-extra-plugin-adblocker: удаляет рекламу и трекеры, сокращая пропускную способность и время загрузки.
  • puppeteer-extra-plugin-devtools: Обеспечивает возможность отладки браузера из любого места путем создания безопасного туннеля к DevTools.
  • puppeteer-extra-plugin-repl: чтобы сделать отладку увлекательной с помощью интерактивного интерфейса REPL (Read-Eval-Print-Loop).
  • puppeteer-extra-plugin-block-resources: Блокирует динамические ресурсы страницы, такие как изображения, медиа, CSS и JS-файлы.
  • puppeteer-extra-plugin-anonymize-ua: Для анонимизации заголовка User-Agent при навигации по странице. О том, почему это важно, читайте в нашем руководстве по User Agents для веб-скрапинга.
  • puppeteer-extra-plugin-user-preferences: Установка пользовательских настроек Chrome/Chromium.

Теперь давайте подробнее рассмотрим плагин Puppeteer Stealth.

Что представляет собой плагин Puppeteer Extra Stealth и что он делает

puppeteer-extra-plugin-stealth – это плагин для Puppeteer Extra, который включает в себя набор конфигураций, позволяющих избежать обнаружения бота. В деталях Puppeteer Stealth опирается на встроенные модули уклонения, которые перезаписывают утечки и свойства Puppeteer, выдающие его за бота. Например, он удаляет “HeadlessChrome” из заголовка User-Agent и удаляет свойство navigator.webdriverr, установленное Puppeteer по умолчанию.

Цель плагина Puppeteer Extra Stealth – сделать так, чтобы экземпляр Chromium без головы, управляемый через Puppeteer, прошел все тесты на обнаружение ботов на сайте sannysoft.com. На данный момент эта цель достигнута. В то же время, как говорится в официальной документации, все еще существуют способы обнаружения безголового 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 импорта puppeteer на эту инструкцию:

import puppeteer from "puppeteer-extra"

Другими словами, убедитесь, что импортируете объект puppeteer из "puppeteer-extra``", а не из "puppeteer``".

Затем импортируйте StealthPlugin из puppeteer-extra-plugin-stealth:

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

Если вы используете CommonJS, вам понадобится:

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

Затем зарегистрируйте плагин Stealth, передав его объекту puppeteer через метод use():

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")

Шаг 3: Соберите все в единое целое

Интегрируйте 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, все равно смогут обнаружить и заблокировать ваши скрипты. Вы можете выбрать другой пакет автоматизации браузера, но причиной обнаружения будет браузер, а не библиотека. Решением является масштабируемый браузер с функцией обхода ботов, который может быть интегрирован с любой библиотекой автоматизации браузера. Такой браузер существует и называется браузер для скрапинга!  

Браузер для скрапинга от Bright Data – это высокомасштабируемый облачный браузер, который работает с Puppeteer, Playwright, Selenium и другими. Он автоматически меняет IP-адрес выхода при каждом запросе и может обрабатывать отпечатки пальцев браузера, разрешение CAPTCHA и автоматические повторные попытки для вас. Это возможно благодаря функциям разблокировки на основе прокси, на которые он опирается.

Прокси Bright Data используют компании из списка Fortune 500 и более 20,000 клиентов. Эта надежная всемирная прокси-сеть включает в себя:

Поговорите с одним из наших торговых представителей и узнайте, какой из продуктов Bright Data лучше всего подходит для ваших потребностей.