在平常的開發過程當中,須要爬取一些網站的頁面內容,可是一些網是使用異步加載的內容。php
異步加載的信息很差分析與提取,只有從頁面的html中提取最直觀、最方便,好比一項業務,要爬取淘寶商品的排行版:http://top.taobao.com/index.php?spm=a1z5i.1.2.2.3C7KSE&topId=TR_FS&leafId=50010850; html
經過普通 的jsoup是很難分析提取頁面中的目標內容的;java
可是若是有一個工具,能夠獲取最後頁面展現的html內容,那麼再經過傳統的jsoup,即可以很容易地提取頁面內容;git
Phantomjs能夠勝任這個業務需求的實現。異步
針對這個需求編寫了一個工具類,工具類已封裝在本人託管在 開源中國Git下的的開源項目:easy-commonsmaven
項目下載地址:工具
https://git.oschina.net/nibilly/easy-commons.git 網站
項目是使用maven管理的,下載完後,能夠運行bin目錄下的install.bat打包到本地的maven倉庫,而後在本身的項目裏添加依賴:this
<dependency>url
<artifactId>easy-commons</artifactId>
<groupId>cn.com.easy</groupId>
<version>0.1.0</version>
</dependency>
如下是使用示例代碼(結合jsoup處理返回內容):
/** * 根據url獲取document * * @param url * @return * @throws Exception */ private Document getDocment(String url) throws Exception { try { String htmlStr = PhantomjsUtils.getJsHtmlCotnent(url); return Jsoup.parse(htmlStr); } catch (Exception ex) { log.error("爬取異常,用HttpProxy從新爬取一次:" + url, ex); return this.getDocumentByHttpProxy(url); } }
//this.RE_CATCH_FROM_URL_TIMES 是重複爬取次數,在實際的使用過程當中,會出現,取回的內容爲空的現象,屢次判斷重複爬取,能夠解決問題,我這裏設置的是重複爬取5次 for (int k = 0; k < this.RE_CATCH_FROM_URL_TIMES; k++) { doc = this.getDocment(parentUrl); topWordsLink = doc.select("#bang-bswitch .switch-row .switch-item a");// 搜索上升完整排行連接 if (topWordsLink.size() != 0) { break; } // 若是沒爬到,重複 }