wget - Как загрузить рекурсивно и только определенные типы / расширения MIME (т.е. только текст)

22

Как скачать полный сайт, но игнорируя все двоичные файлы.

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

Вот командная строка, которую я использую: wget -P 20 -r -l 0 http://www.omardo.com/blog(мой собственный блог)

Омар Аль-Итави
источник
1
Wget может фильтровать только с суффиксом файла
маргаритка
@ warl0ck Я этого не знал, спасибо! Опции -A и -R очень полезны для моих операций.
Омар Аль-Итави

Ответы:

21

Вы можете указать список разрешенных соотв. запрещенные шаблоны имени файла:

Разрешается:

-A LIST
--accept LIST

Недопустимое:

-R LIST
--reject LIST

LIST разделенный запятыми список шаблонов / расширений имени файла.

Вы можете использовать следующие зарезервированные символы для указания шаблонов:

  • *
  • ?
  • [
  • ]

Примеры:

  • скачивать только файлы PNG: -A png
  • не загружайте файлы CSS: -R css
  • не загружайте файлы PNG, начинающиеся с «аватар»: -R avatar*.png

Если файл не имеет расширения, соответственно имя файла не имеет шаблона, который вы могли бы использовать, я думаю, вам понадобится анализ MIME-типа (см. ответ Lars Kotthoffs ).

ОООНР
источник
2

Вы можете попробовать заплаты Wget с этимздесь ) для фильтра по типу MIME. Этот патч сейчас довольно старый, поэтому он может больше не работать.

Ларс Котхофф
источник
Попробуй ... ftp.gnu.org/gnu/wget Я бросил кубик, просто исправив новейшую версию wget, но без удачи (конечно). Я бы попробовал обновить патч, но, честно говоря, у меня пока нет чопов на с ++, чтобы он не был временным поглотителем. Мне удалось получить версию wget, для которой она была написана, и запустить ее. У меня были проблемы с компиляцией с поддержкой ssl, потому что я не мог понять, какую версию openssl мне нужно было получить.
MageProspero
это выглядит великолепно. Есть идеи, почему этот патч еще не был принят (четыре года спустя)?
Дэвид Портабелла
2

Новый Wget (Wget2) уже имеет функцию:

--filter-mime-type    Specify a list of mime types to be saved or ignored`

### `--filter-mime-type=list`

Specify a comma-separated list of MIME types that will be downloaded.  Elements of list may contain wildcards.
If a MIME type starts with the character '!' it won't be downloaded, this is useful when trying to download
something with exceptions. For example, download everything except images:

  wget2 -r https://<site>/<document> --filter-mime-type=*,\!image/*

It is also useful to download files that are compatible with an application of your system. For instance,
download every file that is compatible with LibreOffice Writer from a website using the recursive mode:

  wget2 -r https://<site>/<document> --filter-mime-type=$(sed -r '/^MimeType=/!d;s/^MimeType=//;s/;/,/g' /usr/share/applications/libreoffice-writer.desktop)

Wget2 не был выпущен на сегодняшний день, но скоро будет. В нестабильной Debian уже есть альфа-версия.

Посмотрите https://gitlab.com/gnuwget/wget2 для получения дополнительной информации. Вы можете отправлять вопросы / комментарии непосредственно на bug-wget@gnu.org.

Тим Рюхсен Rockdaboot
источник
1

Я попробовал совершенно другой подход - использовать Scrapy, но у него та же проблема! Вот как я это решил: SO: Python Scrapy - фильтр на основе mimetype, чтобы избежать загрузки нетекстовых файлов?

Решение состоит в том, чтобы настроить Node.jsпрокси и настроить Scrapy для использования его через http_proxyпеременную среды.

Что прокси должен сделать , это:

  • Получите HTTP-запросы от Scrapy и отправьте их на просматриваемый сервер. Затем он возвращает ответ от Scrapy, т.е. перехватывает весь HTTP-трафик.
  • Для двоичных файлов (основанных на используемой вами эвристике) он отправляет 403 Forbiddenошибку в Scrapy и немедленно закрывает запрос / ответ. Это помогает сэкономить время, трафик и Scrapy не потерпят крах.

Пример прокси-кода, который действительно работает!

http.createServer(function(clientReq, clientRes) {
    var options = {
        host: clientReq.headers['host'],
        port: 80,
        path: clientReq.url,
        method: clientReq.method,
        headers: clientReq.headers
    };


    var fullUrl = clientReq.headers['host'] + clientReq.url;

    var proxyReq = http.request(options, function(proxyRes) {
        var contentType = proxyRes.headers['content-type'] || '';
        if (!contentType.startsWith('text/')) {
            proxyRes.destroy();            
            var httpForbidden = 403;
            clientRes.writeHead(httpForbidden);
            clientRes.write('Binary download is disabled.');
            clientRes.end();
        }

        clientRes.writeHead(proxyRes.statusCode, proxyRes.headers);
        proxyRes.pipe(clientRes);
    });

    proxyReq.on('error', function(e) {
        console.log('problem with clientReq: ' + e.message);
    });

    proxyReq.end();

}).listen(8080);
Омар Аль-Итави
источник