PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎。它原生支持多种web 标准:DOM 操做,CSS选择器,JSON,Canvas 以及SVG。javascript
找到对应版本下载安装,或是经过源码编译安装。java
下载phantomjs-1.9.8-windows.zip
并解压,phantomjs.exe
直接可用。方便起见,把phantomjs.exe
所在目录加入到PATH
中linux
下载phantomjs-1.9.8-macosx.zip
并解压,bin/phantomjs
直接可用。web
或者经过Homebrew安装macos
brew update && brew install phantomjs
或者经过MacPorts安装编程
sudo port selfupdate && sudo port install phantomjs
64位下载phantomjs-1.9.8-linux-x86_64.tar.bz2
windows
32位下载phantomjs-1.9.8-linux-i686.tar.bz2
浏览器
安装渲染所需(FreeType,Fontconfig)依赖:服务器
sudo apt-get install fontconfig freetype libfreetype.so.6 libfontconfig.so.1 libstdc++.so.6
安装完phantomjs 以后,将其可执行路径加入到PATH中。网络
新建hello.js
,添加以下代码:
console.log('Hello, world!'); phantom.exit();
在命令行里执行:
phantomjs hello.js
会输出:
Hello, world!
第一行代码,console.log
会打印字符串到命令行。第二行代码,phantom.exit
会终止执行过程。
注意:必定不要忘了在代码里调用phantom.exit
,不然PhantomJS将不会被终止
经过page
对象,咱们能够加载,分析,渲染页面。
下面的代码展现了page
对象最简单的用法。它加载example.com而后将其保存为一个图片example.png
。
var page = require('webpage').create(); page.open('http://example.com', function() { page.render('example.png'); phantom.exit(); });
PhantomJS基于Webkit引擎,能够布局和渲染页面,咱们能够利用这一点给网页拍照。
下面的loadspeed.js
,加载一个指定的URL,而后测量加载页面所需时间。
var page = require('webpage').create(), system = require('system'), t, address; if (system.args.length === 1) { console.log('Usage: loadspeed.js <some URL>'); phantom.exit(); } t = Date.now(); address = system.args[1]; page.open(address, function(status) { if (status !== 'success') { console.log('FAIL to load the address'); } else { t = Date.now() - t; console.log('Loading ' + system.args[1]); console.log('Loading time ' + t + ' msec'); } phantom.exit(); });
从命令行执行(注意有http
):
phantomjs loadspeed.js http://www.google.com
输出结果相似下面这样:
Loading http://www.google.com Loading time 719 msec
想要在页面的上下文里执行javascript或者coffeescript代码,要使用evaluate()
函数。evaluate()
能够返回一个对象,但必须是一个简单的对象,不能包含函数或者闭包。
下面的代码展现了如何显示一个网页的title:
var page = require('webpage').create(); page.open(url, function(status) { var title = page.evaluate(function() { return document.title; }); console.log('Page title is ' + title); phantom.exit(); });
默认状况下,页面代码里的console
输出的消息,以及evaluate()
里的console
输出的消息都不会显示出来。不过,经过使用onConsoleMessage
回调函数,你能够改写这一行为,上面的实例能够改成:
var page = require('webpage').create(); page.onConsoleMessage = function(msg) { console.log('Page title is ' + msg); }; page.open(url, function(status) { page.evaluate(function() { console.log(document.title); }); phantom.exit(); });
evaluate()
里的代码就像在浏览器里执行同样,因此像标准的DOM操做、CSS选择等均可以正常进行。咱们能够利用这一点将一些页面工做自动化。
当页面向服务器请求资源时,经过onResourceRequested
和 onResourceReceived
回调函数能够 记录request和response。例如:
var page = require('webpage').create(); page.onResourceRequested = function(request) { console.log('Request ' + JSON.stringify(request, undefined, 4)); }; page.onResourceReceived = function(response) { console.log('Receive ' + JSON.stringify(response, undefined, 4)); }; page.open(url);
基于此咱们能够进行一些页面性能的分析。