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
- Puppeteer стандартная конфигурация браузера + CaptchaAI
- Протокол Chrome DevTools + CaptchaAI
Выберите правильный режим браузера для вашего рабочего процесса CAPTCHA —получите ключ CaptchaAIи решайте CAPTCHA в любой конфигурации.