【发布时间】:2016-04-19 09:11:00
【问题描述】:
我编写了一个 Perl 脚本,它将获取和解析网页,填写一些表格并收集一些信息,但过了一会儿,我被服务器拒绝,并显示 HTTP 错误429 Too Many Requests。我在短时间内向服务器发送了太多请求,因此我的 IP 已被列入黑名单。
我怎样才能“放慢”我的请求/脚本以避免再次发生这种情况而不伤害任何人?有什么办法可以用 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...
}
}
通过这些循环,可能会有数千个链接,我只是想减慢它的速度。这些循环中的一些“睡眠”命令是否足够?
【问题讨论】:
-
这取决于服务器允许多少请求。在每个请求之间睡一秒钟很可能会奏效。你必须把它放在你的
foreach循环的末尾,在那里你迭代@new_stuff。 metacpan.org/pod/Time::HiRes 允许您在不到一秒钟的时间内sleep。请记住,您可能违反了您尝试解析的网站的服务条款,并且存在速率限制可能是有原因的。最好问问他们你是否被允许做你正在做的事情。 -
感谢您的评论!
-
@simbabque: “速率限制可能是有原因的” 我认为这是讽刺?!
标签: perl www-mechanize