Headless-браузер обнаружен: причины и решения (2026)
Сайт пишет «headless browser detected» или тихо отдает вашему автоматизированному браузеру другую страницу. Сайты так делают, потому что headless-браузер работает без окна и во многих мелких, измеримых деталях отличается от обычного настольного браузера. В этом руководстве рассказано, по каким признакам сайты судят о браузере, как понять, что ваш браузер сообщает о себе, и каким должно быть разумное исправление. Также описано, когда правильный ответ — остановиться или считать проверку шагом с капчей.
Почему сайты проверяют headless-браузеры
Фреймворки автоматизации управляют настоящим движком браузера, поэтому большая часть страницы работает так же. Различия проявляются по краям:
- Флаги автоматизации. Браузеры, которыми управляют инструменты автоматизации, исторически показывали свойство
navigator.webdriverсо значениемtrue, а некоторые фреймворки оставляют и другие следы на странице. - Отсутствующие или странные возможности браузера. Headless-сборка может не сообщать о плагинах, показывать необычный список языков или размер окна, не совпадающий с реальным экраном.
- Различия в отрисовке. Вывод canvas и WebGL может отличаться между headless и обычным режимом, особенно на сервере без GPU.
- Тайминг. Автоматические клики и загрузки страниц часто идут в ритме, который не даст ни один человек.
- Поведение сети. Заголовки запроса, их порядок и TLS-рукопожатие могут выдать клиент, который не является браузером.
Сайты объединяют эти сигналы в оценку. Низкая оценка может означать тихое понижение ответа, дополнительные проверки или блокировку.
Шаг 1: посмотрите, что ваш браузер сообщает о себе
Прежде чем что-то менять, посмотрите, что страница может прочитать из вашей автоматизации. Скрипт ниже открывает страницу, которой вы владеете, и выводит важные сигналы. Это диагностика: запускайте ее на собственных тестовых страницах, а не для проверки чужих систем.
from playwright.sync_api import sync_playwright
CHECK = """() => ({
webdriver: navigator.webdriver,
languages: navigator.languages,
plugins: navigator.plugins.length,
userAgent: navigator.userAgent,
screen: [screen.width, screen.height],
viewport: [window.innerWidth, window.innerHeight],
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
})"""
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://example.com") # замените на страницу, которой вы владеете
print(page.evaluate(CHECK))
browser.close()
Запустите тот же скрипт с headless=False и сравните два вывода. Различия и есть то, что сайт может заметить.
Шаг 2: исправляйте несогласованность, а не только флаги
Самая частая ошибка — скрыть один флаг и оставить остальные без изменений. User-Agent, который говорит «Windows», при шрифтах, часовом поясе и размере экрана, описывающих Linux-сервер, дает более сильный сигнал, чем одно отдельное свойство. Стремитесь к внутренне согласованной среде:
- Используйте браузер с окном, где это возможно, или headless-режим, который совпадает с текущим настольным браузером.
- Задавайте viewport и язык, которые соответствуют друг другу.
- Держите часовой пояс и локаль в соответствии с IP-адресом, который вы используете.
- Используйте один профиль и его cookies для одной идентичности, а не начинайте с нуля при каждом запуске.
Playwright позволяет задать несколько таких параметров в одном месте:
context = browser.new_context(
locale="en-US",
timezone_id="America/New_York",
viewport={"width": 1366, "height": 768},
)
page = context.new_page()
Шаг 3: замедлитесь и ведите себя как посетитель
Автоматизация становится очевидной, когда работает быстрее, чем может человек. Добавляйте разумные паузы между загрузками страниц, не кликайте по одному и тому же элементу в идеальном ритме и не открывайте сотни страниц параллельно с одного адреса. Меньше и медленнее запросы также снижают нагрузку на сайт, а это в любом случае правильно.
Шаг 4: поймите, когда проверка является капчей
Некоторые проверки заканчиваются не блокировкой, а задачей. Вы увидите виджет капчи, и для этого шага нужен токен от решателя. Живой тип капчи в Scarnox сейчас — PopularCaptcha. Руководство по PopularCaptcha на Python показывает, как запрашивать и отправлять токен. Другие виджеты, например Cloudflare Turnstile, в планах, но пока не работают, поэтому сначала посмотрите типы капчи, прежде чем что-то планировать.
Шаг с капчей не означает, что остальная часть вашей настройки верна. Если сайт блокирует каждую headless-сессию независимо от настроек, это ясный сигнал, что владелец не хочет автоматизированного доступа. Уважайте это.
Чего не делать
Не пытайтесь скрыть автоматизацию от сайта, который ее запрещает, и не используйте инструменты обхода обнаружения, чтобы пройти механизмы контроля доступа. Это совсем другой тип проекта, чем тестирование и сбор открытых данных, о которых говорит это руководство. Если вашему проекту нужен доступ, который вам не предоставили, спросите владельца сайта или поищите официальный API или поток данных.
Ответственный парсинг
- Проверьте
robots.txtи условия сайта, прежде чем его автоматизировать. - Держите низкую частоту запросов и кешируйте страницы, которые уже загрузили.
- Считайте блокировку ответом, а не головоломкой, которую нужно обойти.
- Не собирайте персональные данные без законного основания.
Куда двигаться дальше
Если ваша автоматизация нужна для сквозных тестов, подход другой: см. капчу в автоматизированных тестах. Если вы используете Playwright или Puppeteer, обработка капчи в Playwright и Puppeteer объясняет, куда попадает токен.
Начните с бесплатного пробного баланса, карта не нужна: создайте аккаунт и протестируйте поток PopularCaptcha на собственной странице. Актуальные тарифы — на странице цен.