wget - Cara mengunduh secara rekursif dan hanya tipe-mime / ekstensi tertentu (yaitu hanya teks)

22

Cara mengunduh situs web lengkap, tetapi mengabaikan semua file biner.

wgetmemiliki fungsionalitas ini menggunakan -rbendera tetapi mengunduh semuanya dan beberapa situs web terlalu banyak untuk mesin sumber daya rendah dan itu tidak digunakan karena alasan spesifik saya mengunduh situs.

Inilah baris perintah yang saya gunakan: wget -P 20 -r -l 0 http://www.omardo.com/blog(blog saya sendiri)

Omar Al-Ithawi
sumber
1
wget hanya dapat memfilter dengan akhiran file
daisy
@ warl0ck Saya tidak tahu itu, terima kasih! Opsi -A dan -R sangat berguna untuk operasi saya.
Omar Al-Ithawi

Jawaban:

21

Anda dapat menentukan daftar resp yang diperbolehkan. pola nama file yang tidak diizinkan:

Diizinkan:

-A LIST
--accept LIST

Dilarang:

-R LIST
--reject LIST

LIST adalah daftar pola / ekstensi nama file yang dipisahkan koma.

Anda dapat menggunakan karakter yang dipesan berikut ini untuk menentukan pola:

  • *
  • ?
  • [
  • ]

Contoh:

  • hanya unduh file PNG: -A png
  • jangan mengunduh file CSS: -R css
  • jangan mengunduh file PNG yang dimulai dengan "avatar": -R avatar*.png

Jika file tidak memiliki ekstensi ekstensi. nama file tidak memiliki pola yang dapat Anda manfaatkan, Anda perlu penguraian tipe MIME, saya kira (lihat jawaban Lars Kotthoffs ).

unor
sumber
2

Anda dapat mencoba menambal wget dengan ini (juga di sini ) untuk memfilter menurut jenis MIME. Patch ini sudah cukup tua sekarang, jadi mungkin tidak berfungsi lagi.

Lars Kotthoff
sumber
Memberikan kesempatan ini ... ftp.gnu.org/gnu/wget Saya melempar dadu hanya dengan menambal versi terbaru dari wget dengan ini tetapi tidak berhasil (tentu saja). Saya akan mencoba untuk memperbarui tambalan tetapi saya terus terang tidak memiliki chops di c ++ agar tidak menjadi time sink. Saya berhasil mengambil versi wget yang ditulis untuknya dan menjalankannya. Saya mengalami kesulitan mengkompilasi dengan dukungan ssl karena saya tidak dapat menemukan versi openssl apa yang saya butuhkan.
MageProspero
ini terlihat hebat. tahu mengapa tambalan ini belum diterima (empat tahun kemudian)?
David Portabella
2

Wget baru (Wget2) sudah memiliki fitur:

--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 belum dirilis pada hari ini, tetapi akan segera. Debian tidak stabil sudah memiliki versi alfa yang dikirimkan.

Lihatlah https://gitlab.com/gnuwget/wget2 untuk info lebih lanjut. Anda dapat memposting pertanyaan / komentar langsung ke [email protected].

Sepatu bot Tim Ruehsen
sumber
1

Saya sudah mencoba pendekatan yang sama sekali berbeda dengan menggunakan Scrapy, namun memiliki masalah yang sama! Inilah cara saya menyelesaikannya: SO: Python Scrapy - filter berbasis mimetype untuk menghindari unduhan file non-teks?

Solusinya adalah mengatur Node.jsproxy dan mengkonfigurasi Scrapy untuk menggunakannya melalui http_proxyvariabel lingkungan.

Yang harus dilakukan oleh proxy adalah:

  • Ambil permintaan HTTP dari Scrapy dan kirimkan ke server yang sedang dirayapi. Kemudian itu mengembalikan respon dari ke Scrapy yaitu mencegat semua lalu lintas HTTP.
  • Untuk file biner (berdasarkan heuristik yang Anda terapkan) ia mengirim 403 Forbiddenkesalahan ke Scrapy dan segera menutup permintaan / respons. Ini membantu menghemat waktu, lalu lintas, dan Scrapy tidak akan macet.

Contoh Kode Proksi Itu benar-benar berfungsi!

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);
Omar Al-Ithawi
sumber