Сохранить Интернет: обзор основных решений для Linux

08.01.2026

Илья Замарацких

Linux

Содержание

Наверняка все из нас могли столкнуться с тем, что из Интернета по тем или иным причинам мог пропасть полезный для вас веб-ресурс или доступ к нему. Во избежание такой ситуации я изучил и подготовил сравнение инструментов, которые позволят сохранить контент со статических (и динамических в ряде случаев) сайтов для просмотра оффлайн с вашего устройства.

Дисклеймер!

Ваши действия по сбору данных с веб-ресурсов могут быть незаконны или расценены как DDOS-атака, будьте осторожны и внимательны при выполнении подобных действий, уважайте чужой сервер.

wget

Стандартная для большинства дистрибутивов утилита обладает функционалом рекурсивной загрузки по HTML-страницам и их адаптации для относительного вида, что позволяет локально сохранить сайт. При помощи стандартного функционала можно настроить:

Помимо составления дерева файлов, wget может выполнять запись в виде WARC-файла.

Что такое WARC?

WARC - специальный формат для архивирования веб-ресурсов, который сохраняет файлы и их метаданные для последующего открытия при помощи специальных программ.

Спецификация формата

Однопоточная загрузка сайта

# загружать страницы сайта с перерывом в 0.5..1.5 секунды, таймаут загрузки - 30 секунд, три попытки на файл
wget -t=3 --show-progress --timeout=30 --recursive --no-parent --page-requisites --convert-links -U "Mozilla/5.0 (X11; Linux x86_64; rv:145.0) Gecko/20100101 Firefox/145.0" --wait=1 --random-wait --domains <домены для загрузки через запятую> <сайт для загрузки>

Данные будут помещены в директорию с названием домена сайта.

Пример использования на готовом сайте

wget -t=3 --retry-connrefused --retry-on-http-error=429 --show-progress --timeout=30 --no-check-certificate --recursive --no-parent --page-requisites --convert-links -U "Mozilla/5.0 (X11; Linux x86_64; rv:145.0) Gecko/20100101 Firefox/145.0" --wait=1 --random-wait --domains assets.gentoo.org,wiki.gentoo.org --reject-regex "(.*)\?(.*)|.*\.php|.*/(User|Special|Template|Gentoo_Wiki|.*_talk)\:.*" -o wiki-error.log -q https://wiki.gentoo.org
Настраиваемые части команды и их значение
  • -t или --tries - количество попыток
  • --timeout - таймаут на загрузку файла включая все операции в секундах
  • -U - используемое значение User-Agent
  • --wait - время ожидания между загрузками в секундах
  • --random-wait - включить случайный интервал ожидания между 0.5 и 1.5 от указанного
  • --domains - список доменов через запятую для загрузки ресурсов
  • --retry-connrefused - повторять загрузку в случае обрыва соединения
  • --retry-on-http-error - коды ошибок, в случае возникновения которых будет выполняться повторная попытка
  • -e robots=off - игнорировать файл robots.txt. Используйте флаг только если уверены, что robots.txt препятствует сбору данных!
  • --no-check-certificate - не проверять SSL-сертификаты
  • --reject-regex - регулярное выражение URL, которое проверяет, игнорировать ли страницу. При наличии нескольких паттернов, паттерны можно указать через | (см. пример готовой команды)

Загрузка в WARC-файл

Также можно сохранить результат загрузки в WARC-файл при помощи аргумента --warc-file с указанием пути архива (расширение файла будет добавлено автоматически). Также могут пригодиться следующие опции:

Пример загрузки сайта в WARC-файл

Команда сохранит данный сайт в WARC-файл по пути /tmp/test.warc.gz.

wget -t=3 -e robots=off --show-progress --timeout=30 --recursive --no-parent --page-requisites --convert-links -U "Mozilla/5.0 (X11; Linux x86_64; rv:145.0) Gecko/20100101 Firefox/145.0" --wait=1 --random-wait --warc-file /tmp/test --domains mrtstg.ru https://mrtstg.ru

wpull

Wpull - wget-совместимая утилита, написанная на Python Кристофером Фу (Christopher Foo). В отличие от wget, wpull поддерживает прерывание своей работы и продолжение при помощи ведения базы данных в виде файла, параллельную загрузку, а также интеграцию с youtube-dl и PhantomJS для загрузки видеороликов и активации JavaScript на странице, позволяя загружать не только статические сайты.

Wpull поддеживает только Python версии 3.4-3.5, поэтому самый простой способ воспользоваться утилитой - загрузить исполняемый файл с сайта Launchpad.

Внимание!

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

Пример использования

