wget-特定のMIMEタイプ/拡張子のみを再帰的にダウンロードする方法(テキストのみ)


22

Webサイト全体をダウンロードする方法。ただし、すべてのバイナリファイルを無視します。

wget-rフラグを使用してこの機能がありますが、すべてをダウンロードし、一部のウェブサイトはリソースの少ないマシンには多すぎて、私がサイトをダウンロードしている特定の理由では使用できません。

私が使用するコマンドラインは次のとおりです:(wget -P 20 -r -l 0 http://www.omardo.com/blog自分のブログ)


1
wgetはファイルサフィックスでのみフィルタリングできます
デイジー

@ warl0ck知らなかった、ありがとう!-Aおよび-Rオプションは、操作に非常に役立ちます。
オマールアルイタウィ

回答:


21

許可された応答のリストを指定できます。許可されていないファイル名パターン:

許可:

-A LIST
--accept LIST

不許可:

-R LIST
--reject LIST

LIST ファイル名パターン/拡張子のコンマ区切りリストです。

次の予約文字を使用して、パターンを指定できます。

  • *
  • ?
  • [
  • ]

例:

  • PNGファイルのみをダウンロードします。 -A png
  • CSSファイルをダウンロードしないでください。 -R css
  • 「アバター」で始まるPNGファイルをダウンロードしないでください。 -R avatar*.png

ファイルに拡張子がない場合。ファイル名に使用できるパターンがないため、MIMEタイプの解析が必要になると思います(Lars Kotthoffsの回答を参照)。


2

これを使用して wgetにパッチを適用し(こちら参照)、MIMEタイプでフィルタリングできます。しかし、このパッチは現在かなり古いため、動作しなくなる可能性があります。


これを試してみましょう... ftp.gnu.org/gnu/wget最新バージョンのwgetにパッチを当てるだけで、運はありません(もちろん)。私はパッチを更新しようとしますが、率直に言って、C ++にはまだタイムシンクにならないようにチョップがありません。私はそれが書かれたwgetのバージョンをつかみ、それを実行しました。sslサポートを使用してコンパイルするのに問題がありました。これは、取得する必要があるopensslのバージョンがわからなかったためです。
MageProspero

これは素晴らしいですね。なぜこのパッチがまだ受け入れられていないのか(4年後)
デビッドポルタベラ

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は本日現在リリースされていませんが、まもなくリリースされます。Debian不安定版にはすでにアルファ版が出荷されています。

詳細については、https://gitlab.com/gnuwget/wget2をご覧ください。bug-wget@gnu.orgに直接質問/コメントを投稿できます。


1

Scrapyを使用するというまったく異なるアプローチを試しましたが、同じ問題があります!ここに私がそれを解決した方法があります:SO:Python Scrapy-非テキストファイルのダウンロードを避けるためのMIMEタイプベースのフィルター?

解決策は、Node.jsプロキシを設定し、Scrapyがhttp_proxy環境変数を介してプロキシを使用するように構成することです。

どのようなプロキシがやるべきことは次のとおりです。

  • ScrapyからHTTPリクエストを取得し、クロール対象のサーバーに送信します。次に、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.