web-dev-qa-db-fra.com

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

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

wget a cette fonctionnalité utilisant le -r Drapeau mais il télécharge tout et certains sites Web sont trop nombreux pour une machine à basse ressource et il n'est pas utile de 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)

23
Omar Al-Ithawi

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

La solution consiste à configurer un Node.js proxy et configurer le skérapie pour l'utiliser à travers http_proxy variable d'environnement.

Ce que le proxy devrait faire est:

  • Prenez des demandes HTTP de Scrapy et l'envoie au serveur étant rampé. Ensuite, cela redonne la réponse de Scrapy I.e. Intercepter tout le trafic HTTP.
  • Pour les fichiers binaires (basé sur une heuristique que vous implémentez) il envoie 403 Forbidden Une erreur de sien et immédiate ferme la demande/réponse. Cela aide à gagner du temps, la circulation et le skérapie ne se planteront 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);
1
Omar Al-Ithawi

Vous pouvez essayer de corriger wget avec - ceci (aussi ici ) à filtrer par type MIME. Ce patch est assez ancien maintenant, donc cela pourrait ne plus fonctionner.

2
Lars Kotthoff