2016-04-19 3 views
0

Я написал скрипт Perl, который будет извлекать и анализировать веб-страницу, заполнять некоторые формы и собирать некоторую информацию, но через некоторое время мне отказал сервер с Ошибка HTTP 429 Too Many Requests. Я отправил слишком много запросов за короткий промежуток времени на сервер, чтобы мой IP-адрес был включен в черный список.Perl WWW :: Механизировать медленные запросы, чтобы избежать кода HTTP 429

Как я мог «замедлить» мои запросы/сценарий, чтобы избежать этого снова и никому не повредить? Есть ли способ сделать это с помощью модуля Perl WWW::Mechanize?

sub getlinksofall { 

    for my $i (1 .. $maxpages) { 

     $mech->follow_link(url_regex => qr/page$i/i); 
     push @LINKS, $mech->find_all_links(
      url_regex => qr/http:\/\/www\.example\.com\/somestuffs\//i 
     ); 
    } 

    foreach my $links (@LINKS) { 
     push @LINKS2, $links->url(); 
    } 

    @new_stuffs = uniq @LINKS2; 
} 

sub getnumberofpages { 
    push @numberofpages, $mech->content =~ m/\/page(\d+)"/gi; 
    $maxpages = (sort { $b <=> $a } @numberofpages)[0]; 
} 

sub getdataabout { 

    foreach my $stuff (@new_stuffs) { 

     $mech->get($stuff); 

     $g = $mech->content; 
     $t = $mech->content; 
     $s = $mech->content; 

     # ... and than some regex match with some DBI stuff... 
    } 
} 

Этими петлями могут быть тысячи ссылок, и я просто хочу замедлить их. Для этого достаточно некоторая команда «sleep» в этих циклах?

+1

В зависимости от сервера, сколько запросов оно разрешает. Сон на секунду между каждым запросом, скорее всего, будет работать. Вы должны положить его в конец цикла 'foreach', где вы будете перебирать' @ new_stuff'. https://metacpan.org/pod/Time::HiRes позволяет вам «спать» менее чем за секунду. Имейте в виду, что вы можете нарушать условия обслуживания веб-сайта, который вы пытаетесь проанализировать, и что предел ставки может быть там по какой-либо причине. Лучше спросите их, если вам разрешено делать то, что вы делаете. – simbabque

+0

благодарит за ваш комментарий! – guyfromnowhere

+1

@simbabque: * «предел скорости может быть там по какой-то причине» * Я предполагаю, что это саркастично ?! – Borodin

ответ

1

Вам необходимо проверить, есть ли у вас сайт для соскабливания: сервисное соглашение, что позволяет использовать его таким образом. Поскольку пропускная способность стоит денег, большинство сайтов предпочитают ограничивать доступ к реальным операторам или законным механизмам индексирования, например Google.

Вы также должны посмотреть файл robots.txt для сайта, который вы используете, который будет содержать сведения о том, доступ разрешен. Посмотрите на www.robotstxt.org для получения дополнительной информации

Простой sleep 30 между запросами, вероятно, будет в порядке, чтобы получить мимо большинства правил, но не сократить срок ниже 30

Существует также подкласс LWP::UserAgent называемый LWP::RobotUA, который предназначен для ситуаций, подобных этому. Вполне возможно, чтобы получить WWW::Mechanize, чтобы использовать его вместо базового класса

+0

В этом случае Sleep 30 будет слишком большим. Я свяжусь с администраторами этого веб-сайта, если я смогу использовать такие вещи на своем сайте. КПП. Идея LWP :: RobotUA потрясающая. Спасибо! – guyfromnowhere

+0

@guyfromnowhere: 30 секунд между запросами довольно стандартно. Вы не могли отправлять запросы вручную и записывать результаты намного быстрее, чем это. Если вы хотите, чтобы данные сайта запрашивали его, им было бы намного дешевле предоставить вам копию базы данных, если они хотят, чтобы вы ее получили, и если они не хотят, чтобы вы ее получили, вы не должны нарушать закон, чтобы получить его – Borodin

+0

Да, точно. Я свяжусь с ними. – guyfromnowhere

Смежные вопросы