Перейти к содержанию

Как сделать оффлайн-копию сайта с документацией через wget

wget - утилита командной строки, есть в каждом Линуксе. Чаще всего применяется для загрузки отдельных файлов по ссылке - когда есть URL не обязательно открывать веб-браузер. Например, документация на wget (и на другие полезные утилиты типа grep и sed) доступна в виде одной HTML-страницы и загружается так:

wget https://www.gnu.org/software/wget/manual/wget.html

Опция -m (mirror)

Менее известная возможность wget - создание оффлайн-копии (зеркала) всего сайта. Включется опциями командной строки:

wget -mpEk https://python-patterns.guide/

Бытует мнение, что современные сайты нагружены скриптами и поэтому их невозможно зеркалировать, тем более через примитивный wget. На самом деле большинство сайтов с документацией - это набор простых страничек и изображений, плюс немного стилей и скриптов. Такое легко зеркалируется, рассмотрим на примере двух генераторов документации:

Sphinx

Особенности генератора документации Sphinx:

  • Документация часто находится не в корне сайта, а на втором уровне, по пути /en/stable - для удобства просмотра можно вырезать лишние уровни
  • Можно не загружать подкаталог _modules - там не особо полезный исходный код в виде HTML-страниц
  • Можно не загружать подкаталог _sources с исходным текстом документации в разметке reStructuredText

Всё это настраивается ключами команды wget. Чтобы не прописывать ключи для каждого сайта, добавлена bash-функция try_mirror_sphinx. Заодно в ней добавлена проверка, чтобы уже загруженные ранее сайты не загружались повторно. Далее идёт 10 вызовов на разных сайтах для примера:

mirror_sphinx.sh
#!/bin/bash

count_slash () {
    (grep -o / <<< "$1") | wc -l
}

try_mirror_sphinx () {
    [[ -d "$1" ]] && return

    wget -mpEk --no-parent --cut-dirs=$(count_slash "$2") \
        -X "/$2/_modules,/$2/_sources" \
        "https://$1/$2"
}

try_mirror_sphinx docs.aiohttp.org en/stable/
try_mirror_sphinx docs.gunicorn.org en/stable/
try_mirror_sphinx docs.litestar.dev 2/
try_mirror_sphinx docs.podman.io en/stable/
try_mirror_sphinx jinja.palletsprojects.com en/stable/
try_mirror_sphinx magicstack.github.io asyncpg/current/
try_mirror_sphinx pip.pypa.io en/stable/
try_mirror_sphinx redis.readthedocs.io en/stable/
try_mirror_sphinx supervisord.org
try_mirror_sphinx www.qemu.org docs/master/

После выполнения этого скрипта получаем оффлайн-документацию указанных проектов.

MkDocs

Особенность генератора документации MkDocs - скрипт и индекс для оффлайн-поиска надо скачивать отдельно. Это делается дополнительными вызовами wget. Для удобства вся работа для заданного домена оформлена в bash-функцию try_mirror_mkdocs:

mirror_mkdocs.sh
#!/bin/bash

try_mirror_mkdocs () {
    [[ -d "$1" ]] && return

    wget -mpEk "https://$1/"

    local worker
    worker=$(grep '"__config"' "$1/index.html" | grep -Eo 'assets/.+\.js')
    # assets/javascripts/workers/search.*.min.js
    wget -m "https://$1/$worker"

    wget -m "https://$1/search/search_index.json"
    ln -s "$1/search/search_index.json" "$1/search/search_index.js"
}

try_mirror_mkdocs www.python-httpx.org
try_mirror_mkdocs www.starlette.io
try_mirror_mkdocs www.uvicorn.org

После выполнения этого скрипта получаем оффлайн-документацию ещё нескольких проектов. В отличие от Sphinx здесь для работы оффлайн-копии необходим веб-сервер, например из Python:

cd www.uvicorn.org
python3 -m http.server 8080