2012-03-22 81 views
0

我有一堆網頁我想通過腳本導航並抓取所有內容。我知道鏈接是每頁上的第18個鏈接。我有以下代碼爲一個測試,只需按照鏈接一次,屏幕抓取:Perl,使用機械化導航網頁

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,沒有辦法機械化可以按照這個鏈接。任何想法來解決這個問題?

+1

這是一個非常頻繁重複的問題。 http://stackoverflow.com/search?q=%5Bperl%5D+mechanize+%5Bjavascript%5D http://stackoverflow.com/questions/4767562/is-there-a-way-to-execute-javascript-in- perl http://stackoverflow.com/questions/3769015/how-can-i-handle-javascript-in-a-perl-web-crawler http://stackoverflow.com/questions/6683611/tricking-browser-into- calling-javascript-events – daxim 2012-03-22 11:43:15

回答

-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; 

} 
+0

謝謝你。這可能是一個選項,但我也會首先查看win32 :: ieautomation。 – user1249684 2012-03-22 12:33:56

+0

我使用這種方法,我可以做所有我想做的事情...... – user1126070 2012-03-23 08:18:38