利用PhantomJS进行网页截屏

关于PhantomJS

PhantomJS 是一个基于WebKit的服务器端 JavaScript API。它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG。PhantomJS可以用于页面自动化,网络监测,网页截屏,以及无界面测试等。

我们还可以用它来做爬虫哦,大家知道,网页上有些数据是通过执行js渲染出来的,这样的话爬虫去抓取数据的时候就会很麻烦,PhantomJS自带WebKit内核,我们可以利用PhantomJS解决爬虫不能执行js的问题。

这次要说的是他的截图功能

下面是官网提供的rasterize.js截图示例:

  1. var page = require('webpage').create(),
  2. system = require('system'),
  3. address, output, size;
  4. if (system.args.length < 3 || system.args.length > 5) {
  5. console.log('Usage: rasterize.js URL filename [paperwidth*paperheight|paperformat] [zoom]');
  6. console.log(' paper (pdf output) examples: "5in*7.5in", "10cm*20cm", "A4", "Letter"');
  7. console.log(' image (png/jpg output) examples: "1920px" entire page, window width 1920px');
  8. console.log(' "800px*600px" window, clipped to 800x600');
  9. phantom.exit(1);
  10. } else {
  11. address = system.args[1];
  12. output = system.args[2];
  13. page.viewportSize = { width: 600, height: 600 };
  14. if (system.args.length > 3 && system.args[2].substr(-4) === ".pdf") {
  15. size = system.args[3].split('*');
  16. page.paperSize = size.length === 2 ? { width: size[0], height: size[1], margin: '0px' }
  17. : { format: system.args[3], orientation: 'portrait', margin: '1cm' };
  18. } else if (system.args.length > 3 && system.args[3].substr(-2) === "px") {
  19. size = system.args[3].split('*');
  20. if (size.length === 2) {
  21. pageWidth = parseInt(size[0], 10);
  22. pageHeight = parseInt(size[1], 10);
  23. page.viewportSize = { width: pageWidth, height: pageHeight };
  24. // 通过clipRect可以指定渲染的区域:
  25. page.clipRect = { top: 0, left: 0, width: pageWidth, height: pageHeight };
  26. } else {
  27. console.log("size:", system.args[3]);
  28. pageWidth = parseInt(system.args[3], 10);
  29. pageHeight = parseInt(pageWidth * 3/4, 10); // it's as good an assumption as any
  30. console.log ("pageHeight:",pageHeight);
  31. page.viewportSize = { width: pageWidth, height: pageHeight };
  32. }
  33. }
  34. if (system.args.length > 4) {
  35. page.zoomFactor = system.args[4];
  36. }
  37. page.open(address, function (status) {
  38. if (status !== 'success') {
  39. console.log('Unable to load the address!');
  40. phantom.exit(1);
  41. } else {
  42. window.setTimeout(function () {
  43. page.render(output);
  44. phantom.exit();
  45. }, 200);
  46. }
  47. });
  48. }

上面的代码可以进行截图,不过问题就在于,页面的高度需要我们手动指定,那就不方便了。

在园子里发现有个哥们通过手动设定高度的方法来解决这个问题:http://www.cnblogs.com/xiehuiqi220/p/3551699.html,不过页面的高度没有那么高,渲染的图片下面就会出现大块的留白,也是不够灵活。

想到PhantomJS本身也可以执行js的,我们可以将页面加载完毕后,获取页面的实际高度,然后重新设定截取的区域,不就可以解决了。

于是便有了以下代码:

  1. // 通过在页面上执行脚本获取页面的渲染高度
  2. var bb = page.evaluate(function () {
  3. return document.getElementsByTagName('html')[0].getBoundingClientRect();
  4. });
  5. // 按照实际页面的高度,设定渲染的宽高
  6. page.clipRect = {
  7. top: bb.top,
  8. left: bb.left,
  9. width: bb.width,
  10. height: bb.height
  11. };
  12. // 预留一定的渲染时间
  13. window.setTimeout(function () {
  14. page.render(file);
  15. page.close();
  16. console.log('render ok');
  17. }, 1000);

改造后的代码如下:

  1. var page = require('webpage').create(),
  2. system = require('system'),
  3. address, output, size;
  4. if (system.args.length < 3 || system.args.length > 5) {
  5. console.log('Usage: rasterize.js URL filename');
  6. phantom.exit(1);
  7. } else {
  8. address = system.args[1];
  9. output = system.args[2];
  10. page.viewportSize = { width: 1024, height: 600 };
  11. page.open(address, function (status) {
  12. // 通过在页面上执行脚本获取页面的渲染高度
  13. var bb = page.evaluate(function () {
  14. return document.getElementsByTagName('html')[0].getBoundingClientRect();
  15. });
  16. // 按照实际页面的高度,设定渲染的宽高
  17. page.clipRect = {
  18. top: bb.top,
  19. left: bb.left,
  20. width: bb.width,
  21. height: bb.height
  22. };
  23. // 预留一定的渲染时间
  24. window.setTimeout(function () {
  25. page.render(output);
  26. page.close();
  27. console.log('render ok');
  28. }, 1000);
  29. });
  30. }

