Сравнения

headless-режим и headed Chrome для решения CAPTCHA

Headless Chrome работает без видимого окна — быстрый, легкий, идеально подходящий для серверов. Но системы CAPTCHA активно обнаруживают безгласный режим. Вот как выбрать правильный режим и решить CAPTCHA в обоих случаях.


Быстрое сравнение

Фактор headless-режим хром Во главе Chrome
Скорость Быстро (без затрат на рендеринг) Медленнее (отрисовывает пользовательский интерфейс)
Память ~100-200 МБ ~300-500 МБ
Развертывание сервера Родной Требуется виртуальный дисплей
Обнаружение CAPTCHA Высокий (обнаруживаемые сигналы) Низкий (выглядит как настоящий пользователь)
Оценка reCAPTCHA v3 0,1-0,3 (диапазон бота) 0,7-0,9 (человеческий диапазон)
Отладка Сложнее (без визуального представления) Легко (см. страницу)
Масштабирование Отлично (небольшое количество ресурсов) Ресурсоемкий

Как CAPTCHA обнаруживает Headless Chrome

Сигналы обнаружения

// Tests that CAPTCHA systems run

// 1. WebDriver flag (biggest tell)
сигнал WebDriver  // true in headless, undefined in real browser

// 2. Chrome object completeness
window.chrome        // Missing or incomplete in headless

// 3. Plugins
navigator.plugins.length  // 0 in headless, 3+ in headed

// 4. WebGL renderer
// Headless: "SwiftShader Renderer"
// Headed:   "ANGLE (NVIDIA GeForce GTX 1080...)"

// 5. User-Agent contains "Headless"
navigator.userAgent.includes("Headless")  // Old Chrome versions

// 6. Screen dimensions
screen.width === 0   // Some headless configs

// 7. Notification permission
Notification.permission  // "denied" in headless without override

Результаты испытаний на обнаружение

Signal               Headed    Headless   New Headless (v112+)
─────────────────────────────────────────────────────────────
webdriver            false     true       true
chrome object        full      partial    improved
plugins              5         0          0
WebGL renderer       ANGLE     Swift      Swift
screen.width         1920      800        800
UA "HeadlessChrome"  no        yes        no (removed)

Новый режим Chrome «без головы» (v112+)

В Chrome 112+ появился --headless=new, который использует ту же кодовую базу, что и Chrome:

from selenium import webdriver

# Old headless (more detectable)
options = webdriver.ChromeOptions()
options.add_argument("--headless")  # Legacy mode

# New headless (less detectable)
options = webdriver.ChromeOptions()
options.add_argument("--headless=new")  # Shares headed rendering

driver = webdriver.Chrome(options=options)

Новый headless-режим исправляет некоторые векторы обнаружения, но по-прежнему предоставляет сигнал WebDriver и не имеет плагинов.


headless-режим + CaptchaAI (Python)

CaptchaAI одинаково хорошо работает в headless-режиме, поскольку он решает CAPTCHA на стороне сервера — режим браузера не влияет на API решения:

import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

API_KEY = "YOUR_API_KEY"
API_URL = "https://ocr.captchaai.com"


def create_headless_driver():
    options = webdriver.ChromeOptions()
    options.add_argument("--headless=new")
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-blink-features=AutomationControlled")
    options.add_argument("--window-size=1920,1080")
    options.add_argument(
        "--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
        "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
    )
    return webdriver.Chrome(options=options)


def solve_captcha(site_url, sitekey):
    resp = requests.post(f"{API_URL}/in.php", data={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": site_url,
        "json": 1,
    })
    task_id = resp.json()["request"]

    for _ in range(60):
        time.sleep(5)
        resp = requests.get(f"{API_URL}/res.php", params={
            "key": API_KEY, "action": "get",
            "id": task_id, "json": 1,
        })
        data = resp.json()
        if data["request"] != "CAPCHA_NOT_READY":
            return data["request"]

    raise TimeoutError("Solve timeout")


# Full headless workflow
driver = create_headless_driver()

try:
    driver.get("https://example.com/form")
    time.sleep(2)

    sitekey = driver.execute_script(
        "return document.querySelector('[data-sitekey]')?.getAttribute('data-sitekey')"
    )

    if sitekey:
        token = solve_captcha(driver.current_url, sitekey)
        driver.execute_script(f"""
            document.querySelector('#g-recaptcha-response').value = '{token}';
        """)
        driver.find_element(By.CSS_SELECTOR, "form").submit()

finally:
    driver.quit()

Направление на серверы (виртуальный дисплей)

Запустите headed Chrome на автономных серверах с помощью Xvfb:

Linux с Xvfb

# Install
sudo apt-get install xvfb

# Run with virtual display
xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" python script.py

Python с PyVirtualDisplay

from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=0, size=(1920, 1080))
display.start()

options = webdriver.ChromeOptions()
# No --headless flag = headed mode in virtual display
options.add_argument("--no-sandbox")
options.add_argument("--window-size=1920,1080")

driver = webdriver.Chrome(options=options)
# Now runs headed Chrome with real rendering, but no physical display

