如何使用Perl的WWW :: Mechanize从超时中恢复?

时间:2010-09-22 05:07:41

标签: perl www-mechanize

我正在使用WWW :: Mechanize来读取每隔几秒运行一次的循环中的特定网页。偶尔,'GET'超时并且脚本停止运行。如何从一个这样的超时中恢复,以便它继续循环并在下一次尝试'GET'?

4 个答案:

答案 0 :(得分:3)

使用eval

eval {
    my $resp = $mech->get($url);
    $resp->is_success or die $resp->status_line;
    # your code
};

if ($@) {
    print "Recovered from a GET error\n";    
}

在获取页面时,eval块将捕获任何错误。

答案 1 :(得分:1)

一个选项是实现一个方法来处理超时错误,并在构造时将其作为onerror处理程序挂钩到mech对象中。请参阅文档中的Constructor and Startup

您甚至可以通过设置空错误处理程序来忽略错误,例如:

my $mech = WWW::Mechanize->new( onerror => undef );

但我不建议 - 稍后你会遇到奇怪的问题。

答案 2 :(得分:0)

此解决方案将继续尝试加载页面,直至其正常工作。

do {
    eval {
        $mech->get($url);
    };
} while ($@ ne '');

答案 3 :(得分:0)

要获得更完整的解决方案,可以使用Try :: Tiny :: Retry之类的模块。它使您可以指定要运行的代码块,捕获任何错误,然后重试该代码块可配置的时间。语法很干净。

use WWW::Mechanize();
use Try::Tiny::Retry ':all';

my $mech = WWW::Mechanize->new();
retry {
    $mech->get("https://stackoverflow.com/");
}
on_retry {
    warn("Failed. Retrying. Error was: $_");
}
delay {
    # max of 100 tries, sleeping 5 seconds between each failure
    return if $_[0] >= 100;
    sleep(11 * 1000 * 1000);
}; #don't forget this semicolon

# dump all the links found on the page
print join "\n", map {$_->text } $mech->links;