Использование puppeteer-humanize для веб-скрапинга: 2025 руководство

Узнайте, почему puppeteer-humanize улучшает веб-скраппинг, имитируя действия человека, чтобы обойти аналитику поведения пользователей.
4 мин. чтения
Puppeteer humanize web scraping

В этой статье вы узнаете:

  • Почему ванильного Puppeteer недостаточно для аналитики поведения пользователей.
  • Что такое кукловод-гуманист и как он помогает преодолеть эти ограничения.
  • Как использовать его для веб-скрапинга в пошаговом руководстве.
  • Остаются проблемы, связанные с таким подходом к сбору веб-данных.

Давайте погрузимся!

Аналитика поведения пользователей: Почему стандартный кукловод не справляется с задачей

Аналитика поведения пользователей (UBA) – это процесс сбора и анализа данных о том, как пользователи взаимодействуют с веб-страницей. В веб-скреппинге его основной целью является выявление аномального или подозрительного поведения для идентификации ботов.

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

Чтобы противостоять UBA, некоторые библиотеки автоматизации пытаются более реалистично имитировать поведение человека. Например, они имитируют движения мыши с помощью эвристики или даже машинного обучения. Тем не менее в большинстве случаев набор текста все равно выглядит роботизированным, что является проблемой.

Теперь предположим, что вашему сценарию Puppeteer нужно заполнить форму. Даже если вы добавите небольшую задержку между нажатиями клавиш с помощью функции type(), такое взаимодействие не будет выглядеть естественным.

Возьмем для примера форму входа в систему на сайте Quotes to Scrape:

import puppeteer from "puppeteer";

