WARC-файл: от сырого архива до публикации
TL;DR — WARC — это сырой контейнер с HTTP-ответами. Чтобы им могли пользоваться люди и исследователи, нужно: проверить целостность → построить индекс (CDXJ) → обогатить метаданными → упаковать в WACZ → загрузить в плеер.
Wget, Browsertrix, wpull, Heritrix и почти любой краулер сохраняют результат в формате WARC. Но сам по себе WARC-файл — это просто последовательность HTTP-записей. Чтобы превратить его в полезный архив, нужно пройти несколько этапов обработки. Этот гайд описывает полный путь.
Полный pipeline
┌──────────────┐
│ Скачивание │ wget / Browsertrix / wpull
│ (WARC.gz) │
└──────┬───────┘
↓
┌──────────────┐
│ Валидация │ warcvalid / jwarc — целостность и соответствие стандарту
└──────┬───────┘
↓
┌──────────────┐
│ Индексация │ cdxj-indexer / warcio → CDXJ-файл
└──────┬───────┘
↓
┌──────────────┐
│ Обогащение │ metawarc — извлечение ссылок, заголовков, mime
│ метаданными │
└──────┬───────┘
↓
┌──────────────┐
│ Упаковка │ wacz → ZIP с WARC + CDXJ + datapackage.json
│ в WACZ │
└──────┬───────┘
↓
┌──────────────┐
│ Публикация │ ReplayWeb.Page / pywb / IPWB
│ в плеер │
└──────────────┘
1. Скачивание
Если вы ещё не скачали сайт, начните с одного из гайдов:
- Wget — статические сайты, без JavaScript
- Browsertrix — современные SPA с JavaScript
- wpull — если нужна WARC-совместимая замена wget
- Как создать цифровой архив сайта — обзорная страница
При сохранении через Browsertrix сразу получается WACZ (готовый пакет). С wget и wpull — только WARC, и его нужно паковать вручную.
2. Валидация
Перед публикацией стоит убедиться, что WARC-файл не повреждён и соответствует стандарту.
Быстрая проверка с помощью warcvalid
# Установка
pip install warcvalid
# Проверка
warcvalid my-archive.warc.gz
warcvalid (часть пакета jwarc) проверит:
- корректность WARC-заголовков;
- совпадение длин в заголовке и теле записи;
- валидность gzip-обёртки (если есть).
Проверка на Python через warcio
from warcio.archiveiterator import ArchiveIterator
errors = 0
records = 0
with open('my-archive.warc.gz', 'rb') as stream:
for record in ArchiveIterator(stream):
records += 1
if record.rec_headers is None:
print(f"Ошибка: запись без заголовков")
errors += 1
if record.rec_type not in {'warcinfo', 'request', 'response',
'metadata', 'revisit', 'conversion',
'continuation', 'resource'}:
print(f"Неизвестный тип записи: {record.rec_type}")
errors += 1
print(f"\nЗаписей: {records}, ошибок: {errors}")
Контрольные суммы
Для долгосрочного хранения полезно фиксировать SHA-256 WARC-файла.
sha256sum my-archive.warc.gz > my-archive.warc.gz.sha256
Сохраните файл .sha256 вместе с архивом — это позволит обнаружить повреждение при передаче.
3. Индексация (CDXJ)
Сырой WARC — это «лента» HTTP-записей. Чтобы по нему можно было искать («дайте мне все страницы, на которых встречается слово X»), нужен индекс в формате CDXJ (CDX с JSON-суффиксом).
С помощью cdxj-indexer (Webrecorder)
# Установка
npm install -g @webrecorder/cdxj-indexer
# Индексация
cdxj-indexer my-archive.warc.gz > my-archive.cdxj
С помощью warcio (Python)
from warcio.archiveiterator import ArchiveIterator
import json
with open('my-archive.warc.gz', 'rb') as stream, \
open('my-archive.cdxj', 'w') as out:
for record in ArchiveIterator(stream):
if record.rec_type != 'response':
continue
url = record.rec_headers.get_header('WARC-Target-URI')
date = record.rec_headers.get_header('WARC-Date')
# CDX-формат: SURT URL-время смещение длина
# упрощённый пример
out.write(f"{url} {date} {json.dumps({'status': 'ok'})}\n")
После индексации my-archive.cdxj можно использовать в pywb или ReplayWeb.Page для поиска по архиву.
4. Обогащение метаданными
Чистый WARC содержит только «сырые» HTTP-ответы. Чтобы облегчить анализ, полезно добавить метаданные:
- список ссылок между страницами;
- извлечённый текст без HTML-разметки;
- определение MIME-типа;
- язык страницы;
- дайджест контента (хеш).
В Ruarxive для этого есть инструмент metawarc.
Пример: добавить ссылки между страницами
metawarc --input my-archive.warc.gz \
--output my-archive.enriched.warc.gz \
--extract-links \
--detect-mime
metawarc создаст новый WARC с записями типа metadata для каждой страницы — они ссылаются на исходные response-записи через WARC-Record-ID.
5. Упаковка в WACZ
WACZ — это ZIP-архив с заранее заданной структурой, который содержит:
- один или несколько WARC-файлов;
- CDXJ-индекс;
datapackage.jsonс метаданными коллекции (название, описание, лицензия, автор);- контрольные суммы для каждого файла.
WACZ — это основной формат для ReplayWeb.Page и других современных плееров.
Создание WACZ вручную
# Структура каталога
mkdir -p my-archive-wacz/archive
cp my-archive.warc.gz my-archive-wacz/archive/
cp my-archive.cdxj my-archive-wacz/
# Создаём datapackage.json
cat > my-archive-wacz/datapackage.json << EOF
{
"profile": "data-package",
"wacz_version": "1.1.1",
"title": "Архив сайта example.com",
"description": "Архив сделан 2026-10-07 перед запланированным отключением",
"licenses": [{"name": "cc-by-4.0", "title": "CC-BY 4.0"}],
"resources": [
{
"name": "my-archive.warc.gz",
"path": "archive/my-archive.warc.gz",
"stats": {"bytes": $(stat -c%s my-archive.warc.gz)}
}
]
}
EOF
# Упаковываем
cd my-archive-wacz && zip -r ../my-archive.wacz . && cd ..
Создание WACZ с помощью wacz (Webrecorder)
pip install wacz
wacz create --filename my-archive.wacz \
--title "Архив сайта example.com" \
--description "..." \
my-archive.warc.gz my-archive.cdxj