3

我有一个网页抓取应用程序,用 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
4

3 回答 3

7

WWW::Mechanize::Cached

概要

use WWW::Mechanize::Cached;

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

描述

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

于 2010-03-25T14:30:00.430 回答
4

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

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

$response{$url} = $mech->get($url) unless $response{$url};
于 2010-03-25T12:30:25.763 回答
2

您可以子类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;
}
于 2010-03-25T12:14:48.997 回答