java phantomjd linux_Java使用phantomjs进行截图

断断续续查找资料、验证不同的实现方法终于算基本搞定了页面截图,因为中间过程曲折花费较多时间,分享出来帮助大家快速实现截图

为什么选用phantomjs进行截图

截图可以实现的方式有很多,比如:

selenium

HtmlUnit

Html2Image 、、、and so on 但是这些实现的截图效果都不好。selenium只能实现截屏,不能截取整个页面,而HtmlUnit、Html2Image对js的支持效果并不好,截下来的图会有很多空白。phantomjs就是万精油了,既能截取整个页面,对js支持的效果又好

前期准备

安装phantomjs。mac os

命令行的方式进行截图

安装以后我们就可以小试牛刀了

打开终端,输入以下命令:

查看效果

59a5cb93a6bf5b3ef1aa19a67aa61556.png发现图片没有加载好

87cf5a6dc812907002956428ef2f4bb3.png

来看以下刚刚的命令行: /Users/hetiantian/SoftWares/phantomjs/bin/phantomjs:phantomjs可执行文件保存地址 /Users/hetiantian/SoftWares/phantomjs/examples/rasterize.js:rasterize.js文件地址 这段命令可以理解为用phantomjs去运行rasterize.js文件,所以要想解决图片空白的问题我们需要去看一下rasterize.js文件。

尝试一: 对page.viewportSize = { width: 600, height: 600 };产生了疑问️ 把height调大十倍,发现基本是完美截图了,但是如果页面的篇幅特别短,会发现有瑕疵,下面留有一大片空白。原因:page.viewportSize = { width: 600, height: 600 };设置的是初始打开浏览器的大小,通过增大这个值可以加载js。如果我们能拿到实际页面的大小在设置height大小,但是不,我不能。

8c5dbcce3435b930e064c432de285b34.png

并且不能接受预先设定一个很大的height值,比如30000,因为不能接受底下留白的效果 尝试二: 在window.setTimeout方法之前加入以下代码

无奈evaluate里不能在用for循环了,前端渣渣真的不知道如何改,遂放弃

java代码方式进行截图

需要的依赖

代码实现

注释已经够详细了不多说了。唯一说一点:通过去执行js代码实现页面滑动,并且每次滑动都会通过睡眠保证有时间可以将 js加载进来。会调用33次滑动,因为phantomjs截取最大的高度为32767px,所以滑动33次可以保证能够截取到的最大页面部分其js已经是加载完成了的 附:window.scrollBy(0,1000)、window.scrollTo(0,1000)的区别

window.scrollTo(0, document.body.scrollHeight可以滑动到页面底部,不选择有两个原因: 1)一下子滑动到底部js会来不及被加载 2)有些页面没有底部,可以一直滑动加载 注:这里所说的js来不及加载指的是:想要截取页面的js来不及加载 该方式的缺点:比较费时间。果然熊和鱼掌不可兼得也,统计了一下截取一张图片大概需要四分多钟

===================更新于2018.10.15====================

phantomjs的缺点

有最大截图长度32767px

可能会出现跨越的问题

需要装浏览器驱动

可以使用google的puppeteer完成截图功能: 附简单demo:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值