phantomjs實例爬取AJAX頁面

phantomjs:我的理解就是它是一個無顯示的瀏覽器,也就是說除了不能顯示頁面內容以外,瀏覽器能幹的活兒它基本上都能幹。so,最近由於實驗需要,要從某電商爬一點圖片,但是它又是AJAX生成的,單純的爬取HTML的方法是行不通的,o(╯□╰)o,於是在經過一些求助後,;瞭解到了PHANTOMJS,鑑於網上沒找到太多實例,只好自己總結下以備不時之需。另外直接查看官網上的說明文檔會有很大收穫滴~順便鍛鍊下自己英文嘛o(╯□╰)o。下面舉個栗子來具體實現:

把phantom下載解壓到D盤,在目錄下有phantomjs.exe文件(win7) 通過js文件可以調用這個WebKit來達到需要的目的:比方說生成網頁快照之類吧。我要做的是爬AJAX頁面上的圖片。先看js文件:命名爲S.JS

system = require('system')   //傳遞一些需要的參數給js文件

address = system.args[1];//獲得命令行第二個參數 ,也就是指定要加載的頁面地址,接下來會用到  

var page = require('webpage').create();  

var url = address;  


page.open(url, function (status) {  

    if (status !== 'success') {  

        console.log('Unable to post!');  
    } else {  
 
        var encodings = ["euc-jp", "sjis", "utf8", "System"];//這一步是用來測試輸出的編碼格式,選擇合適的編碼格式很重要,不然你抓取下來的頁面會亂碼o(╯□╰)o,給出的幾個編碼格式是官網上的例子,根據具體需要自己去調整。

for (var i = 3; i < encodings.length; i++) {//我這裏只要一種編碼就OK啦

    phantom.outputEncoding = encodings[i];

    console.log(phantom.outputEncoding+page.content);//最後返回webkit加載之後的頁面內容
}
        
    }     
    phantom.exit();  
});   

接下來就是java類的編寫:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class getContent {
 public static String getAjaxCotnent(String url) throws IOException {  

//  調用命令行運行phantomjs來執行s.js文件,這裏的路徑需要寫全,否則是沒有辦法運行的,具體原因就不去考察了
//  通過此方法返回的就是把AJAX頁面完全加載之後的瀏覽器的內容,以字符串的形式返回

        Runtime rt = Runtime.getRuntime();  

        Process p = rt.exec("d:/phantomjs/phantomjs.exe d:/phantomjs/s.js "+url);  

        InputStream is = p.getInputStream();  

        BufferedReader br = new BufferedReader(new InputStreamReader(is));  

        StringBuffer sbf = new StringBuffer();  

        String tmp = "";  

        while((tmp = br.readLine())!=null){  

            sbf.append(tmp);  
        }  
        //System.out.println(sbf.toString());  

        return sbf.toString();  
    }  


}
到這裏,就得到了所需要的AJAX完整頁面的代碼字符串了,接下來就可以do whatever you want啦



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章