关闭

简单入门HtmlUnit

标签: HtmlUnit爬虫
350人阅读 评论(0) 收藏 举报
分类:

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

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、结束语

先写这些了,后续有新发现再继续增加咯。祝好运~
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:31429次
    • 积分:488
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:68篇
    • 译文:0篇
    • 评论:0条