Я пытаюсь очистить данные от https://investors.com, используя Perl / S: R: D.
Поскольку данные, которые я хочу получить, доступны только после входа в систему, первое, что нужно сделать, - это получить страницу входа. Код выглядит следующим образом:
use strict;
use warnings;
use Selenium::Remote::Driver;
my $wait_period = $ENV{ SP_WAIT_PERIOD } ? $ENV{ SP_WAIT_PERIOD } : 5;
my $selen=Selenium::Remote::Driver->new( browser_name => 'firefox' );
print STDERR "INFO: Created new Web Driver instance.\n";
#my $url="https://myibd.investors.com/secure/signin.aspx?eurl=https://www.investors.com/";
my $url="https://www.investors.com/";
$selen->set_timeout( 'page load', 60000);
$selen->set_timeout( 'implicit', 100);
$selen->get( $url );
sleep( $wait_period );
my $fh;
open( $fh, ">", "first_page.htm");
print $fh $selen->get_page_source();
close( $fh );
my $elem;
#eval{ $elem = $selen->find_element( "(//button[\@id='gdpr-accept-button'])" ); };
eval{ $elem = $selen->find_element( "(//a[\@id='signin-link'])" ); };
if ( $@ ) {
die( "ERROR: Could not locate element using xpath " .
"//a[\@id='signin-link']." );
}
my $trials = 0;
my $retcode;
while ( $trials < 10 ) {
eval { $retcode = $elem->click() };
if ( $@ ) {
warn( "ERROR: Could not navigate to login page. $@" );
}
if ( $retcode ) {
print STDERR "Click successful, waiting for page to load ...\n";
sleep( 20 );
last;
}
$trials++;
print STDERR "\$retcode: $retcode\n";
sleep( 1 );
}
open( $fh, ">", "second_page.htm");
print $fh $selen->get_page_source();
close( $fh );
Интересно, что при попытке загрузить первую страницу веб-драйвер перенаправляется на совершенно другую страницу (страницу, инструктирующую пользователя о соответствии GDPR), в отличие от того, что я вижу при загрузке https://investors.com в окно браузера.
Следовательно, кнопка входа не может быть найдена (программным) клиентом, и я получаю (в дополнение к (ошибочному) first_page.htm) следующий вывод на STDERR:
INFO: Created new Web Driver instance.
Wide character in print at ./stock_scraper.pl line 45.
ERROR: Could not locate element using xpath //a[@id='signin-link']. at ./stock_scraper.pl line 55.
Что здесь не так? И: возможно ли войти на сайт, отправив форму «напрямую», то есть без необходимости использовать ссылку для входа на первой странице, например, отправив URI, как я могу сделать это с «нормальным» HTML-форма с использованием GET в качестве метода запроса?