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

Стратегии сбора архивов сайтов

Запуск кроулера — это 5 минут. Правильно выбранная стратегия — это десять решений, которые определят качество и размер архива через неделю работы. Не существует «правильного» способа собирать сайт — есть диапазон подходов от минимального «только главную» до исчерпывающего «всё включая CSS-псевдоэлементы».

Эта страница — методическая. Конкретные команды — на страницах инструментов (Wget, Browsertrix, wparc). Здесь — принципы.

Размерность стратегии​

Любую стратегию описывают 8 параметров:

┌─────────────────────────────────────────────────────────────┐
│ 1. Scope — какие URL собираем │
│ 2. Depth — максимальная глубина по ссылкам │
│ 3. Breadth — насколько широко в пределах scope │
│ 4. Rate — запросов в секунду к серверу │
│ 5. Mode — HTTP / Browser / API / Hybrid │
│ 6. Auth — публичный / cookies / login │
│ 7. Schedule — однократно / регулярно / по событию │
│ 8. Triggers — что заканчивает сбор (лимит, время, флаг) │
└─────────────────────────────────────────────────────────────┘

Хорошая стратегия фиксирует все 8.

Параметр 1: Scope​

«Что именно мы собираем?»​

ScopeЧто включаетКогда использовать
Single page1 конкретный URLЦитата, страховка
SectionРаздел сайта (/news/)Тематическая архивация
Whole siteВесь сайт по sitemapПолная страховка сайта
DomainВесь домен + поддоменыОрганизация, портал
Multi-domainНесколько связанных доменовМедиахолдинг, гос. холдинг
TimeSliceТолько диапазон дат (например, 2020–2024)Ретроспектива

Как определить scope​

Алгоритм:

  1. Скачать sitemap.xml. Для крупных сайтов — обязательно. Через curl или wget:
    curl https://example.com/sitemap.xml > sitemap.xml
  2. Посмотреть robots.txt. Там могут быть закрытые разделы:
    curl https://example.com/robots.txt
  3. Пройтись по sitemap глазами — увидеть структуру, прикинуть размер.
  4. Решить границы — включаем https://example.com/news/* или весь https://example.com/*?

Типичные scope​

# Только раздел новостей
https://example.com/news/

# Весь сайт, без админки
https://example.com/ --exclude /admin, /user, /login

# Домен + поддомены
*.example.com

# Несколько доменов одной организации
example.com example.org example.ru

Параметр 2: Depth (глубина)​

Глубина — максимальное число «кликов» от seed-страницы.

DepthЧто получимТипичное число страниц
0Только seed-URL1
1Seed + прямые ссылки10–50
2+ ссылки с тех страниц100–500
3+ ещё один уровень1 000–5 000
∞Все достижимыезависит

Правила выбора глубины​

  • Новостной сайт — обычно depth=3 даёт все новости за текущий год; depth=5 — за 5 лет.
  • Корпоративный сайт — depth=2 или depth=3 покрывает 90 % страниц.
  • Форум — часто требует depth=∞ с фильтром по дате (т. к. темы ссылаются друг на друга).
  • SPA — кроулер не идёт «глубиной», потому что JS рендерит всё с одной страницы; используйте behaviors (autoscroll).

Превышение бюджета​

Что делать, когда depth=∞ собирает 100 000 страниц и не заканчивается:

  • Установить max_pages (например, 50 000).
  • Установить max_size (например, 50 ГБ).
  • Установить max_duration (например, 1 неделя).
  • Фильтровать по URL-паттерну (см. ниже).

Параметр 3: Breadth (ширина)​

В пределах фиксированного scope — насколько широко собирать.

Два крайних подхода​

Фокусный сбор (точечный):

