Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何使WWW:Mechanize不获取页面两次?_Perl_Www Mechanize - Fatal编程技术网

Perl 如何使WWW:Mechanize不获取页面两次?

Perl 如何使WWW:Mechanize不获取页面两次?,perl,www-mechanize,Perl,Www Mechanize,我有一个web抓取应用程序,用OO Perl编写。应用程序中只使用了一个对象。如何使其不获取相同的URL两次,即使用相同的URL使第二个get()无操作: my $mech = WWW::Mechanize->new(); my $url = 'http:://google.com'; $mech->get( $url ); # first time, fetch $mech->get( $url ); # same url, do nothing 您可以将WWW::Mec

我有一个web抓取应用程序,用OO Perl编写。应用程序中只使用了一个对象。如何使其不获取相同的URL两次,即使用相同的URL使第二个
get()
无操作:

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

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

您可以将
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;
}

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

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

$response{$url} = $mech->get($url) unless $response{$url};
见:

提要 描述 使用层次结构实现缓存机制。这样可以执行重复的请求,而不会不礼貌地敲打服务器


如果尚未调用get(),则$self->res未定义,这会在第一次获取时抛出“无法对未定义的值调用方法”request”。将子get的第4行更改为if(!$self->res | |$self->res->request->uri ne$url){以允许调用get。这将忽略对同一url的连续第二个请求。我假设OP想要的响应将在任何时间间隔内缓存。
use WWW::Mechanize::Cached;

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