1. 程式人生 > >Java爬蟲——phantomjs抓取ajax動態載入網頁

Java爬蟲——phantomjs抓取ajax動態載入網頁

(說好的第二期終於來了 >_<)

1、phantomjs介紹

phantomjs實現了一個無介面的webkit瀏覽器。雖然沒有介面,但dom渲染、js執行、網路訪問、canvas/svg繪製等功能都很完備,在頁面抓取、頁面輸出、自動化測試等方面有廣泛的應用。

2問題分析

上期採用CloseableHttpClient未能抓取到我們想要的天貓價格,是因為這個價格是ajax動態載入的。現在有了phantomjs,它本身就是個瀏覽器,可以執行js , 返回ajax請求執行完後的網頁。這樣我們就可以得到我們想要的價格了。

3、操作步驟

(1)官網下載phantomjs,無需安裝,解壓即可使用。

( 2 )編寫js檔案

     以我們要抓取的天貓價格為例,參考官方api,編寫程式碼如下:

(Crawl2.js:)   

varurl='https://detail.tmall.com/item.htm?spm=a222t.7794920.fdigt.15.toj3Lg&id=522169321891&skuId=3201261540546&rn=870e70c02239d3cf10b156e9f9aa9e4f&scm=search-api.3c_fp.870e70c02239d3cf10b156e9f9aa9e4f.2';

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

page.settings.userAgent= 'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR2.0.50727)';

//console.log('Thedefault user agent is ' + page.settings.userAgent);

page.open(url,function (status) {

    if (status !== 'success') {

        console.log('Unable to access thewebsite');

    } else {

            var val = page.evaluate(function(){

                returndocument.querySelector('div.tm-promo-price span.tm-price').innerHTML;

            });

            console.log('The register address:' + val);

            phantom.exit();

         };

});

用phantomjs命令執行此檔案,即可打印出價格。

(3)在java中呼叫

packageedu.nju.opsource.nhandan;

import org.apache.commons.io.IOUtils;  

importjava.io.*;  

public classHttpUtils {  

    public staticString getAjaxCotnent(String url)throwsIOException {  

        Runtime rt =Runtime.getRuntime();

        Process p = rt.exec("phantomjs.exeD:/phantomjsFile/crawl2.js ");

     InputStream is = p.getInputStream();  

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

        StringBuffer sbf = newStringBuffer();  

        String tmp = "";  

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

            sbf.append(tmp);  

        }  

        System.out.println(sbf.toString());  

        return sbf.toString();  

    }  

    public static voidmain(String[] args) throws IOException{  

        getAjaxCotnent("");  

    }  

}  

輸出結果:

 The register address: 3996.00

至此,成功獲取到資料,amazing!!!

(既然phantomjs可以執行模擬點選事件,那麼像那種點選“載入更多”才出現更多內容的資訊,不就可以通過不斷地模擬點選“載入更多”按鈕來獲取所有資訊,最後只爬取一次,將所有內容都抓下來麼??同樣留一坑,下期來講---Java爬蟲——抓取“載入更多”內容)