无法使用LWP :: Simple获取Web内容但能够从LWP :: UserAgent获取内容

时间:2015-05-12 02:06:45

标签: perl

我正在尝试运行以下代码来解析以下网址的html页面内容

#!/usr/bin/perl
use LWP::Simple;
use HTML::TreeBuilder;
$response = get("http://www.viki.com/");
print $response;

什么都没打印出来。如果从浏览器模拟,这是有效的。

1 个答案:

答案 0 :(得分:2)

当我尝试使用http://www.viki.com访问LWP::UserAgent时,我收到以下回复:

<html><body><h1>403 Forbidden</h1>
Request forbidden by administrative rules.
</body></html>

get中的LWP::Simple子例程实现如下(至少在版本6.13中)。

sub get ($)
{
    my $response = $ua->get(shift);
    return $response->decoded_content if $response->is_success;
    return undef;
}

如您所见,get方法仅在响应成功时返回内容,否则返回undef

来自LWP::UserAgent的回复是403错误,换句话说不是成功。因此,LWP::Simple会为同一网址返回undef

网站(http://www.viki.com)似乎正在检查用户代理字符串,并且仅将内容返回到&#34;有效&#34;用户代理。 LWP::Simple被硬编码为使用LWP::Simple/$VERSION作为用户代理。

如果你真的必须使用LWP::Simple,那么你可以像这样强制用户代理:

use LWP::Simple qw/ get $ua /;

$ua->agent('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0');

print get('http://www.viki.com');

LWP::Simple公开它在内部使用的LWP::UserAgent实例作为可选包含的$ua变量。仍然需要在此实例上配置用户代理以使此特定页面加载。