模拟浏览器的神器 - HtmlUnit
源:http://my.oschina.net/apdplat/blog/217586
评:
随着Web的发展,RIA越来越多,JavaScript和ComplexAJAXLibraries给网络爬虫带来了极大的挑战,解析页面的时候需要模拟浏览器执行JavaScript才能获得需要的文本内容。
好在有一个Java开源项目HtmlUnit,它能模拟Firefox、IE、Chrome等浏览器,不但可以用来测试Web应用,还可以用来解析包含JS的页面以提取信息。
下面看看HtmlUnit的效果如何:
首先,建立一个maven工程,引入junit依赖和HtmlUnit依赖:
?
1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.14</version>
</dependency>
其次,写一个junit单元测试来使用HtmlUnit提取页面信息:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/**
*使用HtmlUnit模拟浏览器执行JS来获取网页内容
*@author杨尚川
*/
publicclassHtmlUnitTest{
@Test
publicvoidhomePage()throwsException{
finalWebClientwebClient=newWebClient(BrowserVersion.INTERNET_EXPLORER_11);
finalStringpageAsXml=page.asXml();
Assert.assertTrue(pageAsXml.contains("杨尚川,系统架构设计师,系统分析师,2013年度优秀开源项目APDPlat发起人,资深Nutch搜索引擎专家。多年专业的软件研发经验,从事过管理信息系统(MIS)开发、移动智能终端(WinCE、Android、JavaME)开发、搜索引擎(nutch、lucene、solr、elasticsearch)开发、大数据分析处理(Hadoop、Hbase、Pig、Hive)等工作。目前为独立咨询顾问,专注于大数据、搜索引擎等相关技术,为客户提供Nutch、Lucene、Hadoop、Solr、ElasticSearch、HBase、Pig、Hive、Gora等框架的解决方案、技术支持、技术咨询以及培训等服务。"));
finalStringpageAsText=page.asText();
Assert.assertTrue(pageAsText.contains("[置顶]国内首套免费的《Nutch相关框架视频教程》(1-20)"));
webClient.closeAllWindows();
}
@Test
publicvoidhomePage_Firefox()throwsException{
finalWebClientwebClient=newWebClient(BrowserVersion.FIREFOX_24);
webClient.closeAllWindows();
}
@Test
publicvoidgetElements()throwsException{
finalWebClientwebClient=newWebClient(BrowserVersion.CHROME);
finalHtmlDivisiondiv=page.getHtmlElementById("blog_actions");
//获取子元素
Iterator<DomElement>iter=div.getChildElements().iterator();
while(iter.hasNext()){
System.out.println(iter.next().getTextContent());
}
//获取所有输出链接
for(HtmlAnchoranchor:page.getAnchors()){
System.out.println(anchor.getTextContent()+":"+anchor.getAttribute("href"));
}
webClient.closeAllWindows();
}
@Test
publicvoidxpath()throwsException{
finalWebClientwebClient=newWebClient();
//获取所有博文标题
finalList<HtmlAnchor>titles=(List<HtmlAnchor>)page.getByXPath("/html/body/div[2]/div[2]/div/div[16]/div/h3/a");
for(HtmlAnchortitle:titles){
System.out.println(title.getTextContent()+":"+title.getAttribute("href"));
}
//获取博主信息
finalHtmlDivisiondiv=(HtmlDivision)page.getByXPath("//div[@id='blog_owner_name']").get(0);
System.out.println(div.getTextContent());
webClient.closeAllWindows();
}
@Test
publicvoidsubmittingForm()throwsException{
finalWebClientwebClient=newWebClient(BrowserVersion.FIREFOX_24);
finalHtmlPagepage=webClient.getPage("http://www.oschina.net");
//Form没有name和id属性
finalHtmlFormform=page.getForms().get(0);
finalHtmlTextInputtextField=form.getInputByName("q");
finalHtmlButtonbutton=form.getButtonByName("");
textField.setValueAttribute("APDPlat");
finalHtmlPageresultPage=button.click();
finalStringpageAsText=resultPage.asText();
Assert.assertTrue(pageAsText.contains("找到约"));
Assert.assertTrue(pageAsText.contains("条结果"));
webClient.closeAllWindows();
}
}
最后,我们运行单元测试,全部通过测试!
NUTCH/HADOOP视频教程