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;
}
// 若是没爬到,重复
}
相关文章
相关标签/搜索