Perl:某些网站禁止非浏览器请求。但是如何?

时间:2020-04-13 12:18:14

标签: perl lwp-useragent

我正在编写一个简单的Perl脚本,该脚本可从不同站点获取某些页面。这是非侵入性的。我不占用服务器带宽。它可以检索单个页面,而无需加载任何额外的javascript,图像或样式表。

我使用LWP :: UserAgent检索页面。这在大多数网站上都可以正常工作,但是有些网站返回“ 403-错误的请求”错误。相同的页面在我的浏览器中加载得很好。我已经检查了Web浏览器中的请求标头,并在尝试在Perl中检索同一页面时以及每次出现403错误时都进行了复制。这是一个代码段:

use strict;

use LWP::UserAgent;
use HTTP::Cookies;

my $URL = "https://www.betsson.com/en/casino/jackpots";

my $browserObj = LWP::UserAgent->new(
  ssl_opts => { verify_hostname => 0 }
);

# $browserObj->cookie_jar( {} );
my $cookie_jar = HTTP::Cookies->new();
$browserObj->cookie_jar( $cookie_jar );

$browserObj->agent( "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0");
$browserObj->timeout(600);
push @{ $browserObj->requests_redirectable }, 'POST';

my @header = ( 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
               'Accept-Encoding' => 'gzip, deflate, br',
               'Accept-Language' => 'en-US,en;q=0.5',
               'Connection' => 'keep-alive',
               'DNT' => '1',
               'Host' => 'www.bettson.com',
               'Upgrade-Insecure-Requests' => '1'
             );

my $response = $browserObj->get( $URL, @header );
if( $response->is_success ) {
  print "Success!\n";
} else {
  print "Unsuccessfull...\n";
}

这些服务器如何区分真实的浏览器和我的脚本?起初我以为他们在进行一些JavaScript欺骗,但是后来我意识到,要使其正常工作,必须先由浏览器加载页面。但是我立即收到此403错误。

该如何调试?

1 个答案:

答案 0 :(得分:1)

虽然403是机器人检测的典型答案,但在这种情况下,机器人检测不是问题的原因。相反,您代码中的错字是:

Host

在URL中,域名为Host,应该在www.bettson.com标头中反映出来。但是您的my $browserObj = LWP::UserAgent->new(); my $response = $browserObj->get($URL); 标头稍有不同:{{1}}。由于主机标头的名称错误,因此请求被拒绝,并禁止403。

实际上,甚至不需要经历所有这些麻烦,因为看起来根本没有进行机器人检测。即无需设置用户代理和标题,而是简单的:

{{1}}
相关问题