[Jsoup] 使用HtmlUnit + Jsoup解析js动态生成的网页

版权所有:  bluetata  [email protected]
本文地址:  http://blog.csdn.net/dietime1943/article/details/79035779
转载请注明来源/作者

在使用Jsoup过程中会遇到无法解析通过javascript动态生成的html网页, 在Jsoup交流群中也经常会有人问到这个问题, 本文的解决办法是使用HtmlUnit+Jsoup来解析动态dynamic网页.

一般会出现动态js加载的网页源码为, 某些关键性数据, 比如某简历网站的年份, 薪金等敏感数据信息, 也比如某些网站动态加载出来的新闻, 公告, 也比如某些网站在生成快照的时候的更新时间, 这些都可能是通过js动态生成的DOM元素后进行加载的.

Jsoup专注的是解析html, 利用类似JQuery的API进行快速解析html, 并没有将自身的定位于模拟浏览器上, 所以并不是现阶段某些人说的Jsoup对于模拟浏览器不足等等, 希望大家在给同事讲解或者写博客的时候注明。而对于模拟浏览器, 进行无窗口化的访问, 有很多优秀的开源框架, 比如HttpClient, 也比如今天介绍的HtmlUnit, 亦或者Selenium.

 现如今为止Jsoup-1.10.4是无法动态加载js内容的, 官方作者Jonathan Hedley给予的回复是:“Javascript is not supported. Jsoup parses HTML.”。HtmlUnit和Selenium本身都是做测试的开源框架, 本身Selenium底层也使用了HtmlUnit, 所以在本文直接介绍使用HtmlUnit进行处理动态js加载的Html问题.


如果是使用Maven构建项目, 请参照如下的配置, 如果是直接导入jar包, 直接到官网下载或者加博文后的Jsoup交流群, 在群文件中可以下载jar包和API帮助文档

[html]  view plain  copy
  1. <!-- https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit -->  
  2. <dependency>  
  3.     <groupId>net.sourceforge.htmlunit</groupId>  
  4.     <artifactId>htmlunit</artifactId>  
  5.     <version>2.29</version>  
  6. </dependency>  
示例代码:
[java]  view plain  copy
  1.     public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {  
  2.           
  3.         // 屏蔽HtmlUnit等系统 log  
  4.         LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log","org.apache.commons.logging.impl.NoOpLog");  
  5.         java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);  
  6.         java.util.logging.Logger.getLogger("org.apache.http.client").setLevel(Level.OFF);  
  7.   
  8.         String url = "https://bluetata.com/";  
  9.         System.out.println("Loading page now-----------------------------------------------: "+url);  
  10.           
  11.         // HtmlUnit 模拟浏览器  
  12.         WebClient webClient = new WebClient(BrowserVersion.CHROME);  
  13.         webClient.getOptions().setJavaScriptEnabled(true);              // 启用JS解释器,默认为true  
  14.         webClient.getOptions().setCssEnabled(false);                    // 禁用css支持  
  15.         webClient.getOptions().setThrowExceptionOnScriptError(false);   // js运行错误时,是否抛出异常  
  16.         webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);  
  17.         webClient.getOptions().setTimeout(10 * 1000);                   // 设置连接超时时间  
  18.         HtmlPage page = webClient.getPage(url);  
  19.         webClient.waitForBackgroundJavaScript(30 * 1000);               // 等待js后台执行30秒  
  20.   
  21.         String pageAsXml = page.asXml();  
  22.           
  23.         // Jsoup解析处理  
  24.         Document doc = Jsoup.parse(pageAsXml, "https://bluetata.com/");    
  25.         Elements pngs = doc.select("img[src$=.png]");                   // 获取所有图片元素集  
  26.         // 此处省略其他操作  
  27.         System.out.println(doc.toString());  
  28.     }  

 Jsoup学习讨论QQ群:50695115

 Jsoup爬虫代码示例及博客内源码下载:https://github.com/bluetata/crawler-jsoup-maven

 更多Jsoup相关文章,请查阅专栏:【Jsoup in action】

扫描二维码关注公众号,回复: 154154 查看本文章

本文原创由`bluetata`发布于blog.csdn.net、转载请务必注明出处。

猜你喜欢

转载自blog.csdn.net/clwwlc/article/details/79739365
今日推荐