Phantomjs爬取带有js加载完后才能获得的页面html内容

在日常的开发过程中,需要爬取一些网站的页面内容,但是一些网是使用异步加载的内容。

异步加载的信息不好分析与提取,只有从页面的html中提取最直观、最方便,比如一项业务,要爬取淘宝商品的排行版:http://top.taobao.com/index.php?spm=a1z5i.1.2.2.3C7KSE&topId=TR_FS&leafId=50010850;

通过普通 的jsoup是很难分析提取页面中的目标内容的;

但是如果有一个工具,可以获取最后页面展示的html内容,那么再通过传统的jsoup,便可以很容易地提取页面内容;

Phantomjs可以胜任这个业务需求的实现。

针对这个需求编写了一个工具类,工具类已封装在本人托管在 开源中国Git下的的开源项目:easy-commons

项目下载地址:

https://git.oschina.net/nibilly/easy-commons.git

项目是使用maven管理的,下载完后,可以运行bin目录下的install.bat打包到本地的maven仓库,然后在自己的项目里添加依赖:

<dependency>

    <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;
}
// 如果没爬到,重复
}


你可能感兴趣的:(js,爬取)