スクリプトで text/html コンテンツのみをダウンロードし、ダウンロードにかなり時間がかかる可能性のあるバイナリや画像はダウンロードしないようにします。max_sizeパラメーターについては知っていますが、Content-Type
ヘッダーにチェックを追加したいと思います。これは実行可能ですか?
3 に答える
他の人が指摘しているように、リクエストのHEAD
前にGET
リクエストを実行できます。これは、サーバーに対して礼儀正しくする方法として行う必要があります。これは、実際には接続を中止するのは簡単ですが、Webサーバーが大量のデータの送信とその終了時に大量の作業を中止するのは必ずしも簡単ではないためです。 。
あなたがどれだけ洗練されたいかによって、これを行うにはいくつかの異なる方法があります。
Accept
のみをリストするリクエストとともにヘッダーを送信できますtext/html
。適切に実装されたHTTPサーバー406 Not Acceptable
は、ファイルが何であれ、それを受け入れないと言った場合にステータスを返します。もちろん、彼らはとにかくそれをあなたに送るかもしれません。あなたもあなたのHEAD
要求としてこれを行うことができます。LWP :: UserAgentの最新バージョンを使用する場合、ハンドラーサブルーチンを使用して、ヘッダーの後、コンテンツ本文の前に残りの要求を中止できます。
use LWP::UserAgent; use Try::Tiny; my $ua = LWP::UserAgent->new; $ua->add_handler( response_header => sub { my($response, $ua, $h) = @_; die "Not HTML" unless $response->content_type eq 'text/html'; }); my $url = "http://example.com/foo"; my $html; my $head_response = $ua->head($url, Accept => "text/html"); if ($head_response->is_success) { my $get_response = $ua->get($url, Accept => "text/html"); if ($get_response->is_success) { $html = $get_response->content; } }
ハンドラーの詳細については、LWP::UserAgentドキュメントの「ハンドラー」セクションを参照してください。
スローされた例外をキャッチしていないか、ここで406の応答を慎重に処理するようにしました。読者の練習問題として残しておきます。
HEAD リクエストを使用して、URI のヘッダー情報を照会できます。サーバーがヘッドに応答する場合、厄介なボディを除いて、GET が返すすべてのものを取得します。
次に、MIME タイプに基づいて何をするかを決定できます。
それ以外の場合は、要求する前にファイルの拡張子に依存する必要があります。
の最小LWP::Simple
サブクラスを使用している場合LWP
、head
関数はコンテンツタイプをリストの最初の要素として返します。
だからあなたは書くことができます
use strict;
use warnings;
use LWP::Simple;
for my $url ('http://www.bbc.co.uk') {
my ($ctype) = head $url;
my $content = get $url if $ctype eq 'text/html';
}