Headless-браузер виявлено: причини і способи вирішення (2026)
Сайт показує "виявлено headless-браузер" або тихо віддає іншу сторінку вашому автоматизованому браузеру. Сайти так роблять, бо 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-адресою, яку використовуєте.
- Використовуйте один профіль і його cookie для однієї особи, а не починайте з чистого стану при кожному запуску.
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і умови використання сайту, перш ніж його автоматизувати. - Тримайте частоту запитів низькою і кешуйте сторінки, які вже завантажили.
- Сприймайте блокування як відповідь, а не як головоломку, яку треба обійти.
- Не збирайте персональні дані без законної підстави.
Що далі
Якщо ваша автоматизація призначена для end-to-end тестів, підхід інший: див. капча в автоматизованих тестах. Якщо ви використовуєте налаштування Playwright або Puppeteer, обробка капчі в Playwright і Puppeteer пояснює, куди йде токен.
Почніть з безкоштовного пробного кредиту, картка не потрібна: створіть обліковий запис і протестуйте потік PopularCaptcha на власній сторінці. Актуальні ціни дивіться на сторінці тарифів.