版权声明:随心所欲、无欲无求! https://blog.csdn.net/qq_32662595/article/details/88189584
在使用Jsoup
过程中会遇到无法解析通过javascript
动态生成的html网页,
解决办法是使用HtmlUnit+Jsoup
来解析动态dynamic
网页.
Jsoup
专注的是解析html, 利用类似JQuery的API进行快速解析html, 并没有将自身的定位于模拟浏览器上, 并不是现阶段某些人说的Jsoup
对于模拟浏览器不足等等, 大家在给同事讲解或者写博客的时候注明。而对于模拟浏览器, 进行无窗口化的访问, 有很多优秀的开源框架, 比如HttpClient
, 也比如今天介绍的HtmlUnit
, 亦或者Selenium
.
“ 现如今为止Jsoup-1.10.4
是无法动态加载js内容的, 官方作者的回复是:“Javascript is not supported. Jsoup parses HTML
.”。”
HtmlUnit
和Selenium
本身都是做测试的开源框架, 本身Selenium底层也使用了HtmlUnit
, 所以在本文直接介绍使用HtmlUnit进行处理动态js加载的Html问题.
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
如果是使用Maven构建项目, 请参照如下的配置, 如果是直接导入jar包, 直接到官网下载, 在群文件中可以下载jar包和API帮助文档
<!-- https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit -->
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.29</version>
</dependency>
示例代码:
public 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());
}