Phantomjs爬取帶有js加載完後才能得到的頁面html內容

在平常的開發過程當中,須要爬取一些網站的頁面內容,可是一些網是使用異步加載的內容。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;
}
// 若是沒爬到,重複
}
相關文章
相關標籤/搜索