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::RobotUALWP::UserAgent 的子 class 是为这种情况而设计的。让 WWW::Mechanize 使用它而不是基础 class

可能很简单