简单入门HtmlUnit

原创 2015年07月10日 13:39:22

因为需要,所以有了你,感恩带你来的大神,阿里嘎多~

1、项目地址

     HtmlUnit – Welcome to HtmlUnit   Or   HtmlUnit点击打开链接 :http://sourceforge.net/projects/htmlunit/

2、简介

HtmlUnit说白了就是一个浏览器,这个浏览器是用Java写的无界面的浏览器,正因为其没有界面,因此执行的速度还是可以滴,HtmlUnit提供了一系列的API,这些API可以干的功能比较多,如表单的填充,表单的提交,模仿点击链接,由于内置了Rhinojs引擎,因此可以执行Javascript 。对JS、CSS支持不是很好,但都可以轻易的配置是否启用。

作用:web的自动化测试(最初的目的),浏览器,网络爬虫

3、实例刨析

一个简单的抓取例子,Java代码如下:
final WebClient webClient=new WebClient();
final HtmlPage page=webClient.getPage("http://www.baidu.com/");
System.out.println(page.asText());
webClient.closeAllWindows();

上面的4行代码,运行,就可以得到百度首页的全部内容,上面代码在运行的过程中会出现很多警告,出现这些警告的主要原因是对JS、CSS支持不是很好,可以通过下面的代码配置JS、CSS是否启用:

webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(false);

在上面的代码中,可以看到这三个类:WebClient,WebWindow,Page,它们有什么关系呢,不妨这样理解吧:

所有的页面最终都是在一个WebWindow对象里面,WebClient在创建时会自动的创建一个WebWindow对象,当调用getPage时会将新页面加载到WebWindow里,你可以理解成WebClient就是IE内核,WebWindow就是呈现页面的浏览器窗口

4、小小feature入门快

1)模拟特定浏览器,也可以指定浏览器的相应版本
1
2
//模拟chorme浏览器,其他浏览器请修改BrowserVersion.后面
WebClient  webClient=new WebClient(BrowserVersion.CHROME);
2)查找特定元素,通过get或者XPath可以从HtmlPage中获得特定的Html元素

方法一,通过get方法获取

1
2
3
HtmlPage page=webClient.getPage("http://www.baidu.com/");
//从百度上获取div标签id=myId内容
HtmlDivision div=(HtmlDivision)page.getElementById("myId");

方法二,通过XPath获取,XPath通常用于无法通过Id搜索,或者需要更为复杂的搜索时使用

1

List<?> tableList = page.getByXPath("//table[@id='tracing_by_booking_f:hl55']");

3)代理服务器的配置,代理的配置很简单,只需要配置好地址,端口,用户名与密码即可

1
2
3
final WebClient webClient = new WebClient(BrowserVersion.CHROME,"http://127.0.0.1",8087);
final DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider();
credentialsProvider.addCredentials("username","password");
4)模拟表单的提交
1
2
3
4
5
6
7
8
9
10
//获取表单 
final HtmlForm form = page.getFormByName("form");
//获取提交按扭
final HtmlSubmitInput button = form.getInputByName("submit");
//一会得输入的
final HtmlTextInput textField = form.getInputByName("userid");
textField.setValueAttribute("test");
//点击提交表单
final HtmlPage page = button.click();

5)获取页中所有的链接
1
2
3
4
java.util.List<HtmlAnchor> achList=page.getAnchors();
for(HtmlAnchor ach:achList){
System.out.println(ach.getHrefAttribute());
}
6)HtmlPage的相关方法,及HtmlInput、等等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
page.getBody().getTextContent()

page.getTitleText();

page.asXml();

page.asText();

//获取input的默认值
htmlInput.getDefaultValue();

//设置文本框的值

htmlInput.setValueAttribute("values");

//模拟点击效果

htmlInput.click();
//模拟输入文本框
htmlInput.type("用户名");
//获取内嵌iframe
HtmlPage framePage=(HtmlPage)page.getFrameByName("frmTree1").getEnclosedPage();
//获得选择框
HtmlSelect seriesSelect = (HtmlSelect) page.getElementById("countrylst");
//获得所有的选择框内容
List optionList = seriesSelect.getOptions();
//将指定的选项选中
optionList.get(1).setSelected(true);
7)设置发送请求参数
1
2
3
4
5
6
7
8
9
10
11
12
13

String sinaSetUrl = hostSinaUrl + "basic/setting_account";

request = new WebRequest(new URL(sinaSetUrl),HttpMethod.POST);

request.setCharset("utf-8");

