让人又爱又恨的HtmlUnit,你一定要了解一下
作者:互联网
1.HtmlUnit简要介绍
HtmlUnit是一款java的无界面浏览器程序库。它模拟HTML文档,并提供相应的API,允许您调用页面,填写表单,点击链接等操作,就像您在“正常”浏览器中做的一样。它有相当不错的JavaScript支持(还在不断改进),甚至能够处理相当复杂的AJAX库,模拟Chrome,Firefox或Internet Explorer取决于使用的配置。它通常用于测试目的或从网站检索信息。
HtmlUnit不是一个通用的单元测试框架。它是一种模拟浏览器以用于测试目的的方法,并且旨在用于另一个测试框架(如JUnit或TestNG)中。有关简介,请参阅文档“HtmlUnit入门”。HtmlUnit用作不同的开源工具,如Canoo
WebTest,JWebUnit,WebDriver,JSFUnit,WETATOR,Celerity,Spring MVC Test
HtmlUnit作为底层的“浏览器”。
HtmlUnit最初由Gargoyle Software的Mike Bowler编写,并根据Apache 2许可证发布。从那时起,它已经收到了许多来自其他开发商的贡献,今天也会得到他们的帮助。
几年前在做一个购物网站的数据抓取工作中,偶然的机会邂逅了HtmlUnit了。记得当时怎么也捉取不到页面上的价格数据,而httpfox也追踪不到价格数据的URL,正当我一愁莫展的时个,HtmlUnit出现并帮我解决了问题。所以今天我要说声谢谢,也将HtmlUnit推荐给大家。
官网地址:htmlunit@sourceforge
2.HtmlUnit动一小手
下载所有Jar文件到类路径中,所有Jar文件可在地址:HtmlUnitJars 下载到。或者利用Maven依赖,如下:
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.25</version>
</dependency>
下面以某购物网站列表页为例,做一个基本的数据捉取的例子,输入的条件为网站的列表页URL地址,输出的结果为该页面所有产品的名称,价格和评论数并以//做为分隔。不包括推广产品。
例如输入:京东(JD.COM)-正品低价、品质保障、配送及时、轻松购物!
结果输出(多条):
魅族 魅蓝metal 16GB 灰色 电信4G手机 双卡双待//¥699.00 ¥699.00//已有5.2万+人评价
OPPO R9s 全网通4G+64G 双卡双待手机 玫瑰金//¥2799.00 ¥2799.00//已有8.6万+人评价
示例程序代码:
package com.du42.htmlunit;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomNode;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import java.util.List;
/**
* Created by iFat3 on 2017/3/15 42du.cn.
*/
public class JDListTools {
public static void getItems() throws Exception {
WebClient webClient = new WebClient(BrowserVersion.BEST_SUPPORTED);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.waitForBackgroundJavaScript(600*1000);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
HtmlPage page = webClient.getPage("https://list.jd.com/list.html?cat=9987,653,655");
List<HtmlDivision> divs = (List) page.getByXPath("//div[@id='plist']//ul//li[@class='gl-item']//div[@class='gl-i-wrap j-sku-item']");
for(HtmlDivision div :divs) {
DomNodeList<DomNode> childs = div.getChildNodes();
String name = "";
String price = "";
String comments = "";
for(DomNode dn : childs) {
NamedNodeMap map = dn.getAttributes();
Node node = map.getNamedItem("class");
if(node != null) {
String value = node.getNodeValue();
if(value.contains("p-name")) {
name = dn.asText();
} else if(value.contains("p-price")) {
price = dn.asText();
} else if(value.contains("p-commit")) {
comments = dn.asText();
}
}
}
System.out.println(name+"//"+price+"//"+comments);
}
}
public static void main(String[] args) throws Exception {
getItems();
}
}
如程序不能取得数据,请调整选择器部分代码。
3.HtmlUnit特性
-
支持HTTP和HTTPS协议
-
支持Cookie
-
能够指定来自服务器的失败响应是否应该抛出异常,或者应该做为适当类型的页面返回(基于内容类型)
-
支持提交方法POST和GET(以及HEAD,DELETE,...)
-
能够定制发送到服务器的请求标头
-
支持HTML响应
-
HTML页面的封装容易访问其中包含的所有信息
-
支持提交表单
-
支持点击链接
-
支持步行HTML文档的DOM模型
-
-
代理服务器支持
-
支持基本和NTLM身份验证
-
优秀的JavaScript支持
4.HtmlUnit总结
HtmlUnit的无界面浏览器的核心思想非常好,能执行JavaScript,使其在精神上领先一步。在做数据捉取方面,不用再去做复杂的调用跟踪,AJAX解析等,只要连接页面,等待后台JavaScript执行完毕即可得到想要的Dom文档了。
而在实际的应用中,还是有很多不尽如人意的地方,其一就是对JavaScript执行并不完美,并不能总是得到和实际浏览器完全一样的DOM文档,会报很多的错误;其二就是HtmlUnit的选择器实在是十分难用。
HtmlUnit对JavaScript的支持是其最大的亮点,也是其最需要完善的地方。总的来说HtmlUnit是一款很棒的java工程,值得我们花一些时间来学习和尝试,给我们的武器库增加一件武器,也许什么时候你就会用到它。
标签:HtmlUnit,一下,了解,import,gargoylesoftware,com,webClient,htmlunit 来源: https://www.cnblogs.com/cuihongyu3503319/p/15047164.html