htmlUnit的读取js渲染的页面
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渲染的页面相关推荐
- Java使用HtmlUnit抓取js渲染页面
需求: 需要采集js渲染的页面,有些网站的页面是js渲染的 实现: 基于HtmlUnit实现: public static void getAjaxPage() throws Exception{ W ...
- Eva.js 渲染Web页面动画
Eva.js v1.2 已在以下项目中使用:淘宝双11 / 芭芭农场 / 淘宝斗地主 / 薅羊毛赚话费, Evs.js 现已支持淘宝 / 支付宝小程序中互动游戏的开发 RaxEva 是一个让开发同学能 ...
- 通过nodejs 服务器读取HTML文件渲染到页面
1.分别简单实现三个备用页面. login.html页面 index.html页面 代码片段: <!DOCTYPE html> <html> <head> < ...
- js动态渲染html页面,利用Scrapy-Splash抓取JS动态渲染的网页数据
随着越来越多的网站开始用JS在客户端浏览器动态渲染网站,导致很多我们需要的数据并不能由原始的html中获取,再加上Scrapy本身并不提供JS渲染解析的功能,通常对这类网站数据的爬取我们一般采用两种方 ...
- JS动态修改页面EasyUI datebox不生效、EasyUI动态添加Class、EasyUI动态渲染解析解决方案
JS动态修改页面EasyUI datebox不生效.EasyUI动态添加Class.EasyUI动态渲染解析解决方案 参考文章: (1)JS动态修改页面EasyUI datebox不生效.EasyUI ...
- 招聘数据爬取、数据处理与可视化(v2--解析JS渲染页面)
招聘数据爬取.数据处理与可视化(v2--解析JS渲染页面) 更新说明 程序说明 数据爬取 观察网页结构 页面解析 将数据写入csv文件中 通过观察页面链接,爬取所有页面 爬虫程序完整代码 爬取数据结果 ...
- express应用中ajax结合模板引擎ejs.js渲染页面
一.express应用中ajax结合模板引擎ejs.js渲染页面 在views新建一个渲染模板命名 Template.ejs Template.ejs 示例: <% if(coursesList ...
- ajax结合前端模板引擎ejs.js渲染页面(自己理解,不建议参考)
<一.利用前端前端引擎和ajax来渲染前端页面> 1.就是创建一个装渲染内容的盒子 comment是接口传进来的参数,就是传进来的数据,名字就叫"comment"因此: ...
- webmagic ajax,【WebMagic】抓取前端渲染的页面
随着AJAX技术不断的普及,以及现在AngularJS这种Single-page application框架的出现,现在js渲染出的页面越来越多.对于爬虫来说,这种页面是比较讨厌的:仅仅提取HTML内 ...
最新文章
- 【深度学习理论】(1) 损失函数
- HTML5+MUI+HBuilder 之初探情人
- 初学Java的那段日子
- 曾优雅击退史上最凶狠的DDoS攻击,AliGuard的高性能从何而来?
- 【CodeForces - 1150A】Stock Arbitraging (贪心,水题)
- 使用 jQuery Mobile 与 HTML5 开发 Web App —— jQuery Mobile 默认配置与事件基础
- 怎么编写java_程序员学编程第一步:手把手教你开发第一个Java程序
- 小米海外召回有潜在风险的电动滑板车 中国区无此风险
- “远程办公扼杀了万亿美元的办公经济”
- HDU - 2087 剪花布条(kmp)
- 计划学Linux,老男孩Linux怎么样?真实的学员评价!
- 在微信小程序中打造 MQTT 连接测试工具
- get与post的区别
- matlab 菱形符号,matlab 图形符号
- [PHP] 新浪企业邮箱登录功能难点梳理
- 高德地图各种摄像头图标_汽车导航怎么看?高德地图各种符号图标图解大全
- (node)Warning: Accessing non-existent property ‘xxx‘ of module exports inside circular depen
- windows10访问ubuntu子系统中的文件的方法
- 笔记本/台式机作为扩展屏
- 关于pycharm的常见问题