request.setRequestParameters(Arrays.asList(                 

new NameValuePair("nickname", nickname),                 

new NameValuePair("pop3", "on"),                 

new NameValuePair("imap", "on")));

client.getPage(request);

8)获取的页面头部信息

getResponseHeaders方法的返回值

0:Date=Tue, 07 Jul 2015 13:05:30 GMT

1:X-Powered-By=Servlet/3.0

2:Pragma=no-cache

3:Cache-Control=no-cache, no-store, must-revalidate

4:Expires=Thu, 01 Jan 1970 00:00:00 GMT

5:Vary=Accept-Encoding

6:Keep-Alive=timeout=60, max=185

7:Connection=Keep-Alive

8:Content-Type=text/html;charset=utf-8

9:Content-Language=en

10:Set-Cookie=TS01a3c52a=013b7b09e098d85f84bac23c1d294c3e11048d7ed19229b7ed7e16e91de8749726c9a6bf; Path=/

11:Transfer-Encoding=chunked

9)HtmlPage执行JS

1
2
ScriptResult sr = htmlPage.executeJavaScript("javascript:document.getElementById('tracing_by_booking_f').submit();");
HtmlPage resultPage = (HtmlPage) sr.getNewPage();

5、结束语

先写这些了,后续有新发现再继续增加咯。祝好运~
版权声明:随意转载。

HtmlUnit入门

HtmlUnit
  • shuaicihai
  • shuaicihai
  • 2017年05月28日 14:10
  • 7106

HtmlUnit的简单例子

1.首先下载HtmlUnit的jar包,导入。 package com.shu.htmlUnit; import com.gargoylesoftware.htmlunit.Browser...
  • shuzhupeng
  • shuzhupeng
  • 2016年06月29日 11:34
  • 1211

基于HTMLUnit的微博爬虫

介绍 常用爬虫开源项目 新浪微博爬虫和腾讯微博爬虫 新浪爬虫的问题 总结 介绍 相关简介 即网络爬虫,是一种自动获取网页内容的程序。是搜索引擎的重要组成部分,因此...
  • a_junzhang
  • a_junzhang
  • 2015年05月05日 16:59
  • 1191

htmlunit使用实例

由于第一次使用爬虫爬取网页内容,遇到一些特殊的情况也不是太会处理,这里把我遇到的一些情况和大家分享一下。 public static String getPage(String s_url, Str...
  • zhourenfei17
  • zhourenfei17
  • 2015年01月28日 16:00
  • 753

爬虫的自我解剖(抓取网页HtmlUnit)

网络爬虫第一个要面临的问题,就是如何抓取网页,抓取其实很容易,没你想的那么复杂,一个开源HtmlUnit包,4行代码就OK啦,例子如下: 1 2 3 ...
  • z69183787
  • z69183787
  • 2016年11月21日 11:11
  • 820

HTMLUnit进行模拟浏览器抓取优劣

近期需要抓取一些数据,而这些数据都是需要从后台进行异步请求获取的。故图个方便使用了HtmlUnit这个开源工具进行开发。现整理一下其优劣点: 优点: 1.可以模仿浏览器对服务器进行请求,能...
  • gongdaxuesheng
  • gongdaxuesheng
  • 2015年09月06日 14:34
  • 1651

使用htmlunit 获取百度新闻搜索结果的url

public class baiduNewsPost { public static void main(String args[]) throws FailingHttpStatusCode...
  • zjjee
  • zjjee
  • 2014年11月06日 12:47
  • 2341

htmlUnit的使用

htmlUnit的功能比Jsoup要强大一些,是一个没有界面的浏览器,可以模拟登陆。   还可以支持XPath。   下面是一个模拟百度搜索的例子:     package com.s...
  • wangjinyang_123
  • wangjinyang_123
  • 2015年10月11日 14:40
  • 2346

htmlUnit使用简介(爬虫)

获取页面的TITLE、XML代码、文本 import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htm...
  • jiangsanfeng1111
  • jiangsanfeng1111
  • 2015年10月30日 09:55
  • 1436

htmlunit爬取Ajax动态生成的网页获取不到生成后的结果的问题的解决

在抓取某个站点的内容时,获取不到js加载后渲染的结果,但是也设置了支持js,支持ajax,并且设置了js执行的等待时间。可仍然获取不到。 后来查看控制台打印的异常信息,发现有一个关于页面js的异常:...
  • kusedexingfu
  • kusedexingfu
  • 2017年07月10日 20:49
  • 2989
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单入门HtmlUnit
举报原因:
原因补充:

(最多只允许输入30个字)