Содержание статьи
Введение: когда задача упирается в защиту
В практике веб-разработки и автоматизации нередко встречаются задачи, которые на первый взгляд выглядят стандартно. Одна из них — сбор данных с сайтов онлайн-тестов: вопросы, варианты ответов, результаты прохождения.
Однако всё усложняется, когда сайт защищён корпоративными системами безопасности, такими как DDoS-Guard. Прямые HTTP-запросы перестают работать, IP-адреса быстро блокируются, а классические парсеры оказываются бесполезными.
В этом материале команда GLM-DEV делится практическим опытом автоматизации работы с защищёнными сайтами, рассказывает о переходе с Selenium на Playwright и разбирает архитектуру парсера, имитирующего поведение реального пользователя.
Все приведённые примеры предназначены исключительно для изучения принципов автоматизации и работы защитных механизмов.
Почему мы выбрали Playwright
Изначально для решения задачи использовался Selenium в связке с undetected-chromedriver. В ряде случаев это позволяло обходить базовую защиту, но со временем стали заметны ограничения:
- высокая ресурсоёмкость;
- необходимость постоянной ручной донастройки;
- проблемы со стабильностью;
- сложная работа с iframe и вкладками.
После анализа альтернатив мы в GLM-DEV перешли на Playwright — современный инструмент автоматизации от Microsoft, ориентированный на реальные сценарии пользовательского поведения.
Сравнение Selenium, Playwright и Puppeteer
Selenium — зрелый и проверенный временем инструмент с огромным сообществом, но с достаточно громоздким API.
Puppeteer хорошо подходит для Chromium-браузеров, однако ограничен по функциональности и поддержке других движков.
Playwright предлагает:
- единый API для Chromium, Firefox и WebKit;
- встроенные умные ожидания элементов;
- более реалистичную эмуляцию браузера;
- удобную работу с сетью, вкладками и iframe.
Для задач, связанных с защищёнными веб-приложениями, именно Playwright показал наилучший баланс между стабильностью, скоростью и контролем.
Как Playwright помогает работать с защитой DDoS-Guard
Современные системы защиты анализируют не только частоту запросов, но и:
- browser fingerprint;
- признаки автоматизации;
- поведенческие паттерны;
- сетевую активность.
Playwright позволяет управлять браузерным контекстом на низком уровне и максимально приблизить поведение автоматизации к реальному пользователю.
Пример базовой инициализации браузера:
from playwright.sync_api import sync_playwright
def create_stealth_browser(proxy=None):
with sync_playwright() as p:
browser = p.chromium.launch(
headless=False,
args=['--disable-blink-features=AutomationControlled']
)
context = browser.new_context(
viewport={'width': 1920, 'height': 1080},
locale='ru-RU',
timezone_id='Europe/Moscow'
)
page = context.new_page()
page.add_init_script("""
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
""")
return browser, context, page
Как работает парсер онлайн-тестов
Ниже описана общая архитектура парсера без привязки к конкретному сайту.
Общая логика работы
Парсер автоматически:
- открывает страницу теста;
- извлекает структуру вопросов и вариантов ответов;
- формирует возможные комбинации;
- отправляет ответы и анализирует результаты;
- сохраняет данные в файлы для дальнейшего использования.
Все запросы выполняются через прокси, чтобы снизить вероятность блокировок.
Как извлекаются вопросы и варианты ответов
Алгоритм работы парсера:
- Открывается страница теста и анализируется HTML.
- Определяется заголовок теста (title или h1).
- Выполняется поиск блоков вопросов по классам и структуре.
- Для каждого вопроса:
- извлекается текст вопроса;
- находятся варианты ответов;
- варианты связываются с идентификаторами.
- Вопросы нумеруются по порядку.
- Формируется структурированный объект данных.
Результат сохраняется в формате JSON.
Как парсер собирает результаты тестов
Поиск формы теста
Парсер анализирует все формы на странице и выбирает ту, которая содержит максимальное количество вопросов, исключая формы поиска и вспомогательные элементы.
Генерация наборов ответов
Формируются следующие комбинации:
- минимальная (все первые варианты);
- максимальная (все последние варианты);
- медианная;
- случайные комбинации (обычно около 20).
Отправка и анализ результатов
Для каждого набора:
- отправляется POST-запрос;
- парсится страница результата;
- извлекается текст результата;
- определяется диапазон и итоговый балл.
Используются регулярные выражения для поиска числовых значений.
Оптимизация и дедупликация
Парсер:
- предсказывает балл до отправки;
- отслеживает диапазоны результатов;
- исключает дубликаты по тексту;
- сохраняет только уникальные результаты.
Защита от блокировок
В реализации используются базовые защитные меры:
- циклическая смена прокси;
- случайные паузы между действиями;
- повторные попытки при ошибках;
- остановка при обнаружении капчи или блокировки.
Результат работы парсера
В итоге формируются следующие файлы:
- data/tests/название_теста.json — структура теста;
- data/results_full/название_теста.json — все уникальные результаты.
Это позволяет в дальнейшем показывать результат для любого набора ответов без повторных запросов к сайту.
Этика и ответственная автоматизация
Мы в GLM-DEV отдельно подчёркиваем важность ответственного подхода:
- соблюдение правил сайтов;
- работа только с публичными данными;
- ограничение частоты запросов;
- использование подобных решений исключительно в образовательных целях.
Заключение
Переход на Playwright позволил:
- сократить объём кода;
- повысить стабильность;
- упростить отладку;
- улучшить эмуляцию реального пользователя.
Playwright сегодня можно считать новым стандартом автоматизации для современных веб-приложений.





