Перейти к содержанию

Имитация поведения человека и анти-детект (chutils.scraping.humanize)

Модуль chutils.scraping.humanize разработан для имитации естественного человеческого поведения при автоматизации браузеров и обхода систем защиты от ботов. Он предоставляет математические алгоритмы генерации человекоподобных траекторий мыши, неравномерного ввода текста, случайных пауз, а также средства настройки анти-детект профилей для Playwright и Selenium.

Данный модуль поставляется как опциональный экстра-пакет chutils[scraping].


Установка

Для работы с интеграциями для Playwright и Selenium установите пакет с поддержкой экстра-зависимостей:

pip install "chutils[scraping]"

Примечание: Если вам нужны только математические генераторы (траектории, задержки, опечатки), вы можете использовать их без установки дополнительных библиотек автоматизации.


1. Математические генераторы

Математический модуль работает автономно и не требует внешних зависимостей.

Генератор траекторий Безье (BezierCurveGenerator)

Позволяет рассчитывать плавные кривые перемещения мыши с естественным ускорением в начале и замедлением в конце движения (ease-in-out).

from chutils.scraping.humanize import BezierCurveGenerator

generator = BezierCurveGenerator()
start_point = (100, 150)
end_point = (500, 450)

# Генерирует список из 30 координат (x, y)
points = generator.generate(start_point, end_point, steps=30)

Генератор задержек с джиттером (JitterDelayGenerator)

Рассчитывает задержки на основе логнормального или нормального распределения. Большинство задержек будут короткими, но изредка будут возникать естественные длинные паузы.

from chutils.scraping.humanize import JitterDelayGenerator

delay_gen = JitterDelayGenerator(strategy="lognormal", jitter=0.15)
base_delay = 2.0

# Возвращает случайное число вокруг 2.0
delay = delay_gen.generate(base_delay)

Генератор опечаток клавиатуры (KeyboardTypoGenerator)

Генерирует последовательности нажатий клавиш, включая случайные опечатки на близкорасположенных QWERTY-клавишах, с последующим стиранием опечаток через Backspace и вводом правильных букв.

from chutils.scraping.humanize import KeyboardTypoGenerator

typo_gen = KeyboardTypoGenerator()
sequence = typo_gen.generate_sequence("Hello!", error_rate=0.1)

# Возвращает список объектов TypoAction (action='type'|'backspace', char='...')

2. Имитация мыши, скролла и клавиатуры

Модуль предоставляет обертки для Playwright (асинхронные) и Selenium (синхронные).

Обертки для Playwright (асинхронные)

from chutils.scraping.humanize import (
    async_move_mouse,
    async_scroll_to,
    async_type_text,
    async_human_sleep
)

# Плавное движение мыши
await async_move_mouse(page, x=400, y=300, start=(0, 0))

# Плавный скролл страницы по оси Y
await async_scroll_to(page, x=0, y=800)

# Ввод текста со скоростью 40 WPM и вероятностью опечаток 5%
await async_type_text(page, selector="#username", text="my_user_login", error_rate=0.05, speed_wpm=40.0)

# Асинхронная пауза "на чтение" от 1 до 3 секунд
await async_human_sleep(1.0, 3.0)

Обертки для nodriver (асинхронные)

Те же асинхронные функции поддерживают автоматизацию на базе nodriver (все действия транслируются напрямую через CDP протокол):

from chutils.scraping.humanize import (
    async_move_mouse,
    async_scroll_to,
    async_type_text,
)

# Плавное движение мыши (транслируется в CDP dispatchMouseEvent)
await async_move_mouse(tab, x=400, y=300, start=(0, 0))

# Плавный скролл страницы через JS evaluate
await async_scroll_to(tab, x=0, y=800)

# Ввод текста с опечатками (через CDP dispatchKeyEvent)
await async_type_text(tab, selector="#username", text="my_user_login", error_rate=0.05, speed_wpm=40.0)

Обертки для Selenium (синхронные)

from chutils.scraping.humanize import (
    move_mouse,
    scroll_to,
    type_text,
    human_sleep
)

