wget - Özyinelemeli ve sadece belirli mime türleri / uzantıları nasıl indirilir (ör. yalnızca metin)


22

Tam bir web sitesi nasıl indirilir, ancak tüm ikili dosyalar dikkate alınmaz.

wget-rbayrağı kullanan bu işlevselliğe sahiptir, ancak her şeyi indirir ve bazı web siteleri düşük kaynak kodlu bir makine için çok fazladır ve siteyi indirdiğim belirli bir nedenle kullanılamaz.

İşte kullandığım komut satırı: wget -P 20 -r -l 0 http://www.omardo.com/blog(kendi blogum)


1
wget sadece dosya eki ile filtre uygulayabilir
daisy

@ warl0ck Bunu bilmiyordum, teşekkürler! -A ve -R seçenekleri operasyonlarım için çok faydalı.
Omar Al-Ithawi

Yanıtlar:


21

İzin verilen bir cevap listesi belirleyebilirsiniz. izin verilmeyen dosya adı modelleri:

İzin:

-A LIST
--accept LIST

İzin verilmeyen:

-R LIST
--reject LIST

LIST dosya adı kalıplarının / uzantılarının virgülle ayrılmış listesidir.

Desen belirtmek için aşağıdaki ayrılmış karakterleri kullanabilirsiniz:

  • *
  • ?
  • [
  • ]

Örnekler:

  • sadece PNG dosyalarını indir: -A png
  • CSS dosyalarını indirmeyin: -R css
  • "avatar" ile başlayan PNG dosyalarını indirmeyin: -R avatar*.png

Dosyanın uzantısı yoksa. dosya adından yararlanabileceğiniz bir kalıp yok, MIME türünde ayrıştırmaya ihtiyacınız olacak, sanırım (bkz. Lars Kotthoffs cevabı ).


2

Sen ile wget yama deneyebilirsiniz bu (aynı zamanda burada MIME türüne göre filtreye). Bu yama şimdi oldukça eski, bu yüzden artık çalışmayabilir.


Buna bir şans vermek ... ftp.gnu.org/gnu/wget Zar atmıştım sadece wget'in en yeni versiyonunu bununla donatmak ama şanssız olmak. Düzeltme ekini güncellemeye çalışırdım ama açıkçası bir cips olmamıştır. Yazdığı wget versiyonunu kapmayı ve çalışmasını sağladım. Ssl desteğini derlerken sorun yaşadım çünkü hangi openssl sürümünü almam gerektiğine karar veremedim.
MageProspero

bu harika görünüyor. Bu yamanın neden henüz kabullenmediği hakkında bir fikrin var mı (dört yıl sonra)?
David Portabella

2

Yeni bir Wget (Wget2) zaten bir özelliğe sahip:

--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 bugün itibariyle piyasaya sürülmedi, ancak yakında olacak. Debian'ın kararsız hali hazırda gönderilen bir alfa versiyonuna sahiptir.

Daha fazla bilgi için https://gitlab.com/gnuwget/wget2 adresini ziyaret edin . Soruları / yorumları doğrudan bug-wget@gnu.org adresine gönderebilirsiniz.


1

Scrapy kullanmak için tamamen farklı bir yaklaşım denedim, ancak aynı problem var! İşte nasıl çözdüm : SO: Python Scrapy - metin olmayan dosya indirmelerini önlemek için mimetype tabanlı filtre?

Çözüm bir Node.jsproxy ayarlamak ve Scrapy'yi http_proxyortam değişkeni aracılığıyla kullanacak şekilde yapılandırmaktır .

Ne vekil yapmalıyım:

  • Scrapy'den HTTP istekleri alın ve taranmakta olan sunucuya gönderir. Daha sonra Scrapy'den gelen yanıtı verir, yani tüm HTTP trafiğini engeller.
  • İkili dosyalar için (uyguladığınız bir sezgisel 403 Forbiddentarama temel alınarak) Scrapy'e hata gönderir ve isteği / yanıtı derhal kapatır. Bu, zamandan tasarruf etmenize yardımcı olur, trafik ve Scrapy çökmez.

Örnek Proxy Kodu Gerçekten işe yarıyor!

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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.