【问题标题】:How can I make WWW:Mechanize to not fetch pages twice?如何使 WWW:Mechanize 不获取页面两次?
【发布时间】:2011-01-31 16:40:55
【问题描述】:

我有一个网页抓取应用程序,用 OO Perl 编写。应用程序中使用了单个 WWW::Mechanize 对象。我怎样才能让它不获取相同的 URL 两次,即使第二个 get() 具有相同的 URL 无操作:

my $mech = WWW::Mechanize->new();
my $url = 'http:://google.com';

$mech->get( $url ); # first time, fetch
$mech->get( $url ); # same url, do nothing

【问题讨论】:

    标签: perl www-mechanize


    【解决方案1】:

    你可以继承WWW::Mechanize并重新定义get()方法来做你想做的事:

    package MyMech;
    use base 'WWW::Mechanize';
    
    sub get {
        my $self = shift;
        my($url) = @_;
    
        if (defined $self->res && $self->res->request->uri ne $url) {
            return $self->SUPER::get(@_)
        }
        return $self->res;
    }
    

    【讨论】:

    • 如果 get() 没有被调用 $self->res 是未定义的,这会在第一次获取时抛出“无法在未定义的值上调用方法“请求””。将 sub get 的第 4 行更改为 if ( !$self->res || $self->res->request->uri ne $url) { 以允许调用 get。
    • 这将忽略连续对同一 URL 的第二个请求。我假设 OP 希望在任何时间间隔内缓存响应。
    【解决方案2】:

    WWW::Mechanize::Cached:

    概要

    use WWW::Mechanize::Cached;
    
    my $cacher = WWW::Mechanize::Cached->new;
    $cacher->get( $url );
    

    说明

    使用Cache::Cache 层次结构来实现缓存机制。这可以让一个人执行重复的请求,而不会无礼地敲击服务器。

    【讨论】:

      【解决方案3】:

      您可以将 URL 及其内容存储在哈希中。

      my $mech = WWW::Mechanize->new();
      my $url = 'http://google.com';
      my %response;
      
      $response{$url} = $mech->get($url) unless $response{$url};
      

      【讨论】:

        猜你喜欢
        • 2021-01-25
        • 1970-01-01
        • 1970-01-01
        • 2016-08-25
        • 2018-09-21
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 2014-02-24
        相关资源
        最近更新 更多