使用 LWP::UserAgent 但不使用 WWW::Mechanize 时出现 403 错误

403 error when using LWP::UserAgent but not with WWW::Mechanize

我正在尝试使用 Perl5 和 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:

...For instance,

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

sets your User-Agent to

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

根据 documentation of LWP::UserAgent,您实际想要使用的参数被正确地称为 agent,默认为 libwww-perl/#.####.### 是版本号)。使用 WWW::Mechanize 可以使用相同的参数,但记录的不同默认值是 WWW-Mechanize/#.##.