为什么使用WWW-Mechanize的Perl脚本会间歇性地失败?

时间:2011-12-05 05:54:02

标签: perl www-mechanize

我正在尝试使用WWW-Mechanize编写Perl脚本。 这是我的代码:

use DBI;
use JSON;
use WWW::Mechanize;

sub fetch_companies_list
{
    my $url = shift;
    my $browser = WWW::Mechanize->new( stack_depth => 0 );
    my ($content, $json, $parsed_text, $company_name, $company_url);
    eval
    {
        print "Getting the companies list...\n";
        $browser->get( $url );
#       die "Can't get the companies list.\n" unless( $browser->status );
        $content = $browser->content();
#       die "Can't get companies names.\n" unless( $browser->status );
        $json = new JSON;
        $parsed_text = $json->allow_nonref->utf8->relaxed->escape_slash->loose->allow_singlequote->allow_barekey->decode( $content );
        foreach(@$parsed_text)
        {
            $company_name = $_->{name};
            fetch_company_info( $company_name, $browser );
        }
    }
}

fetch_companies_list( "http://api.crunchbase.com/v/1/companies.js" );

问题如下:

  1. 我开始编写完成的脚本。
  2. 我重新启动脚本。该脚本在“$ browser-> get()”。
  3. 中失败

    我必须等待一段时间(约5分钟)然后它会再次开始工作。

    我正在使用Linux并拥有WWW-Mechanize版本1.66。

    知道可能是什么问题吗?我没有在计算机或路由器上安装任何防火墙。 此外,取消注释“die ...”行没有帮助,因为它在get()调用内停止。我可以尝试升级到最新的,即1.71,但我想知道是否有其他人使用这个Perl模块。

3 个答案:

答案 0 :(得分:2)

5分钟(300秒)是默认超时。究竟什么超时将在响应的状态行中返回​​。

my $response = $mech->res;
if (!$response->is_success()) {
   die($response->status_line());
}

答案 1 :(得分:0)

这是目标网站问题。它显示

  

503服务不可用没有服务器可以处理此问题   请求。

现在。

答案 2 :(得分:0)

等待重试,试试这个

## set maximum no of tries
my $retries = 10;
## number of secs to sleep
my $sleep = 1;
do {
    eval {
        print "Getting the companies list...\n";
        $browser->get($url);

        #       die "Can't get the companies list.\n" unless( $browser->status );
        $content = $browser->content();

        #       die "Can't get companies names.\n" unless( $browser->status );
        $json        = new JSON;
        $parsed_text = $json->allow_nonref->utf8->relaxed->escape_slash->loose->allow_singlequote->allow_barekey->decode($content);
        foreach (@$parsed_text) {
            $company_name = $_->{name};
            fetch_company_info( $company_name, $browser );
        }
    };

    if ($@) {
        warn $@;
        ## rest for some time
        sleep($sleep);
        ## increase the value of $sleep exponetially
        $sleep *= 2;
    }
} while ( $@ && $retries-- );