2014年8月13日 星期三

perl one-liner以mozrepl查詢firefox瀏覽器資料--以海盜灣(the pirate bay)網頁內容的表格為例

在此將問題分解為三個部分,分別是
  1. 取得網頁原始碼。結果為一個檔案;generic
  2. 取得表格原始碼。結果為列導向的多筆資料,特定分隔符號分隔各欄位;site specific
  3. 對表格原始碼進行後處理,得到想要的資料,排列成所需的格式;requirement specific

1.取得網頁原始碼。使用 mozrepl 來取得原始碼有許多好處,可以忽略登入的問題,不需處理解壓縮的問題,可以處理 javascript ,各種好處。
perl -MNet::Telnet -e "$t=new Net::Telnet();$t->open(Host=>'localhost', Port=>4242); $t-> print ('content.document.body.innerHTML');while(1){my $data=$t->get(Timeout=>1);print $data;}"
這個程式碼片斷會取得顯示中頁面的原始碼

2.表格原始碼的取得。列舉的方式有 map 或 foreach ,兩者我都列出來,供大家參考 。範例頁面為 http://thepiratebay.se/top/all ,其中列有當日前100名資源的資料。為方便觀察,將結果存到 top100.txt。
perl -MNet::Telnet -e "$t=new Net::Telnet();$t->open(Host=>'localhost', Port=>4242);$t->print('content.document.body.innerHTML');while(1){my $data=$t->get(Timeout=>1);print $data;}"
 | perl -MData::Dumper -MHTML::TreeBuilder::XPath -MHTML::Element -e "$string = do { local($/); <> }; $tree= HTML::TreeBuilder::XPath-> new_from_content($string);my @results=$tree->findnodes( '/html/body/div[@id=\"content\"]/div[@id=\"main-content\"]/table[@id=\"searchResult\"]/tbody') ;foreach my $table(@results){foreach my $row($table->findnodes('.//tr')){my @cells=$row-> findnodes ('.//td'); print join(\"\n\", map{ $_->as_HTML if ref($_)} $cells[1]-> content_list() ), \"\n\";foreach $acell($cells[1]->content_list()){print $acell->as_text.\"\n\" if ref($acell) ;};print $cells[0]->string_value,\"\n\";}print \"\n\";}" > top100.txt
這個程式片斷前半就是抓網頁原始碼的程式,使用 pipe 將結果做過濾

3.to be continued...

沒有留言:

張貼留言