一、简介

    是一款开源的 Java 页面分析工具,读取页面后,可以有效地使用 htmlunit 分析页面上的内容

    可以模拟浏览器运行,被誉为 Java 浏览器的开源实现

1、是一个无界面浏览器 Java 程序

    为 HTML 文档建模,提供了调用页面、填写表单、单机链接等操作的 API

    和在浏览器中做的操作一样

2、有不断改进的 JavaScript 支持,甚至可以使用相当复杂的 AJAX 库

    根据配置的不同模拟 Chrome、Firefox 或 IE 等浏览器

3、通常用于测试或从 web 站点检索信息


二、使用场景

  • httpClient 的局限性

    一般可以使用 Apache 的 HttpClient 组件进行 HTML 页面信息的获取,HttpClient 实现的 http 请求返回的响应一般是纯文本的 document 页面,即最原始的 html 页面。

    对于一个静态页面来说,使用 HttpClient 自购将所需要的信息爬取出来。

    但对于动态网页来说,更多的数据是通过异步 JS 代码获取并渲染到的,最开始的 html 页面不包含这部分数据。

三、代码演示

1、获取页面

public class HtmlUnitDemo {
    public static void main(String[] args) throws IOException {
        String str;
        // 创建一个 webClient
//        WebClient webClient = new WebClient();    // 任意浏览器打开
        WebClient webClient = new WebClient(BrowserVersion.CHROME);  // 使用 Chrome 读取页面
        // htmlunit 对 JS 和 CSS 的支持不好,所以关闭
        webClient.getOptions().setJavaScriptEnabled(false);
        webClient.getOptions().setCssEnabled(false);

        // 获取页面
        HtmlPage page = webClient.getPage("http://www.baidu.com");  // 抛出 IOException
//        System.out.println(page);
         // 获取页面的标题
        str = page.getTitleText();
        System.out.println("Title: " + str);
        // 获取页面的 XML 代码
        str = page.asXml();
        System.out.println("XML: \n" + str);
        // 获取页面的文本
        str = page.asText();
        System.out.println("文本: \n" + str);

        // 关闭 webClient
        webClient.close();
    }
}

2、获取页面的指定元素

public class HtmlUnitDemo {
    public static void main(String[] args) throws IOException {
        // 创建一个 webClient
//        WebClient webClient = new WebClient();    // 任意浏览器打开
        WebClient webClient = new WebClient(BrowserVersion.CHROME);  // 使用 Chrome 读取页面
        // htmlunit 对 JS 和 CSS 的支持不好,所以关闭
        webClient.getOptions().setJavaScriptEnabled(false);
        webClient.getOptions().setCssEnabled(false);
        HtmlPage page = webClient.getPage("http://www.baidu.com");

        // 获得页面的指定元素
        // 通过 id 获得“百度一下”按钮
        HtmlInput btn = page.getHtmlElementById("su");
        System.out.println(btn.getDefaultValue());

        // 关闭 webClient
        webClient.close();
    }
}

3、元素检索

public class HtmlUnitDemo {
    public static void main(String[] args) throws IOException {
        // 创建一个 webClient
//        WebClient webClient = new WebClient();    // 任意浏览器打开
        WebClient webClient = new WebClient(BrowserVersion.CHROME);  // 使用 Chrome 读取页面
        // htmlunit 对 JS 和 CSS 的支持不好,所以关闭
        webClient.getOptions().setJavaScriptEnabled(false);
        webClient.getOptions().setCssEnabled(false);
        HtmlPage page = webClient.getPage("http://www.baidu.com"); 

        // 元素检索
        // 查找所有的 div
        List<?> hbList = page.getByXPath("//div");
//        System.out.println(hbList);
        HtmlDivision hb = (HtmlDivision)hbList.get(0);  // 只获取第一个 div
        System.out.println(hb.toString());
        // 查找并获取特定的 input
        List<?> inputList = page.getByXPath("//input[@id='su']");
        HtmlInput input = (HtmlInput) inputList.get(0);
        System.out.println(input.toString());

        // 关闭 webClient
        webClient.close();
    }
}

4、提交搜索

public class HtmlUnitDemo {
    public static void main(String[] args) throws IOException {
        // 创建一个 webClient
//        WebClient webClient = new WebClient();    // 任意浏览器打开
        WebClient webClient = new WebClient(BrowserVersion.CHROME);  // 使用 Chrome 读取页面
        // htmlunit 对 JS 和 CSS 的支持不好,所以关闭
        webClient.getOptions().setJavaScriptEnabled(false);
        webClient.getOptions().setCssEnabled(false);
        HtmlPage page = webClient.getPage("http://www.baidu.com"); 

        // 提交搜索
        // 获取搜索输入框并提交搜索内容
        HtmlInput input = page.getHtmlElementById("kw");
        System.out.println(input.toString());
        input.setValueAttribute("htmlunit API");
        System.out.println(input.toString());
        // 获取搜索按钮并点击
        HtmlInput btn = page.getHtmlElementById("su");
        HtmlPage page1 = btn.click();
        // 输出新页面的文本
        System.out.println(page1.asText());

        // 关闭 webClient
        webClient.close();
    }
}