htmlunit
htmlunit 可以认为是一个无界面的浏览器,可以模拟动态 js 加载,这些是 jsoup 这种专注于页面解析的工具做不到的。
快速开始
maven 引入
[xml]
1
2
3
4
5<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.29</version>
</dependency>
实例代码
[java]
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
28public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
// 屏蔽HtmlUnit等系统 log
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log","org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);
java.util.logging.Logger.getLogger("org.apache.http.client").setLevel(Level.OFF);
String url = "https://bluetata.com/";
System.out.println("Loading page now-----------------------------------------------: "+url);
// HtmlUnit 模拟浏览器
WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setJavaScriptEnabled(true); // 启用JS解释器,默认为true
webClient.getOptions().setCssEnabled(false); // 禁用css支持
webClient.getOptions().setThrowExceptionOnScriptError(false); // js运行错误时,是否抛出异常
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(10 * 1000); // 设置连接超时时间
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(30 * 1000); // 等待js后台执行30秒
String pageAsXml = page.asXml();
// Jsoup解析处理
Document doc = Jsoup.parse(pageAsXml, "https://bluetata.com/");
Elements pngs = doc.select("img[src$=.png]"); // 获取所有图片元素集
// 此处省略其他操作
System.out.println(doc.toString());
}
内存经常 OMM 的问题
这是因为 htmlunit 后台会模拟一个浏览器,这是非常消耗资源的。
所以每次循环使用,记得关闭浏览器。
[java]
1webClient.close();
or
[java]
1webClient.closeAllWindows();