htmlUnit的读取js渲染的页面

我这边有个这么的需求,要求前端每次上版本的时候,有一个版本号。然后后端去爬前端,比较禅道的版本发布计划,如果发布计划和生产上的版本号不一致,就告警。

这个跟后端的jar包,每次打包,读取该分支的git号,然后打包到jar包一样,这样每次发版就知道当前的版本是什么版本了。

前端那边摸索出来了,但是读取的时候出了点问题。前端提供的页面,如果用浏览器去浏览,是很正常的。然后用httpclient去读取,发现没有对应的标签。

很明显,这个是因为,这个结构是js渲染后生成的,这样的话,就得换工具了。

百度了下,发现java用的是htmlunit。

工具类是这样。

public class MyHtmlUnitHelper {/*** 设置一个无头浏览器,抓取动态渲染页面* @param requestUrl 要解析页面URL地址* @return 返回Document对象*/public static Document accordingToURLGetBrowserHtml(String requestUrl) throws InterruptedException, MalformedURLException {final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_ESR);//新建一个模拟谷歌Chrome浏览器的浏览器客户端对象webClient.getOptions().setThrowExceptionOnScriptError(false);//当JS执行出错的时候是否抛出异常, 这里选择不需要webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//当HTTP的状态非200时是否抛出异常, 这里选择不需要webClient.getOptions().setActiveXNative(false);//不启用ActiveXwebClient.getOptions().setCssEnabled(false);//是否启用CSS, 因为不需要展现页面, 所以不需要启用webClient.getOptions().setJavaScriptEnabled(true); //很重要,启用JSwebClient.getOptions().setDownloadImages(false);//不下载图片webClient.getOptions().setActiveXNative(false);webClient.setAjaxController(new NicelyResynchronizingAjaxController());//很重要,设置支持AJAXwebClient.getOptions().setUseInsecureSSL(true);webClient.setWebConnection(new WebConnectionWrapper(webClient) {@Overridepublic WebResponse getResponse(WebRequest request) throws IOException {WebResponse response = super.getResponse(request);return response;}});HtmlPage page = null;try {page = webClient.getPage(requestUrl);//尝试加载上面图片例子给出的网页} catch (Exception e) {e.printStackTrace();}finally {webClient.close();}webClient.waitForBackgroundJavaScript(30000);//异步JS执行需要耗时,所以这里线程要阻塞30秒,等待异步JS执行结束String pageXml = page.asXml();//直接将加载完成的页面转换成xml格式的字符串Document parse = Jsoup.parse(pageXml);
//        Elements big = parse.getElementsByTag("big");
//        String text = big.text();
//        System.out.println(parse);return parse;}public static void main(String[] args) throws InterruptedException, MalformedURLException {Document document = MyHtmlUnitHelper.accordingToURLGetBrowserHtml("https://xjczgl.zjxj.gov.cn/#/version");Elements big = document.getElementsByTag("big");String text = big.text();System.out.println(text);}
}
      <!--jsoup 是一款 Java 的HTML 解析器--><dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.13.1</version></dependency><!--模拟一个无头浏览器--><dependency><groupId>net.sourceforge.htmlunit</groupId><artifactId>htmlunit</artifactId><version>2.60.0</version></dependency>

这个工具能模拟浏览器,执行js。然后将读取到的内容用html解析器jsoup去读取。这样我就能读取到对应的版本号了。

但是又出现了一个问题,我发现本地的前端能爬到,而生产的却爬不到,然后我看了下,本地执行js是没问题的,而生产的js执行却有问题。

为啥?本地和生产的区别,无非就是nginx。是不是nginx的gzip的原因?

因为开启了gzip,然后导致js执行有问题,然后我改了下测试的nginx,关闭了gzip,再去爬,记过还是js执行失败。这我就抓瞎了,为什么我本地能执行成功,生产却执行失败。是字符集还是换行符的问题?

我看了下报错

很明显,是js执行错误。那就debug吧。

emm,很清楚了,就是执行这个js的时候,这个js里面有特殊字符。估计就是换行符了。

那怎么办呢?

要么改js,要么就读取的时候,替换换行符了。

但是我感觉不太对,为什么我非得读动态生成的版本号。

我直接让前端给我提供一个json文件,我读取静态的json文件就好。

一了百了。

