在平常的开发过程当中,须要爬取一些网站的页面内容,可是一些网是使用异步加载的内容。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; } // 若是没爬到,重复 }