`
MauerSu
  • 浏览: 509714 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

模拟浏览器的神器 - HtmlUnit

 
阅读更多
源:http://my.oschina.net/apdplat/blog/217586
评:
随着Web的发展,RIA越来越多,JavaScript和Complex AJAX Libraries给网络爬虫带来了极大的挑战,解析页面的时候需要模拟浏览器执行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 杨尚川
*/
public class HtmlUnitTest {
    @Test
    public void homePage() throws Exception {
        final WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_11);
        final HtmlPage page = webClient.getPage("http://yangshangchuan.iteye.com");
        Assert.assertEquals("杨尚川的博客 - ITeye技术网站", page.getTitleText());
        final String pageAsXml = page.asXml();
        Assert.assertTrue(pageAsXml.contains("杨尚川,系统架构设计师,系统分析师,2013年度优秀开源项目APDPlat发起人,资深Nutch搜索引擎专家。多年专业的软件研发经验,从事过管理信息系统(MIS)开发、移动智能终端(Win CE、Android、Java ME)开发、搜索引擎(nutch、lucene、solr、elasticsearch)开发、大数据分析处理(Hadoop、Hbase、Pig、Hive)等工作。目前为独立咨询顾问,专注于大数据、搜索引擎等相关技术,为客户提供Nutch、Lucene、Hadoop、Solr、ElasticSearch、HBase、Pig、Hive、Gora等框架的解决方案、技术支持、技术咨询以及培训等服务。"));
        final String pageAsText = page.asText();
        Assert.assertTrue(pageAsText.contains("[置顶] 国内首套免费的《Nutch相关框架视频教程》(1-20)"));
        webClient.closeAllWindows();
    }
    @Test
    public void homePage_Firefox() throws Exception {
        final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24);
        final HtmlPage page = webClient.getPage("http://yangshangchuan.iteye.com");       
        Assert.assertEquals("杨尚川的博客 - ITeye技术网站", page.getTitleText());
        webClient.closeAllWindows();
    }
    @Test
    public void getElements() throws Exception {
        final WebClient webClient = new WebClient(BrowserVersion.CHROME);
        final HtmlPage page = webClient.getPage("http://yangshangchuan.iteye.com");
        final HtmlDivision div = page.getHtmlElementById("blog_actions");
        //获取子元素
        Iterator<DomElement> iter = div.getChildElements().iterator();
        while(iter.hasNext()){
            System.out.println(iter.next().getTextContent());
        }
        //获取所有输出链接
        for(HtmlAnchor anchor : page.getAnchors()){
            System.out.println(anchor.getTextContent()+" : "+anchor.getAttribute("href"));
        }
        webClient.closeAllWindows();
    }
    @Test
    public void xpath() throws Exception {
        final WebClient webClient = new WebClient();
        final HtmlPage page = webClient.getPage("http://yangshangchuan.iteye.com");
        //获取所有博文标题
        final List<HtmlAnchor> titles = (List<HtmlAnchor>)page.getByXPath("/html/body/div[2]/div[2]/div/div[16]/div/h3/a");
        for(HtmlAnchor title : titles){
            System.out.println(title.getTextContent()+" : "+title.getAttribute("href"));
        }
        //获取博主信息
        final HtmlDivision div = (HtmlDivision) page.getByXPath("//div[@id='blog_owner_name']").get(0);
        System.out.println(div.getTextContent());
        webClient.closeAllWindows();
    }
    @Test
    public void submittingForm() throws Exception {
        final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24);
        final HtmlPage page = webClient.getPage("http://www.oschina.net");
        // Form没有name和id属性
        final HtmlForm form = page.getForms().get(0);
        final HtmlTextInput textField = form.getInputByName("q");
        final HtmlButton button = form.getButtonByName("");
        textField.setValueAttribute("APDPlat");
        final HtmlPage resultPage = button.click();
        final String pageAsText = resultPage.asText();
        Assert.assertTrue(pageAsText.contains("找到约"));
        Assert.assertTrue(pageAsText.contains("条结果"));       
        webClient.closeAllWindows();
    }
}





最后,我们运行单元测试, 全部通过测试!





NUTCH/HADOOP视频教程
分享到:
评论

相关推荐

    neko-htmlunit-2.27-API文档-中文版.zip

    赠送jar包:neko-htmlunit-2.27.jar; 赠送原API文档:neko-htmlunit-2.27-javadoc.jar; 赠送源代码:neko-htmlunit-2.27-sources.jar; 赠送Maven依赖信息文件:neko-htmlunit-2.27.pom; 包含翻译后的API文档:...

    neko-htmlunit-2.33-API文档-中文版.zip

    赠送jar包:neko-htmlunit-2.33.jar; 赠送原API文档:neko-htmlunit-2.33-javadoc.jar; 赠送源代码:neko-htmlunit-2.33-sources.jar; 赠送Maven依赖信息文件:neko-htmlunit-2.33.pom; 包含翻译后的API文档:...

    selenium-htmlunit-driver-2.9.0

    selenium-htmlunit-driver-2.9.0jar包 selenium-htmlunit-driver-2.9.0jar包 selenium-htmlunit-driver-2.9.0jar包 selenium-htmlunit-driver-2.9.0jar包

    neko-htmlunit-2.33-API文档-中英对照版.zip

    赠送jar包:neko-htmlunit-2.33.jar; 赠送原API文档:neko-htmlunit-2.33-javadoc.jar; 赠送源代码:neko-htmlunit-2.33-sources.jar; 赠送Maven依赖信息文件:neko-htmlunit-2.33.pom; 包含翻译后的API文档:...

    neko-htmlunit-2.27-API文档-中英对照版.zip

    赠送jar包:neko-htmlunit-2.27.jar; 赠送原API文档:neko-htmlunit-2.27-javadoc.jar; 赠送源代码:neko-htmlunit-2.27-sources.jar; 赠送Maven依赖信息文件:neko-htmlunit-2.27.pom; 包含翻译后的API文档:...

    giant-htmlunit_test.rar

    HTMLUnit是一个Java库,它提供了一个无头浏览器的模拟,用于自动化Web页面的测试和抓取。这个"giat-htmlunit_test.rar"压缩包显然包含了与使用HTMLUnit进行JavaScript交互和网页抓取相关的代码示例或测试用例。在...

    基于ApacheNutch和Htmlunit的扩展实现AJAX页面爬虫抓取解析插件nutch-htmlunit.zip

    Nutch Htmlunit Plugin 重要说明: 当前项目基于Nutch 1.X系列已停止更新维护,转向Nutch 2.x系列版本的新项目:http://www.oschina.net/p/nutch-ajax 项目简介 基于Apache Nutch 1.8和Htmlunit...

    Cucumber-JVM-Spring-MVC-Test-HTMLUnit-Demo:演示如何将Spring-MVC-Test-HTMLUnit与Cucumber-JVM结合使用

    它允许测试代码模拟浏览器行为,如发送HTTP请求,解析HTML响应,并执行JavaScript。HTMLUnit的轻量级特性使其成为快速执行Web应用测试的理想选择,特别是在集成测试场景中。 在"Cucumber-JVM-Spring-MVC-Test-...

    neko-htmlunit-2.25.jar

    java运行依赖jar包

    Htmlunit2.23-bin.zip

    这个zip文件包含的"htmlunit-2.23"可能包括以下组件: 1. HTMLUnit的核心库(htmlunit.jar):这是主要的库文件,包含了所有处理HTTP请求、解析HTML、执行JavaScript和模拟浏览器行为的类。 2. 可能的依赖库:...

    neko-htmlunit-2.28.jar

    java运行依赖jar包

    selenium-htmlunit-driver-2.46.0.jar

    java运行依赖jar包

    neko-htmlunit-2.33.jar中文-英文对照文档.zip

    (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以...

    neko-htmlunit-2.27.jar中文-英文对照文档.zip

    (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以...

    selenium-htmlunit-driver-2.47.1.jar

    java运行依赖jar包

    htmlunit模拟cookie登录

    htmlunit 模拟cookie 存取 cookie值登录 如: wsyyuser.xywy.com Cookie c = new Cookie("wsyyuser.xywy.com", "PHPSESSID", Common.getValue("session_id") );

    htmlunit-core-js-2.27-API文档-中文版.zip

    赠送jar包:htmlunit-core-js-2.27.jar; 赠送原API文档:htmlunit-core-js-2.27-javadoc.jar; 赠送源代码:htmlunit-core-js-2.27-sources.jar; 赠送Maven依赖信息文件:htmlunit-core-js-2.27.pom; 包含翻译后...

    htmlunit-2.39.0-bin.zip

    HTMLUnit-2.39.0-bin.zip是HTMLUnit的一个发行版本,包含了这个库的可执行文件和相关资源。 在HTMLUnit的核心组件中,有以下几个关键知识点: 1. **WebClient**: HTMLUnit的主要接口,允许开发者与Web页面进行交互...

    nutch-htmlunit-plugin

    -----------------------------Nutch Htmlunit Plugin项目简介基于Apache Nutch 1.8和Htmlunit组件,实现对于AJAX加载类型页面的完整页面内容抓取解析。According to the implementation of Apache Nutch 1.8, we ...

    htmlunit-2.36和htmlunit-2.50,包括关联文件

    HTMLUnit-2.36.0和HTMLUnit-2.50.0都是HTMLUnit的发行版本,每个版本都包含一组特定的修复和改进。随着版本的升级,开发者通常会解决已知问题,增加新功能,或者提升性能。2.50.0是较新的版本,可能包含更多的更新和...

Global site tag (gtag.js) - Google Analytics