当我尝试访问Google时,收到错误消息302 Found
这是代码
use parent qw(LWP::UserAgent);
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
$self->agent("Mozilla/8.0");
$self->timeout(20);
return $self;
}
sub gethtml {
my ($self, $url) = @_;
my $response = $self->get($url);
$response->is_success ?
$response->decoded_content :
$response->status_line;
}
1;
test.pl:
my $spider = Spider->new;
say $spider->gethtml('http://www.google.com/');
我不知道为什么会这样,我已经暂时使用了LWP而没有问题
答案 0 :(得分:3)
当你对一个模块进行子类化并希望重载其中一个方法时,很可能你需要首先执行基类的方法 ,然后添加一些你的方法。拥有。您可以使用SUPER
伪类来执行此操作,该类允许您从基类调用方法。
您的Spider
模块根本没有进行必要的LWP::UserAgent
初始化,因此您的$self
只是对空哈希的引用。看起来应该是这样的
package Spider;
use strict;
use warnings;
use parent 'LWP::UserAgent';
sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
$self->agent('Mozilla/8.0');
$self->timeout(20);
$self;
}
sub gethtml {
my ($self, $url) = @_;
my $response = $self->get($url);
$response->is_success ?
$response->decoded_content :
$response->status_line;
}
1;
顺便说一句,您应该注意不要将带宽从网站上吸走,以便手动访问。很好,尤其要注意遵守robots.txt
文件,该文件说明蜘蛛程序如何访问该网站。你应该看一下为此目的明确写的LWP::RobotUA
。
答案 1 :(得分:-1)
我听到的最后一次LWP::UserAgent
默认情况下不会遵循300式重定向。
尝试使用WWW::Mechanize
。它更适合抓取网络,你可以更好地控制它。