通过执行D:\Software\phantomjs-1.9.7-windows>phantomjs.exe render.js http://cnblogs.com cnblogs.png就可以把博客园首页截取下来了。

效果如下:

PhantomJS内置一个小型的Web服务器,我们可以将其封装成服务,这里就不过多介绍了,大家可以移步这里:http://www.jb51.net/article/43328.htm

据说看到好文章不推荐的人,服务器容易宕机!
本文版权归翟士丹(Stan Zhai)博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 
分类: 爬虫&舆情

利用PhantomJS进行网页截屏的更多相关文章

  1. 利用PhantomJS进行网页截屏,完美解决截取高度的问题

    关于PhantomJS PhantomJS 是一个基于WebKit的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS ...

  2. php结合phantomjs实现网页截屏、抓取js渲染的页面

    首先PhantomJS快速入门 PhantomJS是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, ...

  3. 使用PHANTOMJS对网页截屏

    PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, ...

  4. Java实现网页截屏功能(基于phantomJs)

    公司最近有个需求:把用户第一次的测量身体信息和最近一次测量信息进行对比,并且需要把对比的数据截成图片可以发给用户(需要在不打开网页的情况下实时对网页进行截图然后保存到服务器上,返回图片地址),通过网上 ...

  5. html转图片网页截屏(二)PhantomJS

    关于PhantomJS PhantomJS 是一个基于WebKit的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS ...

  6. PhantomJS linux系统下安装步骤及使用方法(网页截屏功能)

    PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, ...

  7. Python 实现网页截屏、查库、发邮件

    本文介绍了使用 Python(2.7版本)实现网页截屏.查库.发邮件的 demo.用到了 selenium.phantomjs.mailer.jinja2.mysqldb 还有 image,都是比较典 ...

  8. Javascript网页截屏的方法

    最近我在研究开发一个火狐插件,具体的功能是将网页内容截屏并分享到微博上.目前基本功能已经实现,大家可以在 @程序师视野 里看到用这个截图插件分享的微博的效果. 之前我曾写过如何将canvas图形转换成 ...

  9. JAVA之网页截屏

    先吐槽一下下: 表示接近两个月没有敲代码了,现在看一下代码都感觉有点生了.三天打鱼两天晒网是不行的,再说我本来就有“健忘症”,真的是木有办法啊 ̄へ ̄.我一直信奉一句话:“勤能补拙”,它也是我学习路上的 ...

随机推荐

  1. 淘宝异构数据源数据交换工具 DataX

    淘宝异构数据源数据交换工具 DataX 阅读目录 DataX是什么? DataX用来解决什么? DataX特点? DataX结构模式(框架+插件) DataX在淘宝的运用 DataX是什么? Data ...

  2. Ajax基础知识(二)

    接上一篇  Ajax基础知识(一) 在上一篇博客里,抛弃了VS中新建aspx页面,拖个button写上C#代码的方式.使用ajax的方式,异步向服务器请求数据.我们让服务器只简单的返回一个" ...

  3. Oracle 数据恢复指导具体解释

    1.数据恢复指导 : 高速检測.分析和修复故障 最大程度地降低停机故障和执行时故障 将对用户的干扰降到最低 用户界面:    --EM GUI 界面 (多个路径)    --RMAN 命令行 支持的数 ...

  4. 【剑指offer】:Q44:直扑克

    def IsContinuous(seq, num = 5): zeros = 0; d = 0 seq = sorted(seq) for i in range(num - 1): if seq[i ...

  5. ssh下常用操作汇总(good)

    1. 安装git,从程序目录打开 "Git Bash"  2. 键入命令:ssh-keygen -t rsa -C "email@email.com"   &q ...

  6. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建 前言:这 ...

  7. Javascript 继承 call与prototype

    function Parent(hello){ this.hello = hello; this.sayHello = function(){ alert(this.hello); } } Paren ...

  8. Configuration配置信息管理

    Configuration配置信息管理 在前面的章节中,我们知道新版的MVC程序抛弃了原来的web.config文件机制,取而代替的是config.json,今天我们就来深入研究一下配置文件的相关内容 ...

  9. python_random随机

    在数据清洗,评估 ,抽验等等过程中,经常有这样的应用场景 : 需要在一个大的数据集合中随机出来样本,进行人工评估.为了保证足够随机,借助脚本来实现. 下面一个脚本  ,用于应对这种应用场景. 使用方法 ...

  10. AppiumDriver java部分api

    getAppStrings() 默认系统语言对应的Strings.xml文件内的数据. getAppStrings(String language) 查找某一个语言环境对应的字符串文件Strings. ...