Большая часть опций wpull схожа с wget, с полным списком можно ознакомиться здесь. Пример команды, аналогичный предыдущему примеру:

Почему в примере не проверяется robots.txt?

На текущий момент утилита иногда обратывает файл robots.txt с ошибками, ссылка на Github issue. Для избежания этого поведения выключена обработка подобных файлов (опция --sitemaps) и URL robots.txt добавлено в исключение.

wpull https://mrtstg.ru \
    --no-check-certificate --convert-links --concurrent 8 \
    --no-robots --user-agent "Mozilla/5.0 (X11; Linux x86_64; rv:145.0) Gecko/20100101 Firefox/145.0" \
    --wait 1 --random-wait --waitretry 600 \
    --page-requisites --recursive --level inf \
    --domains mrtstg.ru \
    --escaped-fragment --strip-session-id \
    --tries 3 --retry-connrefused --retry-dns-error \
    --timeout 60 --session-timeout 21600 \
    --database mrtstg.ru.db \
    --output-file mrtstg.ru.log \
    --reject-regex "robots.txt"

Сайт будет сохранен в одноименную с доменом директорию. Обратите внимание, что для загрузки “с нуля” потребуется удалить файл базы данных или поменять ее имя в команде. wpull также поддерживает сохранение результатов в WARC-файл при помощи аргумента --warc-file:

wpull https://mrtstg.ru \
    --warc-file /tmp/mrtstg.ru \
    --no-check-certificate --convert-links --concurrent 8 \
    --no-robots --user-agent "Mozilla/5.0 (X11; Linux x86_64; rv:145.0) Gecko/20100101 Firefox/145.0" \
    --wait 1 --random-wait --waitretry 600 \
    --page-requisites --recursive --level inf \
    --domains mrtstg.ru \
    --escaped-fragment --strip-session-id \
    --tries 3 --retry-connrefused --retry-dns-error \
    --timeout 60 --session-timeout 21600 \
    --database mrtstg.ru.db \
    --output-file mrtstg.ru.log \
    --reject-regex "robots.txt"

Будет создан архив /tmp/mrtstg.ru.warc.gz.

grab-site

grab-site - преднастроеный веб-краулер от создателей wpull. В отличие от wpull, grab-site обладает веб-панелью для вывода логов, поддеживает более новые версии Python, позволяет реконфигурировать параметры загрузки сайтов (например, списки игнорируемых URL и количество параллельных загрузок) в процессе работы. Из минусов - нет поддержки прерывания и продолжения загрузки, а также сохранение только в WARC-файлы.

Самый простой способ запуска - docker-контейнер. Установите Docker на целевую систему, а далее выполните команду:

# может потребоваться sudo
docker run --detach --restart unless-stopped -p 29000:29000 -v ./data:/data --name warcfactory slang800/grab-site

Данная команда создаст контейнер warcfactory и директорию data в рабочей директории откуда была запущена команда, в ней будут храниться собранные данные. Для того, чтобы поменять это, замените ./data на желаемый вами каталог. После запуска контейнера вы сможете открыть веб-интерфейс по адресу http://127.0.0.1:29000.

Основные команды для управления контейнером следующие:

docker start warcfactory # запустить контейнер
docker stop warcfactory # остановить контейнер
docker rm --force warcfactory # удалить контейнер, данные останутся

Пример использования

Опции для команды сбора данных доступны в репозитории проекта, самая простая команда для запуска сбора данных выглядит следующим образом:

docker exec warcfactory grab-site --no-offsite-links https://mrtstg.ru

После запуска вы сможете увидеть вывод в терминале и в веб-интерфейсе системы. В случае слишком долгой работы, вы можете остановить процесс при помощи комбинации <CTRL-C>

2.png Пример веб-интерфейса

После завершения работы команды, файлы .warc.gz и .cdx вы можете найти в директории ./data/<домен>-<дата>-<хеш импорта из веб-интерфейса>, если вы не изменили путь хранения данных.

Продвинутый пример

В случае необходимости, можно передавать параметры напрямую в wpull, работающий “под капотом”, при помощи опции --wpull-args, но лучше обходиться стандартными опциями. Таким образом можно интегрировать использование youtube-dl и PhantomJS.

docker exec -it warcfactory grab-site 'https://mrtstg.ru' --ua='Mozilla/5.0 (X11; Linux x86_64; rv:145.0) Gecko/20100101 Firefox/145.0' --no-offsite-links --delay=300-500 --no-video --wpull-args='--no-check-certificate'

Игнорирование адресов

