版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lilianggui/article/details/102539226
jsoup只能解析静态的html页面,如果页面由js动态生成的,jsoup就无从下手了,使用htmlunit可以获取js运行后的页面,还可以模拟浏览器点击页面上的元素等,非常强大,本文介绍htmlunit的简单使用。步骤如下:
1、引入依赖
<dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit</artifactId> <version>2.36.0</version> </dependency> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.12.1</version> </dependency>
2、我们爬取自己画的页面,先画一个简单的页面,页面中id为content的div原来的内容为hello,页面加载之后,内容变成<div>HtmlUnit好强大</div>,访问一下该页面可以看到结果
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>HtmlUnit简单使用</h1>
<div id="content">
hello
</div>
</body>
<script>
document.getElementById("content").innerHTML = "<div>HtmlUnit好强大</div>";
</script>
</html>

3、编写测试类,先使用jsoup直接爬取,看content中的内容是啥,我们打印一下,可以看到是hello
@Test
public void testJsoup() throws IOException {
Document document = Jsoup.connect("http://localhost:8080/index.html").get();
System.out.println(document.getElementById("content").html());
}

4、使用htmlunit之后看结果
@Test
public void test() {
final WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setActiveXNative(false);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
HtmlPage page = null;
try {
page = webClient.getPage("http://localhost:8080/index.html");
} catch (Exception e) {
e.printStackTrace();
}finally {
webClient.close();
}
webClient.waitForBackgroundJavaScript(30000);
String pageXml = page.asXml();
Document document = Jsoup.parse(pageXml);//获取html文档
System.out.println(document.getElementById("content").html());
}

可以看到是js运行之后的内容,和浏览器看到的结果一致