Докер с Xvfb

FROM python:3.12-slim

RUN apt-get update && apt-get install -y \
    xvfb \
    chromium \
    chromium-driver \
    && rm -rf /var/lib/apt/lists/*

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . /app
WORKDIR /app

CMD ["xvfb-run", "--auto-servernum", "python", "main.py"]

headless и скрытые патчи (Node.js)

const puppeteer = require("puppeteer-extra");
const StealthPlugin = require("puppeteer-extra-plugin-стандартная конфигурация браузера");

puppeteer.use(StealthPlugin());

async function headlessStealth() {
  const browser = await puppeteer.launch({
    headless: "new",
    args: [
      "--no-sandbox",
      "--window-size=1920,1080",
      "--disable-blink-features=AutomationControlled",
    ],
  });

  const page = await browser.newPage();
  await page.setViewport({ width: 1920, height: 1080 });

  // Additional стандартная конфигурация браузера patches
  await page.evaluateOnNewDocument(() => {
    Object.defineProperty(navigator, "webdriver", {
      get: () => undefined,
    });

    Object.defineProperty(navigator, "plugins", {
      get: () => [1, 2, 3, 4, 5],
    });
  });

  await page.goto("https://example.com/form");

  // Detect and solve CAPTCHA with CaptchaAI
  const sitekey = await page.evaluate(() =>
    document.querySelector("[data-sitekey]")?.getAttribute("data-sitekey")
  );

  if (sitekey) {
    // Call CaptchaAI API (see other guides for full implementation)
    const token = await solveCaptchaAI(page.url(), sitekey);

    await page.evaluate((t) => {
      document.querySelector("#g-recaptcha-response").value = t;
    }, token);
  }

  await browser.close();
}

Когда использовать каждый режим

Используйте headless-режим, когда:

  • Запуск на серверах /CI без дисплея
  • Масштабирование до 50+ одновременных сеансов
  • Память ограничена
  • CaptchaAI берет на себя решение всех CAPTCHA (режим браузера не имеет значения)

Используйте заголовок, когда:

  • Визуальная отладка потоков CAPTCHA
  • reCAPTCHA v3 Очки имеют значение (более высокие баллы за голову)
  • Целевой сайт специально блокирует headless
  • Запуск на машинах с дисплеями

Используйте заголовок + виртуальный дисплей, когда:

  • Требуется сопротивление обнаружению на уровне головы на серверах.
  • reCAPTCHA v3 дает низкие оценки в headless-режиме
  • Бюджет позволяет использовать дополнительную память (~ 2 раза за сеанс)

Тесты производительности

Сценарий headless-режим Во главе Заголовок + Xvfb
Время запуска ~1 с ~2 с ~2,5 с
Память на вкладку 100-200 МБ 300-500 МБ 300-500 МБ
Загрузка страницы (в среднем) 1,5 с 2,5 с 2,5 с
reCAPTCHA v3 оценка 0,1-0,3 0,7-0,9 0,5-0,8
Макс. одновременно (8 ГБ) 30-40 10-15 10-15
Скорость решения капчи То же (API) То же (API) То же (API)

Ключевая информация: Скорость решения CaptchaAI одинакова независимо от режима браузера. Этот режим влияет только на то, как часто появляются CAPTCHA и на какие оценки reCAPTCHA v3.


Поиск неисправностей

Проблема Причина Исправить
Обнаружено отсутствие головы Флаг сигнал WebDriver Используйте скрытый плагин или патчи CDP.
Низкие оценки v3 в headless-режиме Отсутствуют сигналы рендеринга Переключиться на заголовок + Xvfb
Сбой Xvfb Конфликт отображаемых номеров Используйте --auto-servernum
Высокая память в голове Процесс графического процессора Добавить флаг --disable-gpu
Скриншоты пустые в headless-режиме Неправильный экран просмотра Установить --window-size=1920,1080

Часто задаваемые вопросы

Имеет ли CaptchaAI значение, использую ли я headless или headed?

Нет. CaptchaAI решает CAPTCHA на стороне сервера, используя ключ сайта и URL-адрес. Режим браузера не влияет на решение.

Защищен ли от обнаружения новый headless-режим (--headless=new)?

Это подходящий, чем старый headless, но все равно можно обнаружить. Сайты, проверяющие сигнал WebDriver или количество плагинов, по-прежнему будут отмечать это.

Могу ли я получить балл reCAPTCHA v3 выше 0,7 в headless-режиме?

Редко. headless-режим режим генерирует сигналы, похожие на сигналы бота. Используйте head + Xvfb для получения более высоких результатов или используйте решение CaptchaAI v3, которое возвращает токены с высокими показателями.

Стоит ли мне инвестировать в стандартная конфигурация браузера-патчи или просто использовать CaptchaAI?

Оба. предсказуемая конфигурация браузера снижает частоту CAPTCHA (меньше решений = меньше затрат). CaptchaAI обрабатывает CAPTCHA, которые все еще появляются.


Связанные руководства


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

Комментарии для этой статьи отключены.