使用LWP :: UserAgent时出现403错误,但没有使用WWW :: Mechanize

问题描述:

我试图访问使用Perl5和LWP :: UserAgent的站点。然而,在连接时,脚本将以“403访问被拒绝”消息而死亡。奇怪的部分是它使用WWW :: Mechanize完美地工作,但取回代码完全相同。 通常我会怀疑用户代理是原因,但如前所述,代码在两种情况下都是相同的。使用LWP :: UserAgent时出现403错误,但没有使用WWW :: Mechanize

WWW :: Mechanize和LWP :: UserAgent如何处理可能导致此问题的请求?

下面是一些演示两种不同方法的示例代码。

# Mechanize 
use strict; 
use warnings "all"; 
use WWW::Mechanize; 

my $mech = WWW::Mechanize->new(
    agent_alias => 'Mozilla/5.0', 
    show_progress => 1); 

my $mech->get("www.foo.com"); 

# LWP 
use strict; 
use warnings "all"; 
use LWP::UserAgent; 

my $ua = LWP::UserAgent->new(
    agent_alias => 'Mozilla/5.0', 
    show_progress => 1); 

my $r = $ua->get("www.foo.com"); 

没有agent_alias参数记录,既没有LWP :: UserAgent也没有WWW :: Mechanize。并且也没有agent_alias参数实现。相反参数在两种情况下均被忽略,而使用内置默认值。但默认值不同。对于WWW :: Mechanize,有一个agent_alias方法。从the documentation

...例如,

$mech->agent_alias('Windows IE 6'); 

套你的用户代理

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) 

按照documentation of LWP::UserAgent你实际上要使用的说法是正确的称为agent,默认为libwww-perl/#.####.###是版本号)。使用WWW :: Mechanize可以使用相同的参数,但记录的不同默认值是WWW-Mechanize/#.##

+0

很高兴地说'new'的正确参数叫做'agent',你应该说默认的用户代理字符串是什么 – Borodin

+1

@Borodin:你说得对。我已将这些信息添加到我的答案中。 –

+0

谢谢。看起来奇怪的是,一个网站会为'libwww-perl'返回* Forbidden *,而不是'WWW-Mechanize'。它必须是一个硬编码的排除,而不是一个非常有效的排除! – Borodin