(async () => {
  // set up a new browser instance in headful mode
  const browser = await puppeteer.launch({
    headless: false, // set to false so you can watch the interaction
    defaultViewport: null,
  });
  const page = await browser.newPage();

  // connect to the target page
  await page.goto("https://quotes.toscrape.com/login");

  // simulate typing with a delay of 200ms between each character
  await page.type("input[name=\"username\"]", "username", { delay: 200 });
  await page.type("input[name=\"password\"]", "password", { delay: 200 });

  // ...

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

Вот как будет выглядеть взаимодействие:

Взаимодействие с ботом Puppeteer

Несмотря на то что описанный выше подход более реалистичен, чем простая установка значений полей ввода напрямую, он все равно не выглядит по-человечески. Проблема в том, что ввод выглядит слишком плавным, последовательным и безошибочным. Спросите себя – какой реальный пользователь набирает каждый символ с точно таким же интервалом, без колебаний и опечаток?

Как вы понимаете, продвинутые системы UBA могут легко обнаружить такие скрипты. Именно здесь на помощь приходят такие инструменты, как puppeteer-humanize!

Что такое кукловод-гуманист?

puppeteer-humanize – это библиотека Node.js, которая делает автоматизацию Puppeteer более человекоподобной, в частности, при взаимодействии с текстовыми полями ввода. Она помогает обойти распространенные методы обнаружения ботов, анализирующие поведение пользователей, которые часто отмечают нереалистичные или слишком точные действия.

Для этого puppeteer-humanize вносит реалистичные недостатки в обычное взаимодействие кукловодов:

  1. Имитация типографских ошибок.
  2. Имитируйте использование клавиши backspace для исправления ошибок.
  3. Повторный ввод удаленного текста со случайными задержками.
  4. Ввод случайных задержек между нажатиями клавиш для изменения скорости набора текста.

Благодаря этому автоматический ввод выглядит более естественным и менее механическим. Однако важно отметить, что библиотека фокусируется только на очеловечивании поведения при наборе текста и вводе форм. Таким образом, она не является комплексным решением для обхода ботов.

Также не забывайте, что последний коммит был сделан в 2021 году, и он еще не поддерживает такие продвинутые функции, как моделирование движения мыши на основе GAN. Поэтому его область применения ограничивается только поведением при наборе текста.

Как использовать puppeteer-humanize для веб-скрапинга

Следуйте приведенным ниже инструкциям, чтобы узнать, как использовать puppeteer-humanize для создания более человекоподобного бота-скрепера. Это снижает вероятность обнаружения системами UBA, особенно если ваш скрипт должен вводить данные в формы.

Целью будет форма входа в Quotes to Scrape:

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

Теперь давайте посмотрим, как использовать puppeteer-humanize для веб-скрапинга!

Шаг №1: Настройка проекта

Если у вас еще не настроен проект Node.js, вы можете создать его в папке проекта с помощью npm init:

npm init -y

Вышеприведенная команда создаст файл package.json в каталоге проекта. Внутри папки проекта создайте файл script.js, в котором вы разместите логику скрапинга на JavaScript:

your-project-folder/
├── package.json
└── script.js

Затем откройте папку в вашей любимой JavaScript IDE. Visual Studio Code будет работать идеально.

В вашей IDE измените файл package.json, включив в него следующую строку:

"type": "module"

Это настроит ваш проект на использование ESM(ECMAScript Modules), который обычно рекомендуется для современных проектов Node.js вместо стандартного формата CommonJS.

Отлично! Теперь вы можете использовать преимущества puppeteer-humanize для моделирования реалистичных взаимодействий в своих скриптах скраппинга.

Шаг № 2: Установка и начало работы с puppeteer-humanize

Изначально puppeteer-humanize был плагином для Puppeteer Extra, но теперь это не так. Поэтому, чтобы использовать его, вам нужно просто установить:

  • @forad/puppeteer-humanize: Библиотека, симулирующая человекоподобное поведение.
  • puppeteer: Основная библиотека автоматизации браузера.

Установите их обе с помощью следующей команды:

npm install @forad/puppeteer-humanize puppeteer

Затем откройте файл script.js и инициализируйте базовый сценарий Puppeteer следующим образом:

import puppeteer from "puppeteer";

(async () => {
  // set up a new browser instance in headful mode
  const browser = await puppeteer.launch({
    headless: false, // set to false so you can watch the interaction
    defaultViewport: null,
  });
  const page = await browser.newPage();

  // ...

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

Фантастика! Теперь вы можете приступать к реализации человекоподобного взаимодействия при скрапинге.

Шаг № 3: Подключитесь к целевой странице и выберите элементы ввода

Используйте Puppeteer для перехода на целевую страницу:

await page.goto("https://quotes.toscrape.com/login");

Теперь откройте ту же страницу в браузере, щелкните правой кнопкой мыши на форме входа в систему и выберите “Inspect”, чтобы просмотреть элементы формы:

Вы заметите, что форма содержит:

  • Поле ввода имени пользователя, которое можно выбрать с помощью input[name="username"].
  • Поле ввода пароля, которое можно выбрать с помощью input[name="password"].

Чтобы выбрать эти элементы ввода в своем сценарии, используйте метод $() Puppeteer:

const usernameInput = await page.$("input[name=\"username\"]");
const passwordInput = await page.$("input[name=\"password\"]");

⚠️ Важно: puppeteer-humanize не работает с локаторами. Это означает, что вы должны использовать $() или $$() для прямого получения дескрипторов элементов.

Если на странице есть оба входа, приготовьтесь взаимодействовать с ними так же, как это делал бы реальный пользователь:

if (usernameInput && passwordInput) {
  // interaction...
}

Замечательно! Пришло время заполнить эти данные, как если бы вы были реальным пользователем.

Шаг #4: Настройка функции типизации кукловода-гуманиста

Во-первых, импортируйте функцию typeInto из puppeteer-humanize:

import { typeInto } from "@forad/puppeteer-humanize";

Затем используйте его, чтобы настроить человекоподобное взаимодействие при заполнении формы, как показано ниже:

const typingConfig = {
  mistakes: {
    chance: 10, // 10% chance of introducing a typo that gets corrected
    delay: {
      min: 100, // minimum delay before correcting a mistake (in ms)
      max: 500, // maximum delay before correcting a mistake (in ms)
    },
  },
  delays: {
    all: {
      chance: 100, // 100% chance to add delay between each keystroke
      min: 100, // minimum delay between characters (in ms)
      max: 200, // maximum delay between characters (in ms)
    },
  },
};

// strings to fill into the input elements
const username = "username";
const password = "password";

// apply the human-like typing logic to both inputs
await typeInto(usernameInput, username, typingConfig);
await typeInto(passwordInput, password, typingConfig);

Приведенная выше конфигурация набора текста:

  • Время от времени вводит опечатки, за которыми следуют реалистичные исправления – именно так, как это сделал бы настоящий пользователь.
  • Добавляет случайные задержки между нажатиями клавиш, имитируя естественное изменение скорости набора текста.

Такое поведение делает вашу автоматизацию более человечной, что снижает шансы на обнаружение технологиями UBA.

Потрясающе! Теперь ваш скрипт Puppeteer должен вести себя гораздо более похоже на настоящего человека.

Шаг #5: Заполните форму и приготовьтесь к работе с веб-скрапом

Теперь вы можете заполнить форму, используя приведенный ниже код:

const submitButton = page.locator("input[type=\"submit\"]");
await submitButton.click();

Имейте в виду, что форма входа на Quotes to Scrape – это всего лишь тестовая страница. На самом деле, вы можете получить доступ к ней, используя имя пользователя и пароль. После отправки формы вы будете перенаправлены на страницу, содержащую данные, которые вы, возможно, захотите соскоблить:

Отправка формы входа в систему

В этот момент вы можете использовать обычный Puppeteer API для реализации логики скрапинга:

// wait for the page to load
await page.waitForNavigation();

// scraping logic...

Итак, в центре внимания этой статьи – кукловод-гуманист. Поэтому мы не будем рассматривать здесь часть, связанную со скраппингом.
Если вам интересно собирать данные из Quotes to Scrape и экспортировать их в CSV, прочтите наше полное руководство по веб-скрапингу с помощью Puppeteer.

Шаг №6: Соберите все вместе

Теперь ваш файл script.js должен содержать:

import puppeteer from "puppeteer";
import { typeInto } from "@forad/puppeteer-humanize";

(async () => {
  // set up a new browser instance in headful mode
  const browser = await puppeteer.launch({
    headless: false, // set to false so you can watch the interaction
    defaultViewport: null,
  });
  const page = await browser.newPage();

  // visit the target page
  await page.goto("https://quotes.toscrape.com/login");

  // select the login form inputs
  const usernameInput = await page.$("input[name=\"username\"]");
  const passwordInput = await page.$("input[name=\"password\"]");

  // if they are not both null, interact with them
  if (usernameInput && passwordInput) {
    // configure the typing behavior
    const typingConfig = {
      mistakes: {
        chance: 10, // 10% chance of introducing a typo that gets corrected
        delay: {
          min: 100, // minimum delay before correcting a mistake (in ms)
          max: 500, // maximum delay before correcting a mistake (in ms)
        },
      },
      delays: {
        all: {
          chance: 100, // 100% chance to add delay between each keystroke
          min: 100, // minimum delay between characters (in ms)
          max: 200, // maximum delay between characters (in ms)
        },
      },
    };

    // test strings to fill into the input elements
    const username = "username";
    const password = "password";

    // apply the human-like typing logic to both inputs
    await typeInto(usernameInput, username, typingConfig);
    await typeInto(passwordInput, password, typingConfig);

    // submit the form
    const submitButton = page.locator("input[type=\"submit\"]");
    await submitButton.click();

    // wait for the page to load
    await page.waitForNavigation();

    // scraping logic...
  }

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

Запустите вышеупомянутый скрипт скрапинга puppeteer-humanize с помощью:

node script.js

Результат будет таким:

Обратите внимание, насколько естественным является взаимодействие при наборе текста

Как видите, бот Puppeteer теперь взаимодействует с формой входа в систему гораздо более естественным образом – точно так же, как это делал бы настоящий пользователь. Он набирает текст с реалистичной скоростью, иногда делает опечатки, а затем исправляет их. В этом и заключается сила Puppeteer - очеловечивать!

Проблемы, связанные с этим подходом к веб-скрапингу

puppeteer-humanize – это, безусловно, отличный союзник для снижения шансов быть обнаруженным технологиями, анализирующими взаимодействие пользователей. Тем не менее, методы борьбы со скрапингом и ботами выходят далеко за рамки только поведения пользователей!

Во-первых, помните, что Puppeteer должен использовать браузер для программного управления им. Это вносит тонкие изменения и признаки, которые могут выдать браузер за автоматизированный. Чтобы уменьшить количество таких утечек, следует также рассмотреть возможность использования Puppeteer Stealth.

Даже при использовании puppeteer-humanize и Puppeteer Stealth вы все равно можете столкнуться с CAPTCHA при взаимодействии. В таких случаях ознакомьтесь с нашей статьей об обходе CAPTCHA с помощью Playwright.

Хотя эти инструменты и руководства могут помочь вам создать более устойчивую систему скраппинга, многие из обходных путей, на которые они опираются, не вечны. Если вы имеете дело с сайтами, на которых используются очень сложные антибот-решения, ваши шансы на успех значительно снижаются. Кроме того, добавление множества плагинов может привести к тому, что ваша система станет более требовательной к памяти и диску и будет сложнее масштабироваться.

В этом случае проблема заключается не в самом Puppeteer, а в ограничениях браузера, которым он управляет. Настоящим прорывом становится интеграция Puppeteer с облачным браузером Headful, созданным специально для веб-скрапинга. Это решение включает встроенную поддержку вращающихся прокси, расширенное решение CAPTCHA, реалистичные отпечатки пальцев браузера и многое другое. Именно это и есть Browser API от Bright Data!

Заключение

В этом уроке вы узнали, почему ванильный Puppeteer не справляется с анализом поведения пользователей и как решить эту проблему с помощью puppeteer-humanize. В частности, вы увидели, как интегрировать этот подход в рабочий процесс веб-скреппинга с помощью пошагового руководства.

Хотя этот метод может помочь вам обойти простые системы защиты от ботов, он не гарантирует высокий процент успеха. Это особенно верно при обходе сайтов, использующих CAPTCHA, запрет IP-адресов или современные методы защиты от ботов, основанные на искусственном интеллекте. Кроме того, масштабирование этой настройки может быть сложным.

Если вы хотите, чтобы ваш скрипт – или даже агент искусственного интеллекта – вел себя более похоже на реального пользователя, вам следует рассмотреть возможность использования браузера, специально разработанного для этого случая: Agent Browser от Bright Data.

Создайте бесплатную учетную запись Bright Data, чтобы получить доступ ко всей нашей инфраструктуре скраппинга с поддержкой искусственного интеллекта!