wget - Як завантажувати рекурсивно і лише певні типи / розширення mime (тобто лише текст)


22

Як завантажити повний веб-сайт, але ігноруючи всі бінарні файли.

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

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


1
wget може фільтрувати лише за допомогою суфікса файлу
Дейзі

@ warl0ck Я не знав цього, дякую! -А та -R варіанти дуже корисні для моїх операцій.
Омар Аль-Ітаві

Відповіді:


21

Ви можете вказати список дозволених респ. заборонені шаблони імен файлів:

Дозволено:

-A LIST
--accept LIST

Заборонено:

-R LIST
--reject LIST

LIST це розділений комами список шаблонів / розширень імен файлів.

Ви можете використовувати такі зарезервовані символи, щоб задати шаблони:

  • *
  • ?
  • [
  • ]

Приклади:

  • завантажуйте лише файли PNG: -A png
  • не завантажуйте файли CSS: -R css
  • не завантажуйте файли PNG, які починаються з "аватара": -R avatar*.png

Якщо файл не має розширення, респ. Ім'я файлу не має шаблону, яким ви могли б скористатися, вам знадобиться розбір типу MIME, я думаю (див. відповідь Ларса Коттоффа ).


2

Ви можете спробувати виправити wget за допомогою цього (також тут ) для фільтра за типом MIME. Зараз цей патч досить старий, тому він більше не може працювати.


Даючи це постріл ... Зробивши ftp.gnu.org/gnu/wget Я розкачав кістки просто підклеюючи нову версію wget цим, але не пощастило (звичайно). Я б спробував оновити виправлення, але я, відверто кажучи, не маю котлет ще в c ++, щоб він не був просіком часу. Мені вдалося схопити версію 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.


1

Я спробував зовсім інший підхід - використовувати Scrap, однак у нього така ж проблема! Ось як я це вирішив: ТАК: Python Scrapy - фільтр на основі міметипу, щоб уникнути завантаження нетекстових файлів?

Рішення полягає в налаштуванні Node.jsпроксі і налаштування Scrap для використання його через http_proxyзмінну середовища.

Що повинен робити проксі :

  • Візьміть HTTP-запити від Scrap і відправляйте їх на сканований сервер. Потім він повертає відповідь на Scrap, тобто перехоплює весь трафік HTTP.
  • Для бінарних файлів (на основі евристичної, яку ви реалізуєте) він надсилає 403 Forbidden помилку Scrap і негайно закриває запит / відповідь. Це допомагає заощадити час, трафік і Scrap не завершаться.

Приклад проксі-коду, який насправді працює!

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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.