Perl: некоторые сайты блокируют не браузерные запросы. Но как? - PullRequest
1 голос
/ 13 апреля 2020

Я пишу простой Perl скрипт, который выбирает несколько страниц с разных сайтов. Это очень ненавязчиво. Я не беру пропускную способность серверов. Он извлекает одну страницу без загрузки каких-либо дополнительных javascript, изображений или таблиц стилей.

Я использую LWP :: UserAgent для извлечения страниц. Это прекрасно работает на большинстве сайтов, но есть сайты, которые возвращают ошибку «403 - Bad Request». Эти же страницы прекрасно загружаются в моем браузере. Я проверил заголовок запроса от моего веб-браузера и скопировал его точно при попытке получить ту же страницу в 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";
}

Как эти серверы различают guish между реальным браузером и моим скриптом? Сначала я думал, что у них есть какая-то хитрость JavaScript, но потом я понял, что для того, чтобы это работало, сначала нужно загрузить страницу браузером. Но я сразу получаю эту ошибку 403.

Что я могу сделать, чтобы отладить это?

1 Ответ

1 голос
/ 13 апреля 2020

Хотя 403 является типичным ответом для обнаружения ботов, в этом случае обнаружение ботов не является причиной проблемы. Вместо этого опечатка в вашем коде:

my $URL = "https://www.betsson.com/en/casino/jackpots";
...
               'Host' => 'www.bettson.com',

В URL-адресе доменное имя - www.betsson.com, и это должно быть отражено в заголовке Host. Но ваш заголовок Host немного отличается: www.bettson.com. Поскольку заголовок Host имеет неправильное имя, запрос отклоняется с 403 запрещено.

И на самом деле, даже не нужно go преодолевать все эти неприятности, поскольку похоже, что никакого обнаружения ботов вообще не делается. Т.е. не нужно устанавливать user-agent и возиться с заголовками, а просто:

my $browserObj = LWP::UserAgent->new();
my $response = $browserObj->get($URL);
...