【问题标题】:Perl WWW::Mechanize Slow down requests to avoid HTTP Code 429Perl WWW::Mechanize 减慢请求以避免 HTTP 代码 429
【发布时间】: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_stuffmetacpan.org/pod/Time::HiRes 允许您在不到一秒钟的时间内sleep。请记住,您可能违反了您尝试解析的网站的服务条款,并且存在速率限制可能是有原因的。最好问问他们你是否被允许做你正在做的事情。
  • 感谢您的评论!
  • @simbabque: “速率限制可能是有原因的” 我认为这是讽刺?!

标签: perl www-mechanize


【解决方案1】:

您需要检查您正在抓取的网站是否有服务协议允许您以这种方式使用它。由于带宽需要花钱,因此大多数网站更愿意限制对真正的人工操作员或 Google 等合法索引引擎的访问

您还应该查看您正在窃取的站点的 robots.txt 文件,该文件将详细说明允许哪些自动访问。查看www.robotstxt.org了解更多信息

请求之间的简单sleep 30 可能会让您通过大多数规则,但不要将时间段缩短到 30 以下

还有一个名为LWP::RobotUALWP::UserAgent 的子类用于此类情况。让WWW::Mechanize 使用它而不是基类可能很简单

【讨论】:

  • 在这种情况下,睡眠 30 会太多。如果我可以在他们的网站上使用这些东西,我会联系这个网站的管理员。顺便提一句。 LWP::RobotUA 的想法很棒。谢谢!
  • @guyfromnowhere:请求之间的 30 秒是相当标准的。您无法手动提交请求并比这更快地写下结果。如果您想要该站点的数据,请索取它 - 如果他们愿意让您拥有数据库副本,并且如果他们不希望您拥有它,那么他们给您一份数据库副本会便宜得多你不应该为了得到它而触犯法律
  • 是的,完全正确。我会联系他们。
猜你喜欢
  • 2014-05-12
  • 2014-02-16
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多