Скрипт отлично работает на локалке. Деплоишь — и через пару часов летят 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 profileRate 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: реалистичные тайминги, движение мыши, изоляция сессий, управление частотой запросов. Это стек, который держится в продакшене.
Читайте дальше
Похожие статьи

Веб-скрейпинг без обнаружения: техники, которые работают
Практический гайд по web scraping: разведка сайта, HTTP или browser, извлечение данных, pagination, sessions и масштабирование с Playwright.
Читать статью →
CDP vs MCP: когда использовать какой протокол для управления браузером через ИИ
CDP управляет браузером. MCP связывает ИИ. Узнайте, когда применять Chrome DevTools Protocol, а когда Model Context Protocol для автоматизации браузера агентами ИИ.
Читать статью →