Почему мой Perl-скрипт, использующий WWW-Mechanize, периодически прерывается? - PullRequest
0 голосов
/ 05 декабря 2011

Я пытаюсь написать Perl-скрипт с использованием WWW-Mechanize. Вот мой код:

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 ()".

Я должен подождать некоторое время (около 5 минут), затем он снова начнет работать.

Я работаю в Linux и имею версию WWW-Mechanize 1.66.

Есть идеи, в чем может быть проблема? У меня нет брандмауэра на компьютере или маршрутизаторе. Более того, раскомментирование строки «die ...» не помогает, поскольку она останавливается внутри вызова get (). Я могу попробовать обновить его до последней версии, которая составляет 1,71, но я хотел бы знать, сталкивался ли кто-то еще с этим модулем Perl.

Ответы [ 3 ]

2 голосов
/ 05 декабря 2011

5 минут (300 секунд) - время ожидания по умолчанию.Именно то время ожидания будет возвращено в строке состояния ответа.

my $response = $mech->res;
if (!$response->is_success()) {
   die($response->status_line());
}
0 голосов
/ 09 декабря 2011

Повторить с ожиданием, попробуйте это

## 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-- );
0 голосов
/ 05 декабря 2011

Это проблема целевого сайта.Он показывает

503 Сервис недоступен Нет сервера для обработки этого запроса.

прямо сейчас.

...