wget - Cách tải xuống đệ quy và chỉ các loại mime / tiện ích mở rộng cụ thể (chỉ có văn bản)


22

Làm thế nào để tải xuống một trang web đầy đủ, nhưng bỏ qua tất cả các tệp nhị phân.

wgetcó chức năng này bằng cách sử dụng -rcờ nhưng nó tải xuống mọi thứ và một số trang web chỉ là quá nhiều cho một máy tài nguyên thấp và nó không được sử dụng vì lý do cụ thể tôi đang tải xuống trang web.

Đây là dòng lệnh tôi sử dụng: wget -P 20 -r -l 0 http://www.omardo.com/blog(blog của riêng tôi)


1
wget chỉ có thể lọc với hậu tố tập tin
daisy

@ warl0ck Tôi không biết điều đó, cảm ơn! Tùy chọn -A và -R rất hữu ích cho các hoạt động của tôi.
Omar Al-Ithawi

Câu trả lời:


21

Bạn có thể chỉ định một danh sách cho phép tôn trọng. mẫu tên tệp không được phép:

Được phép:

-A LIST
--accept LIST

Không được phép

-R LIST
--reject LIST

LIST là danh sách các mẫu / phần mở rộng được phân tách bằng dấu phẩy.

Bạn có thể sử dụng các ký tự dành riêng sau để chỉ định các mẫu:

  • *
  • ?
  • [
  • ]

Ví dụ:

  • chỉ tải xuống các tệp PNG: -A png
  • không tải xuống các tệp CSS: -R css
  • không tải xuống các tệp PNG bắt đầu bằng "avatar": -R avatar*.png

Nếu tập tin không có phần mở rộng. Tên tệp không có mẫu nào bạn có thể sử dụng, tôi đoán là bạn cần phân tích cú pháp kiểu MIME (xem câu trả lời của Lars Kotthoffs ).


2

Bạn có thể thử vá wget với cái này (cũng ở đây ) để lọc theo loại MIME. Bản vá này bây giờ khá cũ, vì vậy nó có thể không hoạt động nữa.


Đưa ra một cú đánh ... ftp.gnu.org/gnu/wget Tôi đã gieo xúc xắc khi chỉ vá phiên bản mới nhất của wget với điều này nhưng không có may mắn (tất nhiên). Tôi sẽ cố gắng cập nhật bản vá nhưng tôi thực sự không có các bản dựng trong c ++ để nó không bị chìm trong thời gian. Tôi đã quản lý để lấy phiên bản wget nó được viết cho và chạy nó. Tôi gặp sự cố mặc dù biên dịch với hỗ trợ ssl vì tôi không thể tìm ra phiên bản openssl nào tôi cần lấy.
MageProspero

cái này trông thật tuyệt Bất cứ ý tưởng tại sao bản vá này vẫn chưa được chấp nhận (bốn năm sau)?
David Portabella

2

Một Wget mới (Wget2) đã có tính năng:

--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 đã không được phát hành như ngày hôm nay, nhưng sẽ sớm thôi. Debian không ổn định đã có phiên bản alpha được vận chuyển.

Hãy xem https://gitlab.com/gnuwget/wget2 để biết thêm thông tin. Bạn có thể gửi câu hỏi / nhận xét trực tiếp lên bug-wget@gnu.org.


1

Tôi đã thử một cách tiếp cận hoàn toàn khác là sử dụng Scrapy, tuy nhiên nó có cùng một vấn đề! Đây là cách tôi giải quyết nó: SO: Python Scrapy - bộ lọc dựa trên mimetype để tránh tải xuống tệp không phải văn bản?

Giải pháp là thiết lập Node.jsproxy và cấu hình Scrapy để sử dụng nó thông qua http_proxybiến môi trường.

Những gì proxy nên làm là:

  • Nhận các yêu cầu HTTP từ Scrapy và gửi nó đến máy chủ đang được thu thập thông tin. Sau đó, nó trả lại phản hồi từ Scrapy tức là chặn tất cả lưu lượng HTTP.
  • Đối với các tệp nhị phân (dựa trên một heuristic mà bạn triển khai), nó sẽ gửi 403 Forbiddenlỗi đến Scrapy và ngay lập tức đóng yêu cầu / phản hồi. Điều này giúp tiết kiệm thời gian, giao thông và Scrapy sẽ không gặp sự cố.

Mã Proxy mẫu thực sự hoạt động!

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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.