Perl, использование Mechanize для навигации по веб-страницам

У меня есть куча веб-страниц, которые я хотел бы просмотреть с помощью скрипта и получить все содержимое. Я знаю, что ссылка является 18-й ссылкой на каждой странице. У меня есть следующий код в качестве теста, чтобы просто один раз перейти по ссылке и очистить экран:

use strict;
use WWW::Mechanize;

my $start = "http://*some-webpage*";

my $mech = WWW::Mechanize->new( autocheck => 1 );
$mech->get( $start );
open(Output, ">mech_test.txt") or die $!;
$mech->follow_link(url_regex => qr//,  n => 18 );
print Output $mech->response()->content();
close(Output);

К сожалению, ссылка, к которой я пытаюсь получить доступ, не имеет ничего в теге href. Просмотр источника страницы по ссылкам выглядит так:

<a href="" onclick="return _doClick('CA256D6E001A7020.80376e858b0791b1ca256d7300098304/$Body/0.155A', this, null)">Next &gt;&gt;</a>

Я считаю, что это javascript, и механизация не может перейти по этой ссылке. Любые идеи, чтобы обойти это?


person user1249684    schedule 22.03.2012    source источник
comment
Это очень часто повторяемый вопрос. stackoverflow.com/ stackoverflow.com/questions/4767562/ stackoverflow.com/questions/3769015/ stackoverflow.com/questions/6683611/   -  person daxim    schedule 22.03.2012


Ответы (2)


Вам следует использовать модуль WWW::Scripter, который подкласс WWW::Mechanize, который использует W3C DOM и обеспечивает поддержку сценариев.

person Ωmega    schedule 22.03.2012

Можно быть чистым Perl, если JS достаточно прост.

Вы должны найти подпрограмму javascript, и если она достаточно проста, вы можете воспроизвести ее как подпрограмму Perl.

Тогда вы сможете создавать ссылки самостоятельно.

my @javascript_links = $html =~ m#return _doClick\((.*?)\)#gis;
#array contain 'CA256D6E001A7020.80376e858b0791b1ca256d7300098304/$Body/0.155A', this, null
my @links = extract_links(@javascript_links);
foreach my $link (@links){
  $mech->get( $link )
}
#***
sub extract_links{
 my $line = shift;
 my @params = split(/,/,$line);
 trim(@params);
 #mimic JS logic here, whatever it is
 my $link = "/some/path/here/to/add/some.php?someparam1=val1&param=$params[0]"; 
 return $link;

}
person user1126070    schedule 22.03.2012
comment
Спасибо за это. Это может быть вариантом, однако сначала я рассмотрю win32::ieautomation. - person user1249684; 22.03.2012