LWP没有遵循重定向

时间:2014-07-26 07:05:25

标签: perl www-mechanize lwp

当我尝试访问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而没有问题

2 个答案:

答案 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。它更适合抓取网络,你可以更好地控制它。