使用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/#.##
。
很高兴地说'new'的正确参数叫做'agent',你应该说默认的用户代理字符串是什么 – Borodin
@Borodin:你说得对。我已将这些信息添加到我的答案中。 –
谢谢。看起来奇怪的是,一个网站会为'libwww-perl'返回* Forbidden *,而不是'WWW-Mechanize'。它必须是一个硬编码的排除,而不是一个非常有效的排除! – Borodin