#java爬虫gecco支持htmlunit java爬虫gecco发布了1.0.5版本,增长了对htmlunit的支持。htmlunit是一款开源的java 页面分析工具,读取页面后,能够有效的使用htmlunit分析页面上的内容。项目能够模拟浏览器运行,被誉为java浏览器的开源实现。这个没有界面的浏览器,运行速度也是很是迅速的。htmlunit采用的是rhino做为javascript的解析引擎。 ##使用方法javascript
-
下载css
<dependency> <groupId>com.geccocrawler</groupId> <artifactId>gecco-htmlunit</artifactId> <version>x.x.x</version> </dependency>
##Demo JD的商品详情信息里的价格的信息是经过ajax异步请求而来的,以前是利用@Ajax注解的方式实现的。这里用htmlunit来自动完成ajax请求。html
@Gecco(matchUrl="http://item.jd.com/{code}.html", pipelines="consolePipeline", downloader="htmlUnitDownloder") public class JDDetail implements HtmlBean { private static final long serialVersionUID = -377053120283382723L; @RequestParameter private String code; @Text @HtmlField(cssPath=".p-price") private String price; @Text @HtmlField(cssPath="#name > h1") private String title; @Text @HtmlField(cssPath="#p-ad") private String jdAd; @HtmlField(cssPath="#product-detail-2") private String detail; public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String getJdAd() { return jdAd; } public void setJdAd(String jdAd) { this.jdAd = jdAd; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDetail() { return detail; } public void setDetail(String detail) { this.detail = detail; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public static void main(String[] args) throws Exception { HttpRequest request = new HttpGetRequest("http://item.jd.com/1455427.html"); request.setCharset("GBK"); GeccoEngine.create() .classpath("com.geccocrawler.gecco.htmlunit") //开始抓取的页面地址 .start(request) //开启几个爬虫线程 .thread(1) .timeout(1000) .run(); } }
##优缺点 使用htmlunit确实能省去不少工做,可是htmlunit也存在不少弊端:java
一、效率低下,使用htmlunit后,下载器要将全部js一并下载下来,同时要执行全部js代码,下载一个页面有时须要5~10秒。ajax
二、rhino引擎对js的兼容问题,rhino的兼容性仍是存在很多问题的,上述demo就有不少js执行错误。若是你们在抓取时不想看到这些error日志输出能够配置log4j:chrome
log4j.logger.com.gargoylesoftware.htmlunit=OFF
三、使用selenium也能够达到相似目的,selenium自己并不解析js,经过调用不一样的浏览器驱动达到模拟浏览器的目的。selenium支持chrome、IE、firefox等多个真实浏览器驱动,也支持htmlunit做为驱动,还支持PhantomJS这种js开发的驱动。浏览器
driver类型 | 优势 | 缺点 |
---|---|---|
真实浏览器driver | 真实模拟用户行为 | 效率、稳定性低 |
HtmlUnit | 速度快 | js引擎(Rhinojs)不是主流的浏览器支持的,故对js支持的不够好 |
PhantomJS | 速度中等、模拟行为接近真实 | 不能模拟不一样/特定浏览器的行为 |