wget - Comment télécharger récursivement et uniquement des types / extensions mime spécifiques (c'est-à-dire du texte uniquement)

22

Comment télécharger un site Web complet, mais en ignorant tous les fichiers binaires.

wgeta cette fonctionnalité en utilisant le -rdrapeau mais il télécharge tout et certains sites Web sont tout simplement trop pour une machine à faibles ressources et ce n'est pas utile pour la raison spécifique que je télécharge le site.

Voici la ligne de commande que j'utilise: wget -P 20 -r -l 0 http://www.omardo.com/blog(mon propre blog)

Omar Al-Ithawi
la source
1
wget ne peut filtrer qu'avec le suffixe du fichier
daisy
@ warl0ck Je ne le savais pas, merci! Les options -A et -R sont très utiles pour mes opérations.
Omar Al-Ithawi

Réponses:

21

Vous pouvez spécifier une liste de resp. modèles de nom de fichier non autorisés:

Permis:

-A LIST
--accept LIST

Interdit:

-R LIST
--reject LIST

LIST est une liste de motifs / extensions de noms de fichiers séparés par des virgules.

Vous pouvez utiliser les caractères réservés suivants pour spécifier des modèles:

  • *
  • ?
  • [
  • ]

Exemples:

  • télécharger uniquement des fichiers PNG: -A png
  • ne téléchargez pas les fichiers CSS: -R css
  • ne téléchargez pas les fichiers PNG commençant par "avatar": -R avatar*.png

Si le fichier n'a pas d'extension resp. le nom de fichier n'a aucun modèle que vous pourriez utiliser, vous auriez besoin d'une analyse de type MIME, je suppose (voir la réponse de Lars Kotthoffs ).

unor
la source
2

Vous pouvez essayer de patcher wget avec ceci (également ici ) pour filtrer par type MIME. Ce patch est assez ancien maintenant, donc il pourrait ne plus fonctionner.

Lars Kotthoff
la source
Donner un coup de feu à ceci ... ftp.gnu.org/gnu/wget J'ai lancé les dés en corrigeant juste la dernière version de wget avec ça mais pas de chance (bien sûr). J'essaierais de mettre à jour le patch mais je n'ai franchement pas encore les côtelettes en c ++ pour que ce ne soit pas un temps qui passe. J'ai réussi à récupérer la version de wget pour laquelle elle a été écrite et à la faire fonctionner. J'ai eu du mal à compiler avec le support SSL parce que je ne pouvais pas comprendre quelle version d'OpenSL j'avais besoin de récupérer.
MageProspero
ça a l'air super. une idée pourquoi ce patch n'a pas encore été accepté (quatre ans plus tard)?
David Portabella
2

Un nouveau Wget (Wget2) a déjà une fonctionnalité:

--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 n'est pas sorti à ce jour, mais le sera bientôt. Debian unstable a déjà une version alpha livrée.

Regardez https://gitlab.com/gnuwget/wget2 pour plus d'informations. Vous pouvez envoyer vos questions / commentaires directement à [email protected].

Tim Ruehsen rockdaboot
la source
1

J'ai essayé une approche totalement différente: utiliser Scrapy, mais il a le même problème! Voici comment je l'ai résolu: SO: Python Scrapy - filtre basé sur mimetype pour éviter les téléchargements de fichiers non texte?

La solution consiste à installer un Node.jsproxy et à configurer Scrapy pour l'utiliser via http_proxyune variable d'environnement.

Ce que le proxy doit faire, c'est:

  • Prenez les requêtes HTTP de Scrapy et envoyez-les au serveur en cours d'analyse. Ensuite, il renvoie la réponse de Scrapy, c'est-à-dire intercepte tout le trafic HTTP.
  • Pour les fichiers binaires (basés sur une heuristique que vous implémentez), il envoie une 403 Forbiddenerreur à Scrapy et ferme immédiatement la demande / réponse. Cela permet d'économiser du temps, du trafic et Scrapy ne se bloque pas.

Exemple de code proxy qui fonctionne réellement!

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);
Omar Al-Ithawi
la source