Автоматизация браузера без блокировок: стек защиты из 4 уровней — иллюстрация к статье Clawbrowser

Автоматизация браузера без блокировок: стек защиты из 4 уровней

Clawbrowser Teamavtomatizatsiya-brauzeraanti-botfingerprintingrukovodstvo

Скрипт отлично работает на локалке. Деплоишь — и через пару часов летят 403-е, CAPTCHA или тихие блокировки, когда каждая страница отдаёт одну и ту же пустую оболочку. Код не менялся. Сайт тоже. Изменилось окружение, в котором запущен браузер, — а anti-bot системы читают это окружение сразу по четырём слоям.

TL;DR: Автоматизация блокируется, потому что anti-bot системы проверяют четыре уровня одновременно: identity браузера (fingerprint), сетевые сигналы (IP + TLS), поведение (мышь, тайминги) и управление сессиями (cookies, состояние). Чинить один уровень — оставлять три других открытыми. Правильный подход — снизу вверх: начинаешь с браузера, у которого когерентный fingerprint и proxy routing зашиты в движок, а поведение и сессии уже дорабатываешь в коде.


Почему автоматизация ловит баны

Anti-bot системы типа Cloudflare, Akamai, PerimeterX и DataDome не опираются на одну проверку. Они скорят сессию по пачке сигналов одновременно. Чистый IP с утекающим navigator.webdriver — бан. Идеальный fingerprint с IP дата-центра — бан. Детекция многослойная, значит и защита должна быть многослойной.

Четыре уровня — от самого фундаментального к самому ситуативному:

Уровень Что проверяется Где фиксить
1. Identity браузера Fingerprint, флаги автоматизации, сигналы движка Бинарник браузера
2. Сеть Репутация IP, TLS fingerprint, DNS, WebRTC Конфигурация proxy
3. Поведение Движение мыши, тайминги, паттерны скролла Код приложения
4. Сессия Cookies, состояние логина, частота запросов Код приложения

Уровни 1 и 2 — инфраструктурные задачи. Уровни 3 и 4 — задачи кода. Большинство разработчиков начинают с уровня 3 (рандомные задержки), а уровни 1 и 2 при этом остаются нараспашку. Поэтому фикс и не держится.

Уровень 1: Identity браузера

Именно тут сыплется большинство автоматизаций — и именно сюда большинство разработчиков не заглядывает.

Стандартный инстанс Chromium под Playwright или Puppeteer светит сигналами автоматизации по 20+ поверхностям: navigator.webdriver выставлен в true, объект chrome.runtime отсутствует, строки WebGL renderer выдают headless GPU-драйвер, Canvas readback возвращает детерминированные хеши, а AudioContext отдаёт данные, не совпадающие с реальным железом. Anti-bot скрипты собирают всё это за первые 200 мс загрузки — до того, как ваш код вообще начнёт выполняться.

Что не работает

Stealth-плагины вроде puppeteer-extra-plugin-stealth или playwright-stealth патчат часть сигналов на уровне страницы. Они перезаписывают navigator.webdriver через JavaScript. Проблема в том, что anti-bot системы читают сигналы из самого движка, а не только со страницы. JavaScript-перезапись navigator.webdriver палится — property descriptor отличается от реального браузера. Canvas и WebGL readback идут из GPU-пайплайна, а не из JS. Страничные патчи до движка просто не дотягиваются.

Рандомный User-Agent — это замена одного сигнала из 20+. Если User-Agent говорит macOS, а WebGL renderer отдаёт Linux GPU-драйвер, шрифты чисто Windows-ные, и смещение часового пояса не бьётся с локалью — несогласованность хуже, чем полное отсутствие подмены.

Headless-режим (--headless) генерирует совершенно другой fingerprint по сравнению с headed Chrome. Размеры экрана, GPU rendering path, отрисовка шрифтов, списки плагинов — всё отличается. Ряд сайтов режет headless безусловно.

Что работает

Фикс — на уровне бинарника. Anti-detect browser патчит fingerprint-сигналы внутри движка Chromium так, чтобы они были когерентны по всем 20+ поверхностям: Canvas, WebGL, AudioContext, шрифты, свойства navigator, client rects, медиаустройства, размеры экрана, часовой пояс, язык и WebRTC — всё отдаёт значения, соответствующие единому реальному профилю устройства.

Когерентность — ключевое слово. Подмена отдельных сигналов создаёт противоречия. Управляемый fingerprint гарантирует, что каждый сигнал рассказывает одну и ту же историю.

Полный разбор всех 20+ сигналов — в статье Browser Fingerprinting Explained: The 20+ Signals Anti-Bot Systems Use to Detect Automation.


Уровень 2: Сеть

Чистый identity браузера с запалённого IP — всё равно бан. Anti-bot системы проверяют сетевой уровень отдельно.

Репутация IP

