使用PhantomJS实现网页截图服务

2015-12-12来源:Java教程人气:99

这是上半年遇到的一个小需求,想实现网页的抓取,并保存为图片。研究了不少工具,效果都不理想,不是显示太差了(Canvas、Html2Image、Cobra),就是性能不怎么样(如SWT的Brower)。后发现无界面浏览器可以满足这个条件,大致研究了一下PhantomJS与CutyCapt,两者都是Webkit内核,其中PhantomJS使用上更方便一些,尤其在Windows平台上,如果在linux下,从2.0版本后需要自己去机器上编译了(大概要编译3个小时,不得不说,g++就是个渣渣,同样的项目,在vc下编译快得,不谈了,毕竟是免费开源的编译器)。下面介绍PhantomJS结合java代码实现的网页截图技术:

 一、环境准备

1、PhantomJS脚本的目录:D:/xxx/phantomjs-2.0.0-windows/bin/phantomjs

2、截图脚本:D:/xxx/phantomjs-2.0.0-windows/bin/rasterize.js

截图的脚本在官网上有提供,但是我这里需要说明一下它的高宽度设计原理:

page.viewportSize = { width: 600, height: 600 };

这个是默认的高度,也就是600X600,我建议大家把height设置小一点,我这边设置的是width:800,height:200。因为实际上,在不同时设置高度与亮度的情况下,如果真实的网页的高度大于设置值时,图片会自动扩充高宽度的,直到整个页面显示完(当你想截取小的图片时,可能由于默认设置的太大,会使图片有很大一块空的)。如果同时设置了高宽度,下面的代码会被执行,就会对网页的部分进行截取了:

page.clipRect = { top: 0, left: 0, width: pageWidth, height: pageHeight };

3、先用命令行测试一下:

D:/xxx/phantomjs-2.0.0-windows/bin/phantomjs D:/xxx/phantomjs-2.0.0-windows/bin/rasterize.js http://www.QQ.com D:/test.png

如果配置好了,应该可以看到生成的图片了。当然还可以配置高宽度的参数,在上面的命令后加上:" 1000px"或" 1000px*400px",都是可以的。

二、服务器代码

作为一个网页截图服务,这部分代码片段应当被布署在服务器上,当然不必全照搬啦,根据自己的需求来用就好了:

  1 package lekkoli.test;2 3 import java.io.BufferedInputStream;4 import java.io.BufferedReader;5 import java.io.ByteArrayOutputStream;6 import java.io.File;7 import java.io.FileInputStream;8 import java.io.IOException;9 import org.apache.log4j.Logger; 10 11 /**12  * 网页转图片处理类,使用外部CMD13  * @author lekkoli14  */15 public class PhantomTools {16 17     PRivate static final Logger _logger = Logger.getLogger(PhantomTools.class);18 19     // private static final String _tempPath = "/data/temp/phantom_";20     // private static final String _shellCommand = "/usr/local/xxx/phantomjs /usr/local/xxx/rasterize.js ";  Linux下的命令21     private static final String _tempPath = "D:/data/temp/phantom_";22     private static final String _shellCommand = "D:/xxx/phantomjs-2.0.0-windows/bin/phantomjs D:/xxx/phantomjs-2.0.0-windows/bin/rasterize.js ";    23 24     private String _file;25     private String _size;26 27     /**28      * 构造截图类29      * @parm hash 用于临时文件的目录唯一化30      */31     public PhantomTools(int hash) {32         _file = _tempPath + hash + ".png";33     }34 35     /**36      * 构造截图类37      * @parm hash 用于临时文件的目录唯一化38      * @param size 图片的大小,如800px*600px(此时高度会裁切),或800px(此时 高度最少=宽度*9/16,高度不裁切)39      */40     public PhantomTools(int hash, String size) {41         this(hash);42         if (size != null)43             _size = " " + size;44     }45 46     /**47      * 将目标网页转为图片字节流48      * @param url 目标网页地址49      * @return 字节流50      */51     public byte[] getByteImg(String url) throws IOException {52         BufferedInputStream in = null;53         ByteArrayOutputStream out = null;54         File file = null;55         byte[] ret = null;56         try {57             if (exeCmd(_shellCommand + url + " " + _file + (_size != null ? _size : ""))) {58                 file = new File(_file);59                 if (file.exists()) {60                     out = new ByteArrayOutputStream();61                     byte[] b = new byte[5120];62                     in = new BufferedInputStream(new FileInputStream(file));63                     int n;64                     while ((n = in.read(b, 0, 5120)) != -1) {65                         out.write(b, 0, n);66                     }67                     file.delete();68                     ret = out.toByteArray();69                 }70             } else {71                 ret = new byte[] {};72             }73         } finally {74             try {75                 if (out != null) {76                     out.close();77                 }78             } catch (IOException e) {79                 _logger.error(e);80             }81             try {82                 if (in != null) {83                     in.close();84                 }85             } catch (IOException e) {86                 _logger.error(e);87             }88             if (file != null && file.exists()) {89                 file.delete();90             }91         }92         return ret;93     }94 95     /**96      * 执行CMD命令97      */98     private static boolean exeCmd(String commandStr) {99         BufferedReader br = null;
100         try {
101             Process p = Runtime.getRuntime().exec(commandStr);
102             if (p.waitFor() != 0 && p.exitValue() == 1) {
103                 return false;
104             }
105         } catch (Exception e) {
106             _logger.error(e);
107         } finally {
108             if (br != null) {
109                 try {
110                     br.close();
111                 } catch (Exception e) {
112                     _logger.error(e);
113                 }
114             }
115         }
116         return true;
117     }
118 }

