Webサイト全体をダウンロードする方法。ただし、すべてのバイナリファイルを無視します。
wget
-r
フラグを使用してこの機能がありますが、すべてをダウンロードし、一部のウェブサイトはリソースの少ないマシンには多すぎて、私がサイトをダウンロードしている特定の理由では使用できません。
私が使用するコマンドラインは次のとおりです:(wget -P 20 -r -l 0 http://www.omardo.com/blog
自分のブログ)
Webサイト全体をダウンロードする方法。ただし、すべてのバイナリファイルを無視します。
wget
-r
フラグを使用してこの機能がありますが、すべてをダウンロードし、一部のウェブサイトはリソースの少ないマシンには多すぎて、私がサイトをダウンロードしている特定の理由では使用できません。
私が使用するコマンドラインは次のとおりです:(wget -P 20 -r -l 0 http://www.omardo.com/blog
自分のブログ)
回答:
許可された応答のリストを指定できます。許可されていないファイル名パターン:
許可:
-A LIST
--accept LIST
不許可:
-R LIST
--reject LIST
LIST
ファイル名パターン/拡張子のコンマ区切りリストです。
次の予約文字を使用して、パターンを指定できます。
*
?
[
]
例:
-A png
-R css
-R avatar*.png
ファイルに拡張子がない場合。ファイル名に使用できるパターンがないため、MIMEタイプの解析が必要になると思います(Lars Kotthoffsの回答を参照)。
新しい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に直接質問/コメントを投稿できます。
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);