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

Wpull

Проект почти не развивается

Последний релиз Wpull на PyPI — 2.0.1 (июнь 2016 года). Он требует старых версий зависимостей (Tornado, html5lib) и на современных версиях Python обычно не устанавливается. На практике Wpull используют внутри grab-site: там свой форк ludios_wpull, и для него нужен Python 3.7 или 3.8. Для новых проектов рассмотрите Wget, grab-site или Browsertrix Crawler.

Wpull — Wget-совместимый загрузчик и кроулер, написанный с нуля на Python. Автор — Christopher Foo (chfoo), лицензия GPL-3.0. Это не форк Wget: Wpull заново реализует его интерфейс и использует некоторые алгоритмы Wget. Репозиторий сейчас находится в организации ArchiveTeam: github.com/ArchiveTeam/wpull.

Когда использовать​

✅ Подходит, если нужно:

  • снимать сайт по ссылкам сразу в WARC с Wget-подобным набором флагов;
  • останавливать и возобновлять большой обход: состояние хранится в базе SQLite (--database);
  • расширять логику через Python-плагины (свои правила отбора URL, извлечение ссылок).

❌ Не лучший выбор, если:

  • сайт на WordPress с открытым REST API — возьмите wparc;
  • нужен рендеринг JavaScript — Browsertrix Crawler или Brozzler;
  • нужна простая установка на современной системе — Wget.

Возможности​

  • Wget-совместимые флаги: --recursive, --level, --page-requisites, --span-hosts, --accept-regex, --reject-regex, --wait, --random-wait и др.
  • Запись WARC: --warc-file, --warc-max-size, --warc-cdx, --warc-dedup, --warc-append, --warc-move.
  • Параллельные соединения: --concurrent.
  • База состояния для возобновления: --database.
  • Чтение sitemap.xml: --sitemaps.
  • Тонкая настройка выхода на другие хосты: --span-hosts-allow linked-pages,page-requisites.
  • Плагины на Python: --plugin-script, --plugin-args.
  • Экспериментальная интеграция с PhantomJS (--phantomjs) и youtube-dl (--youtube-dl). Оба проекта устарели, PhantomJS не развивается с 2018 года.

Поддерживается только HTTP/1.x: HTTP/2 в Wpull нет.

Установка​

# официальный пакет (2.0.1, 2016); требует старого Python и зависимостей
pip3 install wpull

Сборка из исходников:

git clone https://github.com/ArchiveTeam/wpull
cd wpull
pip install .

Если установить не получается, проще поставить grab-site по его инструкции: она описывает подходящую версию Python.

Флаги сверены с документацией wpull.readthedocs.io (версия 2.0.1, октябрь 2026). Сам Wpull локально не запускался.

Использование​

Одна страница​

wpull example.com/about

Архивация сайта в WARC​

Пример из README (сокращён):

wpull example.com \
--warc-file example \
--recursive --level inf \
--page-requisites \
--span-hosts-allow linked-pages,page-requisites \
--wait 0.5 --random-wait --waitretry 600 \
--tries 3 --retry-connrefused --retry-dns-error \
--timeout 60 --session-timeout 21600 \
--sitemaps \
--reject-regex "/login\.php" \
--delete-after \
--database example.db \
--output-file example.log
  • --delete-after удаляет скачанные файлы с диска: остаётся только WARC.
  • --database позволяет перезапустить прерванный обход с того же места.
  • По умолчанию Wpull соблюдает robots.txt. В примере README он отключён через --no-robots; решайте сами, нужно ли это.

Большой сайт​

wpull example.com \
--recursive --level 5 \
--warc-file example --warc-max-size 1000000000 --warc-cdx \
--concurrent 2 --wait 1 \
--database example.db

Ограничить объём можно через --quota (общий объём загрузки).

Плагины​

Плагин — класс-наследник wpull.application.plugin.WpullPlugin, который подключается флагом --plugin-script. Функции регистрируются декораторами hook (меняют поведение и возвращают значение) и event (уведомления). Пример по документации:

# skip_logout.py
from wpull.application.plugin import WpullPlugin, PluginFunctions, hook
from wpull.pipeline.session import ItemSession


class SkipLogout(WpullPlugin):
@hook(PluginFunctions.accept_url)
def accept_url(self, item_session: ItemSession, verdict: bool, reasons: dict) -> bool:
if "logout" in item_session.request.url:
return False
return verdict
wpull example.com --recursive --warc-file example --plugin-script skip_logout.py

Другие точки расширения: get_urls (добавить свои URL), handle_response, handle_error, resolve_dns, exit_status. Полный список — в разделе Plugin Scripting Hooks документации.

Сравнение с Wget​

ФункцияWgetWpull
WARC✅ (1.14+)✅
Возобновление большого обхода⚠️ только -N/-c по файлам✅ база SQLite
Параллельные соединения❌✅ --concurrent
JavaScript❌⚠️ PhantomJS, устарел
Плагины❌✅ Python
HTTP/2❌❌
Установка на современной системе✅❌ проблемная

Ограничения​

  • Последний релиз — 2016 года; устанавливается только со старыми версиями Python и зависимостей.
  • Нет HTTP/2 и полноценного рендеринга JavaScript.
  • Медиа с CDN-доменов нужно разрешать явно (--span-hosts-allow, --domains, --hostnames).

Что дальше​

Ресурсы​

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