Perl WWW::Mechanize 减慢请求以避免 HTTP 代码 429
Perl WWW::Mechanize Slow down requests to avoid HTTP Code 429
我已经编写了一个 Perl 脚本来获取和解析网页、填写一些表格并收集一些信息,但过了一会儿我被服务器拒绝并出现 HTTP 错误 429 Too Many Requests
。我在短时间内向服务器发送了太多请求,因此我的 IP 已被列入黑名单。
我如何才能 "slow down" 我的 requests/script 避免再次发生这种情况并且不伤害任何人?有什么办法可以用 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" 命令是否足够?
您需要检查您正在抓取的网站是否有允许您以这种方式使用它的服务协议。由于带宽需要花钱,因此大多数站点更愿意限制对真人操作员或 Google
等合法索引引擎的访问
您还应该查看您正在窃取的网站的 robots.txt
文件,其中详细说明了允许自动访问的内容。查看 www.robotstxt.org 了解更多信息
请求之间的一个简单的 sleep 30
可能可以让您通过大多数规则,但是 不要 将周期减少到 30
以下
还有一个名为 LWP::RobotUA
的 LWP::UserAgent
的子 class 是为这种情况而设计的。让 WWW::Mechanize
使用它而不是基础 class
可能很简单
我已经编写了一个 Perl 脚本来获取和解析网页、填写一些表格并收集一些信息,但过了一会儿我被服务器拒绝并出现 HTTP 错误 429 Too Many Requests
。我在短时间内向服务器发送了太多请求,因此我的 IP 已被列入黑名单。
我如何才能 "slow down" 我的 requests/script 避免再次发生这种情况并且不伤害任何人?有什么办法可以用 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" 命令是否足够?
您需要检查您正在抓取的网站是否有允许您以这种方式使用它的服务协议。由于带宽需要花钱,因此大多数站点更愿意限制对真人操作员或 Google
等合法索引引擎的访问您还应该查看您正在窃取的网站的 robots.txt
文件,其中详细说明了允许自动访问的内容。查看 www.robotstxt.org 了解更多信息
请求之间的一个简单的 sleep 30
可能可以让您通过大多数规则,但是 不要 将周期减少到 30
还有一个名为 LWP::RobotUA
的 LWP::UserAgent
的子 class 是为这种情况而设计的。让 WWW::Mechanize
使用它而不是基础 class