wget - วิธีดาวน์โหลดแบบซ้ำ ๆ และเฉพาะประเภท mime / ส่วนขยายที่เฉพาะเจาะจง (เช่นข้อความเท่านั้น)


22

วิธีดาวน์โหลดเว็บไซต์แบบเต็ม แต่ไม่ต้องสนใจไฟล์ไบนารีทั้งหมด

wgetมีฟังก์ชั่นนี้ใช้การ-rตั้งค่าสถานะ แต่มันดาวน์โหลดทุกอย่างและบางเว็บไซต์มีมากเกินไปสำหรับเครื่องที่มีทรัพยากรต่ำและมันไม่ได้ใช้งานด้วยเหตุผลเฉพาะที่ฉันดาวน์โหลดเว็บไซต์

นี่คือบรรทัดคำสั่งที่ฉันใช้: wget -P 20 -r -l 0 http://www.omardo.com/blog(บล็อกของตัวเอง)


1
wget สามารถกรองด้วยคำต่อท้ายไฟล์เท่านั้น
daisy

@ warl0ck ฉันไม่ทราบว่าขอบคุณ! ตัวเลือก -A และ -R นั้นมีประโยชน์มากสำหรับการทำงานของฉัน
Omar Al-Ithawi

คำตอบ:


21

คุณสามารถระบุรายการการอนุญาตที่อนุญาตได้ รูปแบบชื่อไฟล์ที่ไม่อนุญาต:

อนุญาต:

-A LIST
--accept LIST

ไม่อนุญาตให้ใช้:

-R LIST
--reject LIST

LIST เป็นรายการของรูปแบบ / นามสกุลของไฟล์ที่คั่นด้วยเครื่องหมายจุลภาค

คุณสามารถใช้อักขระที่สงวนไว้ต่อไปนี้เพื่อระบุรูปแบบ:

  • *
  • ?
  • [
  • ]

ตัวอย่าง:

  • ดาวน์โหลดไฟล์ PNG เท่านั้น: -A png
  • อย่าดาวน์โหลดไฟล์ CSS: -R css
  • อย่าดาวน์โหลดไฟล์ PNG ที่ขึ้นต้นด้วย "avatar": -R avatar*.png

หากไฟล์ไม่มีส่วนขยายการตอบสนอง ชื่อไฟล์ไม่มีรูปแบบที่คุณสามารถใช้ประโยชน์ได้คุณต้องมีการแยกประเภท MIME ฉันเดา (ดูคำตอบ Lars Kotthoffs )


2

คุณอาจจะลองปะกับ wget นี้ (ยังนี่ ) เพื่อกรองตามชนิดไมม์ แต่แพทช์นี้ค่อนข้างเก่าแล้วดังนั้นมันอาจไม่ทำงานอีก


ให้ภาพนี้ ... ftp.gnu.org/gnu/wgetฉันกลิ้งลูกเต๋าไปแล้วก็แค่แพ็คเวอร์ชั่นล่าสุดของ wget ด้วยสิ่งนี้ แต่ก็ไม่มีโชค (แน่นอน) ฉันจะพยายามอัปเดตแพตช์ แต่ฉันก็ยังไม่มี chops ใน c ++ เพื่อที่จะได้ไม่ต้องเสียเวลา ฉันจัดการเพื่อคว้าเวอร์ชันของ wget ที่เขียนขึ้นมาเพื่อให้ทำงานได้ ฉันมีปัญหาในการคอมไพล์ด้วยการสนับสนุน ssl เพราะฉันไม่สามารถหาเวอร์ชันของ openssl ที่ฉันต้องการได้
MageProspero

มันดูดีมาก ความคิดใดที่ว่าทำไมแพทช์นี้ยังไม่ได้รับการยอมรับ (สี่ปีต่อมา)?
David Portabella

2

Wget ใหม่ (Wget2) มีคุณสมบัติอยู่แล้ว:

--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 ยังไม่วางจำหน่าย ณ วันนี้ แต่จะเปิดตัวเร็ว ๆ นี้ เดเบียนไม่เสถียรมีการจัดส่งเวอร์ชันอัลฟ่าแล้ว

ดูที่https://gitlab.com/gnuwget/wget2สำหรับข้อมูลเพิ่มเติม คุณสามารถโพสต์คำถาม / ความคิดเห็นโดยตรงไปที่ bug-wget@gnu.org


1

ฉันได้ลองวิธีที่แตกต่างอย่างสิ้นเชิงคือการใช้ Scrapy แต่มันมีปัญหาเดียวกัน! นี่คือวิธีแก้ไข: SO: Python Scrapy - ตัวกรองแบบ mimetype เพื่อหลีกเลี่ยงการดาวน์โหลดไฟล์ที่ไม่ใช่ข้อความ?

ทางออกคือการตั้งค่าNode.jsพร็อกซีและกำหนดค่า Scrapy เพื่อใช้ผ่านhttp_proxyตัวแปรสภาพแวดล้อม

สิ่งที่proxyควรทำคือ:

  • รับคำขอ HTTP จาก Scrapy และส่งไปยังเซิร์ฟเวอร์ที่กำลังรวบรวมข้อมูล จากนั้นจะให้การตอบกลับจากไปยัง Scrapy เช่นดักการรับส่งข้อมูล HTTP ทั้งหมด
  • สำหรับไฟล์ไบนารี (ขึ้นอยู่กับฮิวริสติกที่คุณใช้) จะส่ง403 Forbiddenข้อผิดพลาดไปยัง Scrapy และปิดคำขอ / ตอบกลับทันที วิธีนี้ช่วยประหยัดเวลาการรับส่งข้อมูลและ Scrapy จะไม่ผิดพลาด

ตัวอย่างรหัสพร็อกซี่ที่ใช้งานได้จริง!

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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.