# Плавное движение мыши
move_mouse(driver, x=400, y=300, start=(0, 0))

# Плавный скролл
scroll_to(driver, x=0, y=800)

# Ввод текста
type_text(driver, selector="#username", text="my_user_login", error_rate=0.05, speed_wpm=40.0)

# Синхронная пауза
human_sleep(1.0, 3.0)

3. Анти-детект и маскировка браузеров

Для минимизации вероятности обнаружения бот-детектором (например, Cloudflare, Akamai, Imperva) модуль предоставляет JS-инъекции и флаги запуска.

JS-инъекции анти-детекта

Инъекция скрывает автоматизацию на низком уровне JavaScript до загрузки веб-страницы:

  • Удаляет и переопределяет свойство navigator.webdriver.
  • Добавляет минимальный псевдослучайный шум к пикселям Canvas (getImageData), искажая статический Canvas-отпечаток.
  • Маскирует WebGL параметры видеокарты (переопределяет рендерер и вендор на стандартный Google Inc. (NVIDIA)).
  • Эмулирует список установленных системных плагинов и количество ядер процессора.
from chutils.scraping.humanize import (
    apply_antidetect_playwright,
    apply_antidetect_selenium,
    apply_antidetect_nodriver,
)

# Для Playwright (применяется к BrowserContext)
# Все параметры ниже опциональны (по умолчанию эмулируется NVIDIA RTX 3060, 8 ядер CPU и 8 ГБ RAM):
await apply_antidetect_playwright(
    context,
    webgl_vendor="AMD Inc.",
    webgl_renderer="Radeon RX 6800",
    hardware_concurrency=12,
    device_memory=16
)

# Для Selenium (применяется к WebDriver через CDP)
apply_antidetect_selenium(
    driver,
    webgl_vendor="Intel",
    webgl_renderer="Intel UHD Graphics",
    hardware_concurrency=4,
    device_memory=8
)

# Для nodriver (применяется к вкладке Tab через CDP протокол)
await apply_antidetect_nodriver(
    tab,
    webgl_vendor="NVIDIA Corporation",
    webgl_renderer="NVIDIA GeForce RTX 4090",
    hardware_concurrency=24,
    device_memory=64
)

Флаги запуска браузера (get_browser_launch_args)

Возвращает оптимизированный список аргументов для запуска Chromium:

from chutils.scraping.humanize import get_browser_launch_args

# Возвращает список флагов запуска, таких как:
# '--disable-blink-features=AutomationControlled', '--disable-infobars' и т.д.
launch_flags = get_browser_launch_args()

4. Прогрев профилей (ProfileWarmer)

Инструмент ProfileWarmer (асинхронный для Playwright/nodriver) и SyncProfileWarmer (синхронный для Selenium) предназначены для прогрева браузерных профилей (сохраняемых в директории user_data_dir) путем посещения трастовых веб-ресурсов и симуляции действий реального пользователя (скроллинг, движения курсора по траектории Безье, паузы, клики по внутренним ссылкам).

Это позволяет сформировать историю посещений, нагулять cookies и заполнить localStorage/sessionStorage, повышая Trust Score сессии браузера.

Асинхронный прогрев (Playwright и nodriver)

from chutils.scraping.humanize import ProfileWarmer

# Для Playwright (принимает объект Page)
# или для nodriver (принимает объект Tab)
warmer = ProfileWarmer(page_or_tab)

# Прогрев: посетит 3 случайных сайта из встроенного списка
# На каждом сайте проведет от 10 до 20 секунд, имитируя скроллинг, мышь и переходы по ссылкам
await warmer.warm_up(
    sites_count=3,
    duration_per_site=(10.0, 20.0),
    click_random_links=True
)

Синхронный прогрев (Selenium)

from chutils.scraping.humanize import SyncProfileWarmer

# Принимает экземпляр Selenium WebDriver
warmer = SyncProfileWarmer(driver)

warmer.warm_up(
    sites_count=3,
    duration_per_site=(10.0, 20.0),
    click_random_links=True
)