文档章节

java爬虫gecco支持htmlunit

xtuhcy
 xtuhcy
发布于 2016/03/07 10:30
字数 760
阅读 2588
收藏 2

#java爬虫gecco支持htmlunit java爬虫gecco发布了1.0.5版本,增加了对htmlunit的支持。htmlunit是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。这个没有界面的浏览器,运行速度也是非常迅速的。htmlunit采用的是rhino作为javascript的解析引擎。 ##使用方法

  • 下载

      <dependency>
          <groupId>com.geccocrawler</groupId>
          <artifactId>gecco-htmlunit</artifactId>
          <version>x.x.x</version>
      </dependency>
    

##Demo JD的商品详情信息里的价格的信息是通过ajax异步请求而来的,之前是利用@Ajax注解的方式实现的。这里用htmlunit来自动完成ajax请求。

@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也存在很多弊端:

1、效率低下,使用htmlunit后,下载器要将所有js一并下载下来,同时要执行所有js代码,下载一个页面有时需要5~10秒。

2、rhino引擎对js的兼容问题,rhino的兼容性还是存在不少问题的,上述demo就有很多js执行错误。如果大家在抓取时不想看到这些error日志输出可以配置log4j:

log4j.logger.com.gargoylesoftware.htmlunit=OFF

3、使用selenium也可以达到类似目的,selenium本身并不解析js,通过调用不同的浏览器驱动达到模拟浏览器的目的。selenium支持chrome、IE、firefox等多个真实浏览器驱动,也支持htmlunit作为驱动,还支持PhantomJS这种js开发的驱动。

driver类型优点缺点
真实浏览器driver真实模拟用户行为效率、稳定性低
HtmlUnit速度快js引擎(Rhinojs)不是主流的浏览器支持的,故对js支持的不够好
PhantomJS速度中等、模拟行为接近真实不能模拟不同/特定浏览器的行为

© 著作权归作者所有

共有 人打赏支持
xtuhcy

xtuhcy

粉丝 105
博文 17
码字总数 20302
作品 1
北京
后端工程师
私信 提问
加载中

评论(4)

xtuhcy
xtuhcy
建议你使用maven。依赖的项目包括:
httpclient,jsoup,fastjson,reflections,cglib,rhino,log4j,jmxutils,commons-lang3
z1y1m1
z1y1m1

引用来自“xtuhcy”的评论

引用来自“z1y1m1”的评论

public static void main(String[] args) throws Exception {
HtmlUnitDownloder downloader = new HtmlUnitDownloder();
HttpRequest request = new HttpGetRequest("http://item.jd.com/1455427.html");
request.setCharset("GBK");
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.htmlunit")
.downloader(downloader)
//开始抓取的页面地址
.start(request)
//开启几个爬虫线程
.thread(1)
.timeout(1000)
.run();
}

GeccoEngine就没有downloader这个函数。

版本升级了,现在可以灵活的在每个@Gecco配置,稍后我修改一下该博客
还有能不能把依赖库都提供下,不然得话一大堆java.lang.NoClassDefFoundError
xtuhcy
xtuhcy

引用来自“z1y1m1”的评论

public static void main(String[] args) throws Exception {
HtmlUnitDownloder downloader = new HtmlUnitDownloder();
HttpRequest request = new HttpGetRequest("http://item.jd.com/1455427.html");
request.setCharset("GBK");
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.htmlunit")
.downloader(downloader)
//开始抓取的页面地址
.start(request)
//开启几个爬虫线程
.thread(1)
.timeout(1000)
.run();
}

GeccoEngine就没有downloader这个函数。

版本升级了,现在可以灵活的在每个@Gecco配置,稍后我修改一下该博客
z1y1m1
z1y1m1
public static void main(String[] args) throws Exception {
HtmlUnitDownloder downloader = new HtmlUnitDownloder();
HttpRequest request = new HttpGetRequest("http://item.jd.com/1455427.html");
request.setCharset("GBK");
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.htmlunit")
.downloader(downloader)
//开始抓取的页面地址
.start(request)
//开启几个爬虫线程
.thread(1)
.timeout(1000)
.run();
}

GeccoEngine就没有downloader这个函数。
Gecco 1.1.3 发布,易用的轻量化爬虫

Gecco 1.1.3 发布了,该版本改进内容包括: 处理jsonp的时候,分号问题修复 2.支持自定义下载重试次数定义,GeccoEngine.retry(count) 3.HttpClientDownloader支持response的Set Cookie自动存...

xtuhcy
2016/05/31
2.3K
9
HtmlUnit 2.6发布

HtmlUnit 是 JUnit 的扩展测试框架之一。HtmlUnit 将返回文档模拟成 HTML,这样您便可以直接处理这些文档了。HtmlUnit 使用例如 table、form 等标识符将测试文档作为 HTML 来处理。它同样需要...

红薯
2009/09/07
3.3K
0
模拟浏览器的神器 - HtmlUnit

随着Web的发展,RIA越来越多,JavaScript和Complex AJAX Libraries给网络爬虫带来了极大的挑战,解析页面的时候需要模拟浏览器执行JavaScript才能获得需要的文本内容。 好在有一个Java开源项...

杨尚川
2014/04/04
0
6
HtmlUnit 2.8 发布,Java的Web单元测试

HtmlUnit 是 JUnit 的扩展测试框架之一。HtmlUnit 将返回文档模拟成 HTML,这样您便可以直接处理这些文档了。HtmlUnit 使用例如 table、form 等标识符将测试文档作为 HTML 来处理。它同样需要...

红薯
2010/08/12
2.2K
0
怎么抓取js执行后的页面

我想直接抓取新浪微博的搜索结果页面,用的htmlunit。但是抓到的页面是js执行前的,我看htmlunit的功能介绍上说是支持js的,但是我不知道怎么办啊T T 求帮忙求指导 或者不用htmlunit也行,有...

李XX
2012/12/05
3.5K
3

没有更多内容

加载失败,请刷新页面

加载更多

读取zookeeper上的dubbo注册信息

dubbo有自己的服务监听服务器,incubator-dubbo-ops-develop,github可以下载到,网上也有很多本地部署的例子,就想了下能不能自己监听dubbo的服务,于是写了如下代码。特别注意的是zookeep...

noob_chr
27分钟前
0
0
Java提高班(六)反射和动态代理(JDK Proxy和Cglib)

反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多。要怎么理解以上这句话,请看下文。 一、...

王磊的博客
46分钟前
3
0
Ext grid 渲染

// 单元格字体颜色渲染function renderer_Meta_useStatus(value, cellmeta, record,rowIndex, columnIndex, store){ var color = ""; if("空闲"==value){ color = "green";......

MoksMo
56分钟前
5
0
log4j2在spring中的配置

<?xml version="1.0" encoding="UTF-8"?><!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --><!--Configuration后面的status,这个用于设置l......

TonyTaotao
今天
4
0
java 中间变量缓存机制(i++,++i)

public class Test { public static void main(String[] args) { int i = 0; i = i ++ ; System.out.println(i); } } 答案是 0 如果是 i = ++......

shzwork
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部