模拟浏览器的神器 - HtmlUnit

xiluoenm 2014-08-06

源: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视频教程

相关推荐

二毛妮子 / 0评论 2013-06-18