IP-адреса дата-центров (AWS, GCP, Azure, DigitalOcean) давно каталогизированы. Anti-bot провайдеры ведут базы диапазонов, привязанных к облачной инфраструктуре. Запросы с таких диапазонов получают повышенный скоринг или блокируются напрямую — независимо от fingerprint браузера.

Резидентные IP от реальных ISP дают кардинально другую картину. Разница измерима: один и тот же скрипт с тем же fingerprint может давать 90% блокировок на IP дата-центра и менее 5% — на резидентном proxy.

TLS fingerprint

Каждое HTTPS-соединение начинается с TLS handshake. Порядок cipher suites, расширений и поддерживаемых кривых в ClientHello создаёт TLS fingerprint (JA3/JA4). Стоковый Chromium, headless Chrome и Playwright генерируют разные JA3-хеши. Если TLS fingerprint говорит «инструмент автоматизации», а User-Agent — «Chrome 126 на macOS», сессию сразу пометят.

Решение — бинарник браузера, который генерирует настоящий Chrome TLS fingerprint. Proxy на уровне страницы и HTTP-библиотеки TLS fingerprinting не чинят — handshake происходит до запуска любого JavaScript.

Географическое соответствие

Если fingerprint браузера сообщает US English локаль с американским часовым поясом, а IP геолоцируется в дата-центре во Франкфурте — anti-bot системы пометят мисматч. Маршрутизация proxy должна совпадать с географией: IP-локация должна бить с часовым поясом, языком и локалью из fingerprint.

Утечки WebRTC

WebRTC может слить реальный IP даже при работе через proxy. STUN-запросы обходят конфигурацию HTTP proxy и стучатся напрямую, выдавая оригинальный адрес. Это нужно закрывать на уровне браузера, а не в коде.


Уровень 3: Поведенческие паттерны

Когда уровни 1 и 2 закрыты на уровне инфраструктуры, в дело вступает ваш код.

Anti-bot системы трекают, как сессия взаимодействует со страницей. Реальные пользователи навигируются не как скрипты: они не кликают по элементам через 5 мс после загрузки, не скроллят с постоянной скоростью 500 px/s и не обходят 200 страниц за 60 секунд с нулевым простоем.

Что реализовать

Рандомные задержки между действиями. Не фиксированный sleep(2000) — а случайный диапазон, который варьируется по типу действия.

import random
import asyncio

async def human_delay(min_ms=800, max_ms=2500):
    delay = random.uniform(min_ms, max_ms) / 1000

Реалистичное движение мыши. Двигайте курсор к элементу перед кликом, а не телепортируйте. Некоторые anti-bot системы отслеживают последовательность mouse-событий и палят клики без предшествующих mousemove.

async def move_and_click(page, selector):
    element = await page.query_selector(selector)
    box = await element.bounding_box()
    # Move to element with some randomness in the endpoint
    x = box["x"] + box["width"] * random.uniform(0.3, 0.7)

Скролл. Скроллите инкрементально, а не прыгайте точно к позиции элемента. Настоящие пользователи проскакивают мимо цели и откатываются назад.

Пейсинг запросов. Если работаете с одним доменом, распределяйте запросы так, чтобы сессия не выглядела как краулер. 2-5 секунд между навигациями — разумный baseline для большинства сайтов.


Уровень 4: Управление сессиями

Последний уровень — состояние. Anti-bot системы трекают сессии во времени и палят паттерны, которые ни один живой пользователь не создаст.

Персистентность cookies

Настоящие браузеры копят cookies за несколько визитов. Сессия, которая приходит с нулём cookies, принимает все, а через пять минут появляется снова с нулём — очевидная автоматизация. Сохраняйте состояние cookies между запусками через изолированные профили браузера.

Состояние логина

Если автоматизация логинится в аккаунт — держите сессию. Залогинился, выполнил одно действие, разлогинился, и повторил с другим fingerprint — аккаунт будет помечен.

Изоляция сессий

При запуске нескольких параллельных сессий (скрапинг разных разделов, мультиаккаунт) каждой нужен свой изолированный контекст: отдельные cookies, отдельное local storage, отдельный fingerprint. Кросс-контаминация — когда cookies из сессии A утекают в сессию B — частая причина блокировок при параллельной автоматизации.

from playwright.async_api import async_playwright

async def isolated_session(profile_name, target_url):
    async with async_playwright() as p:
        # Connect to Clawbrowser with an isolated profile

Rate limiting самого себя

Следите за частотой запросов к одной цели. 1 000 запросов в час к одному домену — никакой fingerprint management не спасёт. Ставьте разумные лимиты на домен и ротируйте сессии при приближении к порогам. Раскидывайте нагрузку между несколькими аккаунтами — каждый со своим профилем браузера и proxy.


Собираем стек

Уровни 1 и 2 — инфраструктура. Решать их в коде приложения не нужно. Anti-detect browser с управляемыми fingerprint и встроенным proxy routing закрывает оба уровня на уровне движка, а ваш код работает только с уровнями 3 и 4.

