htmlunit抓取动态网页(开源的Java页面分析工具,被誉为Java浏览器的开源实现 )
优采云 发布时间: 2022-02-23 13:20htmlunit抓取动态网页(开源的Java页面分析工具,被誉为Java浏览器的开源实现
)
一、简介
它是一个开源的Java页面分析工具。阅读完页面后,可以有效地使用htmlunit分析页面上的内容
可以模拟浏览器的操作,被称为Java浏览器的开源实现
1、是一个无界面浏览器Java程序
对HTML文档进行建模,提供调用页面、填写表单、单机链接等API。
和浏览器一样
2、拥有不断改进的 JavaScript 支持,甚至可以使用相当复杂的 AJAX 库
根据配置模拟 Chrome、Firefox 或 IE 等浏览器
3、通常用于测试或从网站检索信息二、使用场景
一般情况下,可以使用Apache的HttpClient组件来获取HTML页面信息。 HttpClient实现的http请求返回的响应一般是纯文本文档页面,也就是最原创的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();
}
}