wget - Come scaricare ricorsivamente e solo specifici tipi / estensioni mime (cioè solo testo)


22

Come scaricare un sito Web completo, ma ignorando tutti i file binari.

wgetha questa funzionalità usando la -rbandiera ma scarica tutto e alcuni siti Web sono troppo per una macchina a bassa risorsa e non serve a nulla per il motivo specifico per cui sto scaricando il sito.

Ecco la riga di comando che uso: wget -P 20 -r -l 0 http://www.omardo.com/blog(il mio blog)


1
wget può filtrare solo con il suffisso del file
daisy

@ warl0ck Non lo sapevo, grazie! Le opzioni -A e -R sono molto utili per le mie operazioni.
Omar Al-Ithawi,

Risposte:


21

È possibile specificare un elenco di resp consentiti. schemi di nome file non consentiti:

Permesso:

-A LIST
--accept LIST

Non consentito:

-R LIST
--reject LIST

LIST è un elenco separato da virgole di modelli / estensioni di file.

È possibile utilizzare i seguenti caratteri riservati per specificare i motivi:

  • *
  • ?
  • [
  • ]

Esempi:

  • scarica solo file PNG: -A png
  • non scaricare file CSS: -R css
  • non scaricare file PNG che iniziano con "avatar": -R avatar*.png

Se il file non ha estensione resp. il nome del file non ha schemi che potresti usare, avresti bisogno di analisi del tipo MIME, immagino (vedi la risposta di Lars Kotthoffs ).


2

Puoi provare a correggere wget con questo (anche qui ) per filtrare per tipo MIME. Questa patch è piuttosto vecchia ora, quindi potrebbe non funzionare più.


Dando una possibilità ... ftp.gnu.org/gnu/wget Ho lanciato i dadi semplicemente rattoppando la versione più recente di wget con questo, ma senza fortuna (ovviamente). Vorrei provare ad aggiornare la patch, ma francamente non ho ancora le braciole in c ++ per non perdere tempo. Sono riuscito a prendere la versione di wget per cui era stato scritto e farlo funzionare. Ho avuto problemi durante la compilazione con il supporto SSL perché non riuscivo a capire quale versione di openssl avevo bisogno di afferrare.
MageProspero

sembra fantastico. qualche idea sul perché questa patch non sia stata ancora accettata (quattro anni dopo)?
David Portabella,

2

Un nuovo Wget (Wget2) ha già funzionalità:

--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 non è stato rilasciato da oggi, ma lo sarà presto. Debian unstable ha già una versione alpha fornita.

Guarda https://gitlab.com/gnuwget/wget2 per maggiori informazioni. Puoi inviare domande / commenti direttamente a bug-wget@gnu.org.


1

Ho provato un approccio completamente diverso è usare Scrapy, tuttavia ha lo stesso problema! Ecco come l'ho risolto: SO: Python Scrapy - filtro basato sul mimetype per evitare download di file non testuali?

La soluzione è installare un Node.jsproxy e configurare Scrapy per usarlo attraverso http_proxyla variabile d'ambiente.

Ciò che il proxy dovrebbe fare è:

  • Accetta le richieste HTTP da Scrapy e le invia al server sottoposto a scansione. Quindi restituisce la risposta da a Scrapy, ovvero intercetta tutto il traffico HTTP.
  • Per i file binari (basati su un'euristica implementata) invia 403 Forbiddenerrori a Scrapy e chiude immediatamente la richiesta / risposta. Questo aiuta a risparmiare tempo, traffico e Scrapy non si arresta in modo anomalo.

Codice proxy di esempio che funziona davvero!

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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.