一、简介
是一款开源的 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();
}
}