wget - Wie man rekursiv und nur bestimmte Mime-Typen / Erweiterungen herunterlädt (zB nur Text)


22

So laden Sie eine vollständige Website herunter, ignorieren jedoch alle Binärdateien.

wgetDiese Funktion nutzt das -rFlag, lädt jedoch alles herunter, und einige Websites sind für einen Computer mit geringen Ressourcen einfach zu umfangreich. Dies ist aus dem speziellen Grund, aus dem ich die Website herunterlade, nicht sinnvoll.

Hier ist die Kommandozeile, die ich benutze: wget -P 20 -r -l 0 http://www.omardo.com/blog(mein eigenes Blog)


1
wget kann nur mit Dateiendung filtern
daisy

@ warl0ck Das wusste ich nicht, danke! Die Optionen -A und -R sind für meine Operationen sehr nützlich.
Omar Al-Ithawi

Antworten:


21

Sie können eine Liste der erlaubten bzw. unzulässige Dateinamenmuster:

Dürfen:

-A LIST
--accept LIST

Nicht erlaubt:

-R LIST
--reject LIST

LIST ist eine durch Kommas getrennte Liste von Dateinamenmustern / -erweiterungen.

Sie können die folgenden reservierten Zeichen verwenden, um Muster anzugeben:

  • *
  • ?
  • [
  • ]

Beispiele:

  • Nur PNG-Dateien herunterladen: -A png
  • lade keine CSS-Dateien herunter: -R css
  • lade keine PNG-Dateien herunter, die mit "avatar" beginnen: -R avatar*.png

Wenn die Datei keine Endung hat bzw. Der Dateiname hat kein Muster, das Sie verwenden könnten, Sie müssten MIME-Typ analysieren, denke ich (siehe Lars Kotthoffs Antwort ).


2

Sie könnten versuchen , wget mit Patchen diesem (auch hier ) zu filtern nach MIME - Typ. Dieser Patch ist allerdings schon ziemlich alt, sodass er möglicherweise nicht mehr funktioniert.


Diesem einen Schuss geben ... ftp.gnu.org/gnu/wget Ich habe gewürfelt, als ich gerade die neueste Version von wget gepatcht habe, aber ohne Glück (natürlich). Ich würde versuchen, den Patch zu aktualisieren, aber ich habe ehrlich gesagt noch keine Chops in C ++, damit es keine Zeitsenke ist. Ich habe es geschafft, die Version von wget, für die es geschrieben wurde, zu finden und zum Laufen zu bringen. Ich hatte Probleme beim Kompilieren mit der Unterstützung von ssl, da ich nicht herausfinden konnte, welche Version von openssl ich greifen musste.
MageProspero

das sieht toll aus. Hast du eine Idee, warum dieser Patch noch nicht akzeptiert wurde (vier Jahre später)?
David Portabella

2

Ein neues Wget (Wget2) hat bereits eine Funktion:

--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 wurde bis heute nicht veröffentlicht, wird aber bald veröffentlicht. Debian Unstable hat bereits eine Alpha-Version ausgeliefert.

Weitere Informationen finden Sie unter https://gitlab.com/gnuwget/wget2 . Sie können Fragen / Kommentare direkt an bug-wget@gnu.org senden.


1

Ich habe versucht, einen völlig anderen Ansatz zu verwenden, jedoch hat es das gleiche Problem! So habe ich es gelöst: SO: Python Scrapy - Mimetype-basierter Filter, um das Herunterladen von Nicht-Textdateien zu vermeiden?

Die Lösung besteht darin, einen Node.jsProxy einzurichten und Scrapy für die Verwendung durch http_proxyUmgebungsvariablen zu konfigurieren .

Was der Proxy tun sollte, ist:

  • Nehmen Sie HTTP-Anforderungen von Scrapy entgegen und senden Sie sie an den Server, der gecrawlt wird. Anschließend wird die Antwort von an Scrapy zurückgegeben, dh der gesamte HTTP-Verkehr wird abgefangen.
  • Bei Binärdateien (basierend auf einer von Ihnen implementierten Heuristik) wird ein 403 ForbiddenFehler an Scrapy gesendet und die Anforderung / Antwort sofort geschlossen. Dies spart Zeit, Verkehr und Scrapy stürzt nicht ab.

Beispiel-Proxy-Code Das funktioniert tatsächlich!

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.