Clawbrowser — форк Chromium, который берёт на себя инфраструктурные уровни: патчи fingerprint на уровне движка по 20+ поверхностям, встроенная маршрутизация proxy с географическим соответствием, защита от утечек WebRTC и нативная поддержка CDP. Код на Playwright или Puppeteer подключается к нему как к обычному инстансу Chrome.

from playwright.async_api import async_playwright
import random, asyncio

async def scrape_with_clawbrowser():
    async with async_playwright() as p:

Скопируйте промпт установки с clawbrowser.ai и вставьте в своего AI-агента — настройка занимает меньше двух минут.

Уровни независимы друг от друга. Если ловите баны — диагностируйте, какой уровень является причиной. Fingerprint чистые и IP не помечен — копайте в сторону поведения или сессий. Поведение реалистичное, но блокировки продолжаются — проблема в identity браузера или сети. Работайте снизу вверх.

Пошаговый чеклист при появлении CAPTCHA — в статье Why Your Automation Keeps Triggering CAPTCHA: The 7-Signal Diagnostic Guide.


Что не работает (и почему)

Подход Почему не работает
Флаг --headless Даёт другой fingerprint по сравнению с headed Chrome. Многие сайты режут headless безусловно.
Stealth-плагины Патчат сигналы на уровне страницы. Сигналы движка остаются открытыми. Палятся в течение месяцев после каждого релиза.
Ротация User-Agent Меняет 1 сигнал из 20+. Создаёт рассогласованность с остальными fingerprint-сигналами.
Ротация только IP Чинит уровень 2, но оставляет уровень 1 нараспашку. Чистый IP с протекающим identity — всё равно бан.
sleep(5) везде Чинит один аспект уровня 3. Уровни 1, 2 и остальная часть уровня 3 остаются без внимания.

Общий паттерн: каждый подход фиксит один сигнал на одном уровне. Anti-bot системы проверяют все четыре уровня одновременно. Частичные фиксы в продакшене не живут.


FAQ

Cloudflare палит Playwright?

Да. Стоковый Playwright на обычном Chromium детектится Cloudflare Turnstile и Bot Management за секунды. Основная детекция — на уровне 1 (identity браузера): navigator.webdriver, артефакты CDP, расхождения WebGL-рендеринга и TLS fingerprinting. Подробный разбор — в статье Why Your Playwright Scripts Keep Getting Blocked by Cloudflare.

Нужны ли резидентные proxy?

Для сайтов с агрессивным anti-bot — да. IP дата-центров каталогизированы anti-bot провайдерами и попадают под усиленный контроль. Резидентные proxy от реальных ISP существенно снижают процент блокировок. Но резидентный IP с протекающим fingerprint всё равно словит бан. Proxy чинят уровень 2, а не уровень 1.

Headless-режим всегда палится?

Современный headless Chrome (--headless=new) ближе к headed-режиму, чем старая реализация, но расхождения остаются — GPU-рендеринг, метрики экрана, доступность шрифтов. Сайты с продвинутой детекцией (Cloudflare, Akamai, DataDome) по-прежнему отличают headless-сессии. Для серьёзных целей headed-режим с полноценным anti-detect browser — единственный надёжный вариант.

Какая скорость скрапинга безопасна?

Универсального числа нет — зависит от rate limits и чувствительности детекции на конкретном сайте. Разумная отправная точка: 2-5 секунд между навигациями на одном домене, рандомизированные в этом диапазоне. Мониторьте процент блокировок и снижайте интенсивность, если он растёт. Одни сайты терпят 1 запрос в секунду. Другие палят всё, что выше 1 запроса за 10 секунд с одной сессии.

У AI-агентов те же проблемы с детекцией?

Да. Фреймворки для AI-агентов — Claude Code, Codex, Cursor, Hermes Agent — управляют браузерами через CDP. Anti-bot системы проверяют identity браузера, а не то, кто отдаёт команды — человек или агент. AI-агент, подключённый к стандартному инстансу Chrome, банится ровно по тем же причинам, что и Playwright-скрипт. Подробнее — в статье CDP Browser for AI Agents: A Developer Guide.


Начинайте снизу

Автоматизация браузера банится, потому что anti-bot системы проверяют четыре уровня, а большинство автоматизаций закрывает один-два. Чините снизу вверх: сначала identity браузера, потом сеть, потом поведение, потом сессии. Первые два уровня — инфраструктурные задачи, которые должен решать браузер, а не ваш код.

Скопируйте промпт установки с clawbrowser.ai и вставьте в своего AI-агента — настройка занимает меньше двух минут.

Дальше фокусируйте код на уровнях 3 и 4: реалистичные тайминги, движение мыши, изоляция сессий, управление частотой запросов. Это стек, который держится в продакшене.

Читайте дальше

Все статьи →