http://phantomjs.org/

昨天(2013/08/12)在代码区看到一个生成站点快照的代码,看了半天才发现,作者仅仅贴出来业务代码,最核心的生成快照图片的代码反而没有给出来。 以前记得google搜索提供站点缩略图的现实,那时候觉得好神奇,但是没有花时间去做深入的调研。昨天又遇到了,那就顺便调研下吧。

才开始找到了wkhtmltopdf这款工具,这款工具的地址是:http://code.google.com/p/wkhtmltopdf/。 这款工具集下有一个wkhtmltoimage,可以用来生成站点快照。才开始在xen的虚拟机上跑,操作系统是centos,各种问题,折腾到最后实在没经历折腾了。 查到后来,看到老外一篇文章,发现wkhtmltoimage对与运行xen虚拟机的系统支持的并不好,具体情况可以参见这篇文章:http://blog.behance.net/dev/wkhtmltopdf-wkhtmltoimage-x-centos-x-xen-segfault-mania

放弃了wkhtmltoimage,继续找到了phantomjs和slimerjs,两款都是服务器端的js,简单理解,都是封装了浏览器解析引擎,不同是phantomjs封装的webkti,slimerjs封装的是Gecko(firefox)。 权衡利弊,决定研究下phantomjs,于是就用phantomjs实现了网站快照生成。phantomjs的项目地址是:http://phantomjs.org/

代码涉及两个部分,一个是设计业务的index.php,另一个是生成快照的js脚本snapshot.js。代码比较简单,仅仅是实现了功能,没有做过多的修饰。代码分别如下所示:

index.php

 <?php
if (isset($_GET['url']))
{
set_time_limit(0); $url = trim($_GET['url']);
$filePath = "./cache/".md5($url).'.png'; if (is_file($filePath))
{
exit($filePath);
} $command = "phantomjs/bin/phantomjs snapshot.js {$url} {$filePath}";
exec($command); exit($filePath);
}
?> <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="keywords" content="" />
<meta name="description" content="" />
<title>快照生成</title>
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<style>
* {
margin: 0;
padding: 0;
} form {
padding: 20px;
} div {
margin: 20px 0 0;
} input {
width: 200px;
padding: 4px 2px;
} #placeholder {
display: none;
}
</style>
</head> <body>
<form action="" id="form">
<input type="text" id="url" />
<button type="submit">生成快照</button> <div>
<img src="" alt="" id="placeholder" />
</div>
</form> <script>
$(function(){
$('#form').submit(function(){
if (typeof($(this).data('generate')) !== 'undefined' && $(this).data('generate') === true)
{
alert('正在生成网站快照,请耐心等待...');
return false;
} $(this).data('generate', true);
$('button').text('正在生成快照...').attr('disabled', true); $.ajax({
type: 'GET',
url: '?',
data: 'url=' + $('#url').val(),
success: function(data){
$('#placeholder').attr('src', data).show();
$('#form').data('generate', false);
$('button').text('生成快照').attr('disabled', false);
}
}); return false;
});
});
</script>
</body>
</html>

snapshot.js

 var page = require('webpage').create();
var args = require('system').args; var url = args[1];
var filename = args[2]; page.open(url, function () {
page.render(filename);
phantom.exit();
});

上面的代码的演示用例的地址如下: http://static.miaowu.cc/snapshot/

上面的代码放在美国的vps上,国内的有些网站访问不了。

最新文章

  1. js转盘抽奖
  2. IOS 基础-define、const、extern、全局变量
  3. Linux的chattr与lsattr命令
  4. Video.js网页视频播放插件
  5. UVA 12075 - Counting Triangles(容斥原理计数)
  6. [Android学习笔记]jackson库的使用
  7. 4.ICMP协议,ping和Traceroute
  8. Spring context:component-scan中使用context:include-filter和context:exclude-filter
  9. LoadRunner面试题
  10. netty 入门二 (传输bytebuf 或者pojo)
  11. 《高级软件测试》11.14.安装和运行Jira
  12. windows 邮槽mailslot 在服务程序内建立后客户端无权限访问(GetLastError() == 5)的问题
  13. [转] React 最佳实践——那些 React 没告诉你但很重要的事
  14. MySQL Workbench 的安全设置
  15. POJ2185 Milking Grid 【lcm】【KMP】
  16. Django中的模型继承
  17. JQuery3 的新变化
  18. Unittest组织用例的姿势
  19. HDU 5775 L - Bubble Sort 树状数组
  20. 某考试 T1 sigfib

热门文章

  1. HDU 1548 A strange lift (Dijkstra)
  2. Codeigniter整合Tank Auth权限类库的教程
  3. C# 调用Windows API实现两个进程间的通信
  4. 读取excel文件内容代码
  5. Spark源码分析(三)-TaskScheduler创建
  6. session原理总结
  7. Java-马士兵设计模式学习笔记-观察者模式-OOD 线程 改进
  8. apimonitor
  9. 为什么要关闭360云盘:新来的美工嫌我们logo太丑,所以就决定关闭了。这个理由怎么样
  10. Winsock IOCP模型(四篇)