0

スクリプトをナビゲートしてすべてのコンテンツを取得したいWebページがたくさんあります。リンクが各ページの 18 番目のリンクであることはわかっています。リンクを1回たどってスクリーンスクレイプするためのテストとして、次のコードがあります。

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 であり、mechanize がこのリンクをたどることはできません。これを回避するためのアイデアはありますか?

4

2 に答える 2

1

モジュールを使用する必要があります。これは、W3C DOMを使用し、スクリプトのサポートを提供するWWW::Scripterサブクラスです。WWW::Mechanize

于 2012-03-22T12:54:34.213 に答える
-2

JS が非常に単純であれば、純粋な perl にすることも可能です。

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;

}
于 2012-03-22T12:07:05.653 に答える