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

版权所有:  bluetata  dietime1943@gmail.com
本文地址:  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帮助文档

 
  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>

示例代码:

 
  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】

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

 

Flag Counter

--------------------- 本文来自 bluetata 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/dietime1943/article/details/79035779?utm_source=copy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你用 Java 的网络库(如 HttpURLConnection 或 HttpClient)请求某个网页获取的 HTML 代码中可能只是一个空的占位符,因为该网页中的部分内容可能是在客户端通过 JavaScript 动态生成的。 要获取动态生成的 HTML 内容,可以考虑使用一些支持 JavaScript 执行的 HTML 解析库,如 HtmlUnit 或 Selenium WebDriver。这些库可以模拟浏览器行为,执行网页中的 JavaScript 脚本,并获取动态生成的 HTML 内容。 以下是使用 HtmlUnit 获取动态生成的 HTML 内容的示例代码: ``` // 创建一个 WebClient 实例,用于执行 JavaScript 脚本 WebClient webClient = new WebClient(); // 设置 WebClient 的一些属性,如启用 JavaScript、忽略 SSL 证书等 webClient.getOptions().setJavaScriptEnabled(true); webClient.getOptions().setUseInsecureSSL(true); webClient.getOptions().setCssEnabled(false); webClient.getOptions().setThrowExceptionOnScriptError(false); // 发送 HTTP 请求并获取 HTML 页面 HtmlPage page = webClient.getPage("http://www.example.com"); // 执行 JavaScript 脚本,等待页面加载完成 webClient.waitForBackgroundJavaScript(10000); // 获取动态生成的 HTML 内容 String html = page.asXml(); ``` 上述代码中,我们使用 HtmlUnit 创建了一个 WebClient 实例,并设置了一些属性,如启用 JavaScript、忽略 SSL 证书等。然后,发送 HTTP 请求并获取网页的 HTML 页面。接着,使用 `webClient.waitForBackgroundJavaScript(10000)` 方法等待 JavaScript 脚本执行完成。最后,使用 `page.asXml()` 方法获取整个网页的 HTML 内容,其中包括动态生成内容。 需要注意的是,使用 HtmlUnit 或 Selenium WebDriver 获取动态生成的 HTML 内容可能会比较慢,因为它们需要模拟浏览器行为,并执行 JavaScript 脚本。如果只需要获取静态的 HTML 内容,可以使用上面提到的 Jsoup 或其他的 HTML 解析库来解析 HTML 代码,速度会更快。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值