htmlUnit的读取js渲染的页面相关推荐

  1. Java使用HtmlUnit抓取js渲染页面

    需求: 需要采集js渲染的页面,有些网站的页面是js渲染的 实现: 基于HtmlUnit实现: public static void getAjaxPage() throws Exception{ W ...

  2. Eva.js 渲染Web页面动画

    Eva.js v1.2 已在以下项目中使用:淘宝双11 / 芭芭农场 / 淘宝斗地主 / 薅羊毛赚话费, Evs.js 现已支持淘宝 / 支付宝小程序中互动游戏的开发 RaxEva 是一个让开发同学能 ...

  3. 通过nodejs 服务器读取HTML文件渲染到页面

    1.分别简单实现三个备用页面. login.html页面 index.html页面 代码片段: <!DOCTYPE html> <html> <head> < ...

  4. js动态渲染html页面,利用Scrapy-Splash抓取JS动态渲染的网页数据

    随着越来越多的网站开始用JS在客户端浏览器动态渲染网站,导致很多我们需要的数据并不能由原始的html中获取,再加上Scrapy本身并不提供JS渲染解析的功能,通常对这类网站数据的爬取我们一般采用两种方 ...

  5. JS动态修改页面EasyUI datebox不生效、EasyUI动态添加Class、EasyUI动态渲染解析解决方案

    JS动态修改页面EasyUI datebox不生效.EasyUI动态添加Class.EasyUI动态渲染解析解决方案 参考文章: (1)JS动态修改页面EasyUI datebox不生效.EasyUI ...

  6. 招聘数据爬取、数据处理与可视化(v2--解析JS渲染页面)

    招聘数据爬取.数据处理与可视化(v2--解析JS渲染页面) 更新说明 程序说明 数据爬取 观察网页结构 页面解析 将数据写入csv文件中 通过观察页面链接,爬取所有页面 爬虫程序完整代码 爬取数据结果 ...

  7. express应用中ajax结合模板引擎ejs.js渲染页面

    一.express应用中ajax结合模板引擎ejs.js渲染页面 在views新建一个渲染模板命名 Template.ejs Template.ejs 示例: <% if(coursesList ...

  8. ajax结合前端模板引擎ejs.js渲染页面(自己理解,不建议参考)

    <一.利用前端前端引擎和ajax来渲染前端页面> 1.就是创建一个装渲染内容的盒子 comment是接口传进来的参数,就是传进来的数据,名字就叫"comment"因此: ...

  9. webmagic ajax,【WebMagic】抓取前端渲染的页面

    随着AJAX技术不断的普及,以及现在AngularJS这种Single-page application框架的出现,现在js渲染出的页面越来越多.对于爬虫来说,这种页面是比较讨厌的:仅仅提取HTML内 ...

最新文章

  1. 【深度学习理论】(1) 损失函数
  2. HTML5+MUI+HBuilder 之初探情人
  3. 初学Java的那段日子
  4. 曾优雅击退史上最凶狠的DDoS攻击,AliGuard的高性能从何而来?
  5. 【CodeForces - 1150A】Stock Arbitraging (贪心,水题)
  6. 使用 jQuery Mobile 与 HTML5 开发 Web App —— jQuery Mobile 默认配置与事件基础
  7. 怎么编写java_程序员学编程第一步:手把手教你开发第一个Java程序
  8. 小米海外召回有潜在风险的电动滑板车 中国区无此风险
  9. “远程办公扼杀了万亿美元的办公经济”
  10. HDU - 2087 剪花布条(kmp)
  11. 计划学Linux,老男孩Linux怎么样?真实的学员评价!
  12. 在微信小程序中打造 MQTT 连接测试工具
  13. get与post的区别
  14. matlab 菱形符号,matlab 图形符号
  15. [PHP] 新浪企业邮箱登录功能难点梳理
  16. 高德地图各种摄像头图标_汽车导航怎么看?高德地图各种符号图标图解大全
  17. (node)Warning: Accessing non-existent property ‘xxx‘ of module exports inside circular depen
  18. windows10访问ubuntu子系统中的文件的方法
  19. 笔记本/台式机作为扩展屏
  20. 关于pycharm的常见问题

热门文章

  1. 可视化随笔 阶梯图
  2. 如何选择NTC热敏电阻
  3. 2023年最值得关注的十大科技趋势,这些技术将迎来爆发,把握住风口和掘金机会!
  4. C++ 有关string类的基本语法以及一个简单算法 理论加案例的形式
  5. php 双向链表,Go实现双向链表
  6. 告别公共网盘,用闲置电脑或个人工作PC建立私有云超级网盘!
  7. APP界面设计指南|APP界面设计师必备信息图
  8. 如何加密/弄乱C源代码
  9. 免费国产化Hypervisor系统安装
  10. 四旋翼飞行器轨迹跟踪仿真MATLAB simulink/simscape