使用上面的PhantomTools类,可以很方便地调用getByteImg方法来生成并获取图片内容。  

附上我的截图配置脚本:rasterize.js,至于PhantomJS,大家就自行去官网下载吧。

转载请注明原址:http://www.cnblogs.com/lekko/p/4796062.html  

使用PhantomJS实现网页截图服务相关推荐

  1. 有了 serverless,前端也可以快速开发一个 Puppeteer 网页截图服务

    更多云原生技术资讯可关注阿里巴巴云原生技术圈. Puppeteer 是什么? puppeteer 官网的介绍如下: Puppeteer is a Node library which provides ...

  2. Serverless 实战 —— 前端也可以快速开发一个 Puppeteer 网页截图服务

    Serverless 实战 -- 前端也可以快速开发一个 Puppeteer 网页截图服务 更多云原生技术资讯可关注阿里巴巴云原生技术圈. Puppeteer 是什么? puppeteer 官网的介绍 ...

  3. 开发函数计算的正确姿势——网页截图服务

    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算 ...

  4. phantomjs实现免费在线网页截图工具-toolfk程序员在线工具网

    本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果.Tool ...

  5. Java phantomjs 网页截图

    简介 根据传入的url对网页进行截图.打开网页和截取图片通过软件phantomjs.exe在后台静默完成.注:该过程不需要打开浏览器 优点: 1.该软件支持多个平台,包括Linux,Windows. ...

  6. Python+Selenium+phantomjs实现网页模拟登录和截图

    Python+Selenium+phantomjs实现网页模拟登录和截图 本文全部操作均在windows环境下 安装 Python Python是一种跨平台的计算机程序设计语言,它可以运行在Windo ...

  7. 网页截图和svg模版动态生成图片Java实现

    网页截图和svg模版动态生成图片Java实现 使用场景 需要Java语言动态生成图片 用流程图简单说明下我这边工作中使用的场景 仅供参考 所以这里就需要生成证书了 我先给大家看下最终实现的图片效果 这 ...

  8. node截图服务可用性报告

    2019独角兽企业重金招聘Python工程师标准>>> 前言 服务器端截图可以做什么? 个人观点:省去跟报表有关的EDM开发,直接从系统上截图,然后发图片给用户就搞定.剩下的自己脑补 ...

  9. 谷歌浏览器如何使用网页截图

    谷歌浏览器要如何截图呢,用户在使用浏览器的时候就会非常需要使用页面截图,那么这款软件要如何使用呢,今天小编就会为大家分享一个怎样操作的方法,让用户在需要的时候,直接使用页面就可以马上截图,使用超级的方 ...

最新文章

  1. android post请求添加公共参数_XHttp2 一个功能强悍的网络请求库
  2. Python web 项目的依赖管理工具
  3. java 动态编译 canino_java动态编译
  4. python实际应用方面的材料_python应用于哪些方面
  5. acid(数据库事务正确执行的四个基本要素的缩写)
  6. C++(STL):12--- list基本介绍
  7. 前谷歌技术主管亲述:程序员请避开这几大雷区
  8. 绿联扩展坞拆解_拆解报告:UGREEN绿联3A1C四口多功能扩展坞(带SD卡槽版)
  9. Install Eclipse 3.7 Indigo and configure Eclipse
  10. android list 替换元素_Java学习之List集合
  11. 基于linux下的在线电子词典
  12. 如何避免谷歌GMC广告被封,被封后又如何解封呢?
  13. 输出三角形,平行四边形,菱形
  14. 天蝎项目整机柜服务器技术规范v1.01,天蝎项目整机柜服务器技术规范v1.01
  15. 阿里云centos下载地址
  16. 头腾大战再升级 字节跳动做游戏的胜算有多少?
  17. 网络虚拟化城域网创新实践
  18. 嵌入式新闻早班车-第13期
  19. 如何理解行高和高度?
  20. DNS抗压集群服务器部署、远程加密更新DNS、花生壳(DDNS)--动态域名解析功能实现

热门文章

  1. ITK:应用Exp负图像过滤器
  2. ITK:二进制XOR两个图像
  3. VTK:PolyData之ColorCells
  4. Qt CMake变量参考
  5. Qt Creator加States
  6. C语言unit test单元测试类的实现(附完整源码)
  7. OpenGL material light材质灯光的实例
  8. OpenGL GLSL Shader Subroutines函数的实例
  9. C++Strand Sort链排序的实现算法(附完整源码)
  10. C++实现skip list跳表(附完整源码)