wget - Jak pobierać rekurencyjnie i tylko określone typy / rozszerzenia MIME (tj. tylko tekst)


22

Jak pobrać pełną stronę internetową, ale ignorując wszystkie pliki binarne.

wgetma tę funkcję za pomocą -rflagi, ale pobiera wszystko, a niektóre witryny są po prostu zbyt duże dla maszyny o niskim zużyciu zasobów i nie jest to przydatne z konkretnego powodu, dla którego pobieram witrynę.

Oto linia poleceń, której używam: wget -P 20 -r -l 0 http://www.omardo.com/blog(mój własny blog)


1
wget może filtrować tylko z sufiksem pliku
daisy

@ warl0ck Nie wiedziałem o tym, dzięki! Opcje -A i -R są bardzo przydatne w moich operacjach.
Omar Al-Ithawi

Odpowiedzi:


21

Możesz podać listę dozwolonych resp. niedozwolone wzorce nazw plików:

Dozwolony:

-A LIST
--accept LIST

Niedozwolone:

-R LIST
--reject LIST

LIST to rozdzielona przecinkami lista wzorców / rozszerzeń nazw plików.

Aby określić wzorce, możesz użyć następujących znaków zastrzeżonych:

  • *
  • ?
  • [
  • ]

Przykłady:

  • pobieraj tylko pliki PNG: -A png
  • nie pobieraj plików CSS: -R css
  • nie pobieraj plików PNG, które zaczynają się od „awatar”: -R avatar*.png

Jeśli plik nie ma rozszerzenia lub. nazwa pliku nie ma wzorca, z którego mógłbyś skorzystać, chyba trzeba by go parsować typu MIME (patrz odpowiedź Larsa Kotthoffa ).


2

Możesz spróbować załatać wget za pomocą tego (również tutaj ), aby filtrować według typu MIME. Ta łatka jest już dość stara, więc może już nie działać.


Daję temu szansę ... ftp.gnu.org/gnu/wget Rzuciłem kostką po prostu łatając najnowszą wersję wget tym, ale bez powodzenia (oczywiście). Spróbowałbym zaktualizować łatkę, ale szczerze mówiąc, nie mam jeszcze kotletów w c ++, aby nie była to przerwa czasowa. Udało mi się pobrać wersję wget, dla której została napisana, i uruchomić ją. Miałem problem z kompilacją ze wsparciem ssl, ponieważ nie mogłem dowiedzieć się, którą wersję openssl muszę pobrać.
MageProspero

to wygląda świetnie. jakiś pomysł, dlaczego ta łatka nie została jeszcze zaakceptowana (cztery lata później)?
David Portabella,

2

Nowy Wget (Wget2) ma już funkcję:

--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 nie został wydany na dziś, ale wkrótce. Debian niestabilny ma już dostarczoną wersję alfa.

Więcej informacji na stronie https://gitlab.com/gnuwget/wget2 . Możesz zamieszczać pytania / komentarze bezpośrednio na bug-wget@gnu.org.


1

Próbowałem zupełnie innego podejścia do korzystania ze Skrobaczki, jednak ma to ten sam problem! Oto jak to rozwiązałem: SO: Python Scrapy - filtr oparty na mimecie, aby uniknąć pobierania plików nietekstowych?

Rozwiązaniem jest skonfigurowanie Node.jsserwera proxy i skonfigurowanie narzędzia Scrapy do korzystania z niego za pomocą http_proxyzmiennej środowiskowej.

Co powinien zrobić serwer proxy :

  • Pobierz żądania HTTP ze Scrapy i wyślij je do przeszukiwanego serwera. Następnie zwraca odpowiedź od Scrapy, tzn. Przechwytuje cały ruch HTTP.
  • W przypadku plików binarnych (opartych na implementowanej heurystyce) wysyła 403 Forbiddenbłąd do Scrapy i natychmiast zamyka żądanie / odpowiedź. Pomaga to zaoszczędzić czas, ruch i złomowanie nie ulega awarii.

Przykładowy kod proxy, który faktycznie działa!

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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.