/news/2024/*   → все материалы за 2024 год
/stats/2024/* → все статистические отчёты за 2024

Плюс: предсказуемый размер, ясная цель. Минус: можно пропустить контекст.

Широкий сбор (исчерпывающий):

/*  → весь сайт

Плюс: ничего не пропустим. Минус: огромный размер, шум, дублирование, возможные сюрпризы (cookies-бан).

Параметр 4: Rate (темп запросов)​

Сколько запросов в секунду к серверу — это этика + техническое ограничение.

Как определить правильный rate​

ПризнакРекомендация
Сайт 1000+ уников/день1 запрос/сек — безопасно
Сайт 100 уников/день0.5 запроса/сек — желательно
Сайт в РФ, не уверены в нагрузке0.1 запроса/сек — осторожно
У сайта есть API с документациейИспользуйте rate из их доков
Сервер отвечает 503 / 429Снизить rate в 2–3 раза
Используем bot — мы «гость»Соблюдайте robots.txt Crawl-delay

Реализация rate​

В Wget:

wget --wait=1 --random-wait --limit-rate=500k https://example.com/

В Browsertrix:

behaviorOptions:
- name: limit
rate: 1 # запрос/сек на хост
- name: overrideBehavior
url: https://example.com/
rate: 0.5

В Wpull:

wpull --wait=1 --random-wait https://example.com/

Соблюдение Crawl-delay​

robots.txt иногда содержит Crawl-delay: 5 — означает «не чаще 1 запроса в 5 секунд». Соблюдайте это, если архивируете с одобрения владельца. Для экстренных архивов — задокументируйте решение.

Параметр 5: Mode (режим)​

РежимКогдаИнструменты
HTTPСтатические сайты без JSwget, Wpull
Browser (HTML rendering)Современные сайты, SPABrowsertrix, Squidwarc
APIСтруктурированные данныеwparc (WordPress), custom scripts с curl
HybridStatic + JS + APIКомбинация: wparc + Browsertrix + curl

Выбор по признакам сайта​

Статический HTML без JS? → HTTP через wget.

SPA с React/Vue/Angular? → Browser через Browsertrix.

WordPress / Drupal / Joomla (есть REST API)? → API через wparc или curl.

Сайт с ограничениями (Cloudflare anti-bot)? → Лучше сразу browser + cookies. Или отказаться от сбора, если это нарушает ToS.

Видео-сайт? → yt-dlp.

Параметр 6: Authentication​

УровеньЧто нужноКогда
PublicНичегоБольшинство правительственных сайтов, открытые блоги
Cookie-basedОдин файл cookiesСайты с согласием на cookies (многие СМИ)
LoginУчётка + cookiesЗакрытые сообщества, личные кабинеты
OAuth/APIТокенС GitHub API, Telegram, Google APIs

[!WARNING] Авторизованная архивация — отдельная правовая зона. Используйте только для публично доступного контента в авторизованной зоне. Не публикуйте чужие cookies.

Параметр 7: Schedule (расписание)​

ТипОписаниеКогда
One-shotОдин прогон, забылиРазовая страховка
CronРегулярный прогонНовостные сайты, гос. сайты
Change-triggeredПо событию (sitemap изменился)Редко обновляемые CMS
ClusterСерия из нескольких прогонов в течение дняБольшие сайты (распределение нагрузки)

Cron-пример для Ruarxive​

# Каждое воскресенье в 02:00 — перезапуск сбора еженедельника
0 2 * * 0 /opt/ruarxive/weekly-archive.sh

# Каждый день в 03:00 — минимальный сбор «только новые материалы»
0 3 * * * /opt/ruarxive/daily-diff-archive.sh

Change-triggered​

Для сайтов, у которых есть RSS или sitemap с lastmod:

# Скрипт проверки обновлений
prev_count=$(cat /tmp/example.com.url_count)
curl -s https://example.com/sitemap.xml | grep -c "<loc>" > /tmp/example.com.url_count
new_count=$(cat /tmp/example.com.url_count)
if [ "$new_count" -gt "$prev_count" ]; then
/opt/ruarxive/archive.sh
fi

Параметр 8: Triggers (когда остановиться)​

Хороший сбор заканчивается по триггеру, а не «по времени сна».

ТриггерЧто значитИспользование
Max pagesСобрано N страниц — стопДефолт для большинства сайтов
Max sizeСобрано N ГБ — стопКогда заранее известен максимум
Max timeПрошло N часов — стопЭкстренные сборы
Sitemap exhaustedВсе URL из sitemap собраныТочные архивы
Error rate> 30 % 5xx ответов — стопЗащита от бана
Done signalЦелевой URL получен — стопСбор «этой страницы и ссылок»

Шаблоны стратегий​

Стратегия A: «Экстренная страховка»​

Scope:        /home, /about, /news (3 страницы)
Depth: 0
Rate: 2 запроса/сек
Mode: Browser (Browsertrix)
Auth: Public
Schedule: One-shot
Trigger: 30 минут или 100 страниц
Use case: Сайт закрывается через час

Стратегия B: «Государственный сайт под защиту»​

Scope:        / и поддомены (www, old, archive)
Depth: ∞ с ограничением 1 000 000 страниц
Rate: 0.5 запроса/сек (соблюдаем robots.txt)
Mode: Browser (Browsertrix) + wget для статики
Auth: Public
Schedule: Cron: ежемесячно
Trigger: Max size 50 ГБ или время 48 часов
Use case: Росреестр, Госдума, ...

Стратегия C: «Тематический новостной раздел»​

Scope:        /news/* /opinion/* /editorial/*
Depth: 3
Rate: 1 запрос/сек
Mode: Browser (Browsertrix), behavior autoscroll
Auth: Public
Schedule: Cron: еженедельно
Trigger: 5 000 страниц или 50 часов
Use case: Архив «Медузы», «Дождя», «Новой»

Стратегия D: «Научная коллекция»​

Scope:        *.example-research.org
Depth: ∞ с фильтром: только .pdf, .csv, .json
Rate: 2 запроса/сек
Mode: curl + API-эндпойнты (если есть)
Auth: API key (если требуется)
Schedule: Change-triggered (RSS)
Trigger: Max 100 ГБ
Use case: Сбор научных датасетов

Стратегия E: «Личный архив ссылок»​

Scope:        1 URL (конкретная статья)
Depth: 0
Rate: мгновенно
Mode: SingleFile или Archive.ph
Auth: Public
Schedule: По запросу
Trigger: 1 страница собрана
Use case: Один исследователь, одна страница

Метрики успеха стратегии​

МетрикаКак измеритьЧто должно быть
Coverage% страниц sitemap, попавших в архив> 95 %
QualityДоля страниц без 4xx/5xx ответов> 90 %
Resources loadДоля подгруженных ресурсов (CSS, JS, images)> 80 %
Size efficiencyМБ/страницазависит от ниши
Time efficiencyСтраниц/часзависит от rate
ReproducibilityДва прогона — одинаковый размер?Да

После каждой крупной архивации — записывайте эти метрики. Они помогут калибровать следующие.

Антипаттерны​

❌ Не собирайте «до бесконечности». Любой сбор должен иметь жёсткий лимит (страниц, размера, времени).

❌ Не игнорируйте robots.txt без причины. Если сайт просит Crawl-delay — соблюдайте. Если раздел закрыт — обходите только в экстренных случаях.

❌ Не запускайте кроулер с rate=10 на маленький сайт. Это видно в логах и приведёт к бану.

❌ Не сохраняйте всё подряд. CSRF-токены, ID сессий, динамические ID — это шум. Настройте exclude-паттерны.

❌ Не используйте режим browser там, где хватает HTTP. Browser-кроулеры в 10–100 раз медленнее и в 10 раз дороже по ресурсам.

❌ Не забывайте WARC-валидацию. Собранный битый WARC — не архив, а мусор. Валидируйте до публикации.

Документирование стратегии​

После выбора стратегии — зафиксируйте её в strategy.md в корне архива. Это нужно для:

  • воспроизводимости через полгода;
  • ответа на вопрос «почему именно так»;
  • обучения новых членов команды.

Минимальный шаблон:

# Стратегия архивации example.com

## Параметры
- Scope: /
- Depth: ∞ (с max_pages=10 000)
- Rate: 0.5 req/s
- Mode: Browser (Browsertrix 1.x)
- Auth: Public
- Schedule: cron еженедельно
- Trigger: 10 000 страниц или 50 ГБ

## Обоснование
[почему именно такие значения]

## Контакты
- Владелец сайта: [...]
- Хостер: [...]
- Куратор: [...]

## Метрики прошлых прогонов
[таблица: дата / страниц / ГБ / длительность / ошибки]

См. также​