Архивация динамических (Ajax) сайтов
Современные сайты всё чаще собирают содержимое страницы «на лету» через fetch()/XMLHttpRequest. Контент может подгружаться:
- прокруткой (infinite scroll);
- переключением вкладок и фильтров (без смены URL);
- переходом «вглубь» через модальные окна;
- через приватный API, требующий сессионной cookie.
В любом из этих случаев обычный краулер вроде wget или wpull получает только HTML-оболочку с парой ссылок — основное содержимое остаётся вне WARC. Сайт, который производит впечатление нормально индексируемого, на практике оказывается «пустым» с точки зрения простого веб-архива.
Когда использовать
✅ Подходит, если:
- сайт визуально работает, но в WARC попадает только «оболочка» без статей/карточек;
- URL страницы не меняется при переключении вкладок и фильтров;
- данные подгружаются по наблюдаемому AJAX-эндпоинту (часто видно в DevTools → Network);
- нужно сохранить контент, а не только снимок «морды» сайта.
❌ Не подходит:
- если контент генерируется исключительно из JS-фреймворка без fallback-HTML и без публичного API;
- если для доступа требуется кастомная аутентификация с нестандартной OAuth-схемой;
- если лицензия/ToS явно запрещают индексирование (редко, но бывает — например, тестовые стенды).
Кейс: zapovednik.space
В архиве Ruarxive есть разбор заповедника zapovednik.space. Сайт представляет собой витрину природных фотогалерей — каждая карточка содержит фотографию и описание. При обычном обходе wget/wpull сохраняет только обложку и базовую структуру навигации. Признаки того, что это Ajax-сайт:
- HTML-оболочка имеет фиксированный размер порядка 5 КБайт;
- в исходном коде нет ни одной явной сс ылки на конкретную запись;
- DevTools показывает, что по скроллу браузер запрашивает с
/-/api/feed?cursor=...; - в WARC-индексе (CDX) нет записей об этих страницах.
Два рабочих подхода — ниже.
Подход 1. Headless-браузер (самый универсальный)
Использовать инструмент, который запускает реальный браузер, эмулирует поведение пользователя (скролл, клики, ожидание) и снимает получившийся HTML.
Browsertrix Crawler
docker run -v "$PWD/crawl-data:/crawls/" webrecorder/browsertrix-crawler crawl \
--url https://zapovednik.space/ \
--generateWacz \
--scope page \
--waitUntil domcontentloaded \
--timeout 90 \
--delay 0.5
--scope page— обходит всё, что достижимо по кликам со стартовой страницы.--waitUntil domcontentloaded— начинает обход сразу после загрузки DOM.--timeout 90— даёт времени до 90 секунд на скрипты.--delay 0.5— пауза между запросами (защита от бана).
Brozzler
Brozzler — Java-система для распределённого обхода с встроенным Chromium. Используется, когда нужна долгая многоуровневая работа с сессией.
brozzler-new-job -i warp01 -o out.warc.gz -s https://zapovednik.space/
Подходит, если нужно проходить полноценные сценарии: «авторизация → поиск → фильтр → сохранение карточки».
Подход 2. Ручной JS-сниффинг
Если вы разбираетесь в JS и в структуре конкретного сайта, можно пойти более адресным путём.
Шаги
- Открыть сайт в браузере с открытым DevTools.
- На вкладке Network найти AJAX-эндпоинты: обычно это пути вроде
/-/api/...,/api/v2/...,/graphql. - Скопировать шаблоны URL (с заменяемыми параметрами
id,page,cursor). - Скачать ответы программно — например, через
curlилиfilegetter. - Собрать HTML-карточки из полученных JSON (если ответы уже отдают готовый HTML — приём тривиальный; если JSON — нужен парсер).
- Обернуть результат в WARC, обогатить метаданными
metawarcи опубликовать.
Шаблон для filegetter
patterns:
- url: "https://zapovednik.space/-/api/feed?cursor={cursor}"
headers:
X-Requested-With: "XMLHttpRequest"
output:
directory: "./ajax-content"
download:
threads: 2
delay_ms: 300
Дальше — вручную конвертировать полученные ответы в статический HTML и собрать единый WARC.
Подход 3. Комбинация с HTML-снимком
Если сайт постепенно выдаёт контент порциями, можно скомбинировать:
- Снять HTML-снимок оболочки (wget) — для навигации и шапки.
- Подгружаемые данные — собрать через Browsertrix/Brozzler.
- Слить всё в один WARC при помощи
warcworkerилиwarc2zim, если нужен ZIM-контейнер для офлайн-чтения.
Диагностика: что у вас перед глазами Ajax-сайт?
Признаки быстрого распознавания:
- Размер HTML-оболочки меньше 10 КБ, а сайт визуально «большой».
- В HTML нет ссылок на подразделы (
grep -c '<a' index.html— десятки ссылок ведут на JS-bundle). - В Wayback Machine сайт есть, но при просмотре сохранённых страниц нет содержимого — только оболочка.
- В DevTools Network десятки
XHR/fetchзапросов по скроллу. - Содержимое появляется только после JS — отключите JS в браузере и посмотрите.
Что делать после архивации
- Проверить WARC через warchaeology и duckdb-warc — убедиться, что контент действительно там, а не только оболочка.
- Индексировать с помощью
metawarc— извлечь текст, метаданные, изображения; собрать статический дамп для просмотра в solrwayback и ли простом pywb. - Полнотекстовый поиск по архиву — через
warc-gptили прямой SQL к DuckDB-индексам WARC.
Связанные материалы
- Browsertrix Crawler — основной инструмент headless-обхода.
- Brozzler — Java-система с встроенным Chromium.
- metawarc — индексирование и извлечение данных из WARC после сбора.
- WARC-инструменты — проверка качества собранного архива.
- Подготовка и планирование — что делать до запуска тяжёлого обхода.
- Ландшафт 2026 — общая картина инструментов и форматов.
- metawarc — индексировать собранные WARC после завершения обхода.
- Кейс Эха Москвы в международных примерах — как другие архивировали крупные проекты.
Источник
- Публикация в Telegram-канале Ruarxive #35 (05.04.2022) — разбор кейса zapovednik.space, объяснение принципов и обзор инструментов.
- Публикация в Telegram-канале Ruarxive #22 (22.03.2022) — что делать, если вы разработчик и хотите помочь с Ajax-сайтами.