В отличие от упомянутых ранее способов, grab-site не принимает на вход регулярные выражения, но позволяет их добавить в процессе работы краулера (или импортировать файл при помощи опции --import-ignores, но это будет сложнее из-за работы из под Docker). Для этого в папке с данными сайтов найдите нужную директорию по имени и найдите там файл ignores и допишите туда регулярные выражения, например:

# набор правил для игнорирования сабреддитов, это пример - замените своими выражениями
^https?://(www|old)\.reddit\.com/gold\?goldtype=
# URLs with utm_ can (hopefully) be safely ignored because reddit also sends
# href=""s without the utm_ trackers.
^https?://(www|old)\.reddit\.com/r/[^/]+/.*[\?&]utm_
^https?://(www|old)\.reddit\.com/r/[^/]+/comments/[a-z0-9]+/[^/]+/[a-z0-9]+
^https?://(www|old)\.reddit\.com/r/[^/]+/comments/[a-z0-9]+.*\?sort=
^https?://(www|old)\.reddit\.com/r/[^/]+/comments/[a-z0-9]+/[^/]+/\.compact
^https?://(www|old)\.reddit\.com/r/[^/]+/(top|new|rising|controversial|gilded|ads)/.+[\?&]after=
^https?://(www|old)\.reddit\.com/r/[^/]+/related/
^https?://(www|old)\.reddit\.com/r/[^/]+/(gilded)?\.mobile\?
^https?://(www|old)\.reddit\.com/r/[^/]+/search/?\?
^https?://(www|old)\.reddit\.com/r/[^/]+/wiki/(revisions|discussions)/user/.+
^https?://(www|old)\.reddit\.com/user/[^/]+/(comments/)?.+[\?&]sort=
^https?://(www|old)\.reddit\.com/.+/\.rss$
\.reddit\.com/message/compose/?\?
^https?://(m|out|simple|amp)\.reddit\.com/

HTTrack

HTTrack - утилита для Linux и Windows, написанная Ксавьером Роше (Xavier Roche) под лицензией GPL3. Она позволяет загрузить сайт локально, воссоздавая дерево файлов при помощи рекурсивного обхода ссылок страниц. Утилита поддерживает достаточную конфигурацию, например:

Из недостатков можно отметить низкую скорость загрузки, а также периодические баги - например, зависание потока загрузки страницы, выявленное при тестировании, что снижает количество рабочих потоков и общую скорость работы.

Пример использования

Установить HTTrack можно из стандартных пакетных репозиториев для большинства дистрибутивов - для установки доступна версия с веб-интерфейсом (webhttrack) и CLI-версия (httrack). Чтобы запустить временный веб-интерфейс введите:

webhttrack
webhttrack --port 30000 # запустить интерфейс на конкретном порту

Пример веб-интерфейса

Для запуска CLI-утилиты:

httrack # запустить интерактивный режим
httrack www.someweb.com/bob/ # запустить загрузку указанного сайта

Какой инструмент лучше выбрать?

ИнструментСкорость работыИнтерфейс взаимодействияГибкость настройкиВозообновляемость загрузкиВывод
grab-siteВысокая, многопоточная загрузкаCLI, отслеживание через веб-интерфейсДинамическая настройка ряда параметров, возможность передачи параметров в wpull, используемый для загрузкиНе реализовано в основном проекте, есть отдельные форкиНаиболее удобный вариант для быстрых и массовых загрузок с возможностью доработки поведения на ходу
wgetНизкая (в сравнении), однопоточная загрузкаCLIДостаточное количество параметров загрузки, настройки не меняются динамическиНет, может быть частично воссоздана опциями загрузкиХороший вариант для быстрого развертывания без необходимости быстрой загрузки с возможностью настройки поведения
wpullВысокая, многопоточная загрузкаCLIАналогичная с wget, интеграция youtube-dl и PhantomJS, настройки не меняются динамическиВозообновление загрузки при помощи ведения базы данныхНеплохой вариант для параллельной загрузки, но возможно возникновение багов и ошибок. Также могут возникнуть затруднения с запуском в современном окружении
HTTrackСредняя, могут возникать проблемы с многопоточной загрузкойCLI, веб-интерфейс, GUI (для ряда систем)Исчерпывающий набор параметров загрузки и фильтрации контентаЗаявлен функционал обновления загруженного сайтаПростой и в меру удобный вариант для небольших задач краулинга

Заключение

В этой статье я постарался собрать основные и наиболее полезные методы сохранения данных из Интернета. В будущих статьях разберемся, как работать с WARC файлами, более сложными сайтами (с аутентификацией и динамическим содержимым) и продвинуто пользоваться описанными инструментами.