Перейти к основному содержимому

Архивация динамических (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 и в структуре конкретного сайта, можно пойти более адресным путём.

Шаги​

  1. Открыть сайт в браузере с открытым DevTools.
  2. На вкладке Network найти AJAX-эндпоинты: обычно это пути вроде /-/api/..., /api/v2/..., /graphql.
  3. Скопировать шаблоны URL (с заменяемыми параметрами id, page, cursor).
  4. Скачать ответы программно — например, через curl или filegetter.
  5. Собрать HTML-карточки из полученных JSON (если ответы уже отдают готовый HTML — приём тривиальный; если JSON — нужен парсер).
  6. Обернуть результат в 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-снимком​

Если сайт постепенно выдаёт контент порциями, можно скомбинировать:

  1. Снять HTML-снимок оболочки (wget) — для навигации и шапки.
  2. Подгружаемые данные — собрать через Browsertrix/Brozzler.
  3. Слить всё в один 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.

Связанные материалы​

Источник​