7

LWPを使用してWebページからコンテンツをダウンロードしていますが、ページを待機する時間を制限したいと思います。これは、次のようにlwpで実行されます。

my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->get($url);

そして、これは正常に機能しますが、タイムアウトが制限に達すると、タイムアウトしてスクリプトを続行できなくなります。このタイムアウトを適切に処理して、URLにタイムアウトがあったことを記録してから、次のタイムアウトに進むことができるようにしたいと思います。誰かがこれを行う方法を知っていますか?ありがとう!

4

3 に答える 3

16

LWP::Agentは、エラーのチェックに使用できるHTTP::Responseget()オブジェクトを返します。

use LWP::Agent;
use HTTP::Status ();

my $ua = LWP::UserAgent->new;
$ua->timeout(10);
my $response = $ua->get($url);

if ($response->is_error) {
    printf "[%d] %s\n", $response->code, $response->message;

    # record the timeout
    if ($response->code == HTTP::Status::HTTP_REQUEST_TIMEOUT) {
        ...
    }
}

ところで、最近のより良い方法は、代わりにTry::Tinyeval {...}を使用することです。それはあなたを与えますtry {...} catch {...}。また、チェックに関するいくつかの問題を解決しますif $@(ドキュメントの背景セクションを参照してくださいTry::Tiny)。

于 2012-06-12T03:14:00.250 に答える
2

ほとんどの目的では、LWP::UserAgent のタイムアウトで十分ですが、いくつかの欠点があります。システム コールの集合ではなく、各システム コールに適用されます。固定のタイムアウト期間が本当に必要な場合、これはLWPx::ParanoidAgentが処理することの 1 つです。

于 2012-06-12T03:53:48.310 に答える
1

eval ブロッ​​クを使用して、Perl の try{} catch {} と同等のことを行うことができます。

http://perldoc.perl.org/functions/eval.html

于 2012-06-12T02:37:18.580 に答える