首先PhantomJS快速入门

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

一、安装

安装包下载地址: http://phantomjs.org/download.html ,包括 Windows ,Mac OS,Linux版本,自行选择对应 版本下载解压即可( 为方便使用,可自已为phantomjs设置环境变量 ),其中带有一个example文件夹,里面有很多已经写好的代码供使用。本文假设phantomjs已经安装好并已设置了环境变量。

二、使用

Hello, World!

新建一个包含下面两行脚本的文本文件:

console.log('Hello, world!');
phantom.exit();

将文件另存为 hello.js ,然后执行它:

phantomjs hello.js

输出结果为:Hello, world!

第一行将会在终端打印出字符串,第二行 phantom.exit 将退出运行。 
在该脚本中调用 phantom.exit 是非常重要的,否则 PhantomJS 将根本不会停止。

脚本参数 – Script Arguments

Phantomjs如何传递参数呢?如下所示 :

phantomjs examples/arguments.js foo bar baz

其中的foo, bar, baz就是要传递的参数,如何获取呢:

var system = require('system');
if (system.args.length === 1) {
console.log('Try to pass some args when invoking this script!');
} else {
system.args.forEach(function (arg, i) {
console.log(i + ': ' + arg);
});
}
phantom.exit();

它将输出 :

0: foo
1: bar
2: baz

页面加载 – Page Loading

通过创建一个网页对象,一个网页可以被加载,分析和渲染。

下面的脚本将示例页面对象最简单的用法,它加载 example.com 并且将它保存为一张图片, example.png 。

var page = require('webpage').create();
page.open('http://example.com', function () {
page.render('example.png');
phantom.exit();
});

由于它的这个特性,PhantomJS 可以用来 网页截屏 ,截取一些内容的快照,比如将网页、SVG存成图片,PDF等,这个功能很牛X。

接下来的 loadspeed.js 脚本加载一个特殊的URL (不要忘了http协议) 并且计量加载该页面的时间。

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 time ' + t + ' msec');
}
phantom.exit();
});

在命令行运行该脚本:

phantomjs loadspeed.js http://www.google.com

它输出像下面的东西:

Loading  http://www.google.com  Loading time 719 msec

代码运算 – Code Evaluation

要想在网页的上下文中对JavaScript 或 CoffeeScript 进行运算,使用 evaluate() 方法。代码是在“沙箱”中运行的,它没有办法读取在其所属页面上下文之外的任何JavaScript对象和变量。 evaluate() 会返回一个对象,然而它仅限制于简单的对象并且不能包含方法或闭包。

这有一个示例来显示网页标题:

var page = require('webpage').create();
page.open(url, function (status) {
var title = page.evaluate(function () {
return document.title;
});
console.log('Page title is ' + title);
});

任何来自于网页并且包括来自 evaluate() 内部代码的控制台信息,默认不会显示的。要重写这个行为,使用 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);
});
});

DOM操作 – DOM Manipulation

由于脚本好像是一个Web浏览器上运行的一样,标准的DOM脚本和CSS选择器可以很好的工作。这使得PhantomJS适合支持各种 页面自动化任务 。

下面的  useragent.js  将读取 id  为myagent的元素的  textContent  属性:

var page = require('webpage').create();
console.log('The default user agent is ' + page.settings.userAgent);
page.settings.userAgent = 'SpecialAgent';
page.open('http://www.httpuseragent.org', function (status) {
if (status !== 'success') {
console.log('Unable to access network');
} else {
var ua = page.evaluate(function () {
return document.getElementById('myagent').textContent;
});
console.log(ua);
}
phantom.exit();
});

上面示例同样提供了一种自定义 user agent 的方法。

使用JQuery及其他类库:

var page = require('webpage').create();
page.open('http://www.sample.com', function() {
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
page.evaluate(function() {
$("button").click();
});
phantom.exit()
});
});

网络请求及响应 – Network Requests and Responses

将一个页面从一台远程服务器请求一个资源的时候,请求和响应均可以通过 onResourceRequested  和  onResourceReceived  回调方法追踪到。示例  netlog.js :

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);

获取如何把该特性用于HAR 输出以及基于YSlow的性能分析的更多信息,请参阅 网络监控页面 。

PhantomJs官网: http://phantomjs.org/

GitHub: https://github.com/ariya/phantomjs/wiki/Quick-Start

 

上述帮助说明,来源于woiweb:https://www.tuicool.com/articles/beeMNj

使用 windows下PHP 执行 phantomjs

下面直接给出执行代码:

echo '<meta charset = "utf-8">';
exec('H:\wamp\www\phantomjs\bin\phantomjs --output-encoding=utf8 H:\wamp\www\Xss_Scanner\test.js ',$output_main);</pre></li><li><pre>var_dump($output_main);
//   $str = implode('',$output_main);
// var_dump($str);</pre></li></ol><p class="article-p">test.js文件里面的内容如下:</p><ol class="article-ol"><li><pre>console.log('Loading a web page');</pre></li><li><pre>var page = require('webpage').create();</pre></li><li><pre>var url = 'http://www.mafutian.net/';</pre></li><li><pre>page.open(url, function (status) {</pre></li><li><pre> //Page is loaded!</pre></li><li><pre> if (status !== 'success') {</pre></li><li><pre> console.log('Unable to post!');</pre></li><li><pre> } else {</pre></li><li><pre> console.log(page.content);</pre></li><li><pre> }</pre></li><li><pre> phantom.exit();</pre></li><li><pre>});</pre></li></ol><p class="article-p">执行结果如下图所示:</p><img class="article-img" animate="0" src="/public/blog/home/style/images/article/267_1.jpg" alt="请输入图片名称"><p class="article-p">注意,能够实现上面执行结果需要主要下面几点:</p><p class="article-p">(1)不能开启 PHP 的安全模式,即在 php.ini 中需要将 sql.safe_mode 设置为 Off。(并重启服务器,当然, php 本身默认就是不开启安全模式的)</p><p class="article-p">(2)无论 phantomjs 是否加入到系统环境变量中,在 exec() 中都应该是绝对路径的,以下执行是无效的:</p><ol class="article-ol"><li><pre>exec('phantomjs --output-encoding=utf8 H:\wamp\www\Xss_Scanner\test.js ',$output_main);

需要将 phantomjs 取绝对路径。

需要注意的是 js 文件可以不取绝对路径。可以是相对于网站根目录的,下面执行是成功的:

exec('H:\wamp\www\phantomjs\bin\phantomjs --output-encoding=utf8 test.js ',$output_main);

注:test.js 放置于网站的根目录下。

另外:在 PHP 下执行 phantomjs 也可以使用另外一个函数 systom() 来执行

以上内容参考:链接地址:http://www.mafutian.net/267.html

php-phantomjs中文API整理的集合DEMO

<?php
require 'vendor/autoload.php';
use JonnyW\PhantomJs\Client;//引入客户端
/*自定义模块*/
use JonnyW\PhantomJs\DependencyInjection\ServiceContainer;
$location = '/path/to/your/script/directory';//自定义模块所在文件夹
$serviceContainer = ServiceContainer::getInstance();
$procedureLoader</span> = <span class="hljs-variable">$serviceContainer->get('procedure_loader_factory')
->createProcedureLoader($location);//详细参见本文页尾 /*正常实例*/
$client = Client::getInstance();//实例 /*自定义模块*/
$client->setProcedure('my_procedure');//加载一个名为my_procedure.proc的自定义js模块,详见本文页尾
$client</span>-&gt;getProcedureLoader()-&gt;addLoader(<span class="hljs-variable">$procedureLoader);//自动加载模块 /*自设phantomjs参数*/
$client->getEngine()->addOption('--load-images=true');//phantomjs参数,参数地址:http://phantomjs.org/api/command-line.html
$client->getEngine()->addOption('--config=/path/to/config.json');//除了单独配置命令,还可配置命令集配置的json文件::本文页尾列举了常用的配置 /*调试与缓存*/
$client->getEngine()->debug(true);//允许或禁止调试
$client->getLog(); //开启调试则输出结果
$client->getProcedureCompiler()->clearCache();//清除缓存.建议允许前进行清除
$client->getProcedureCompiler()->enableCache();//允许缓存,建议开启
$client->getProcedureCompiler()->disableCache();//禁止读取缓存 /*渲染与请求方式*/
$link='http://jonnnnyw.github.io/php-phantomjs/4.0/3-usage/#on-load-finished';//请求的url
$client->isLazy(); // 是否让客户端等待所有资源加载完毕,开启此项务必开始setTimeout,避免轮询页面不断等待.
$request</span> = <span class="hljs-variable">$client->getMessageFactory()->createRequest();
$response</span> = <span class="hljs-variable">$client->getMessageFactory()->createResponse();
$request</span>-&gt;setUrl(<span class="hljs-variable">$link);
$request->setMethod('GET');//可GET|POST|OPTIONS|HEAD|DELETE|PATCH|PUT
$request->setTimeout(5000);//超过指定时间则中断渲染
$request->setDelay(5);//设置延迟5秒
$request->setRequestData(array('param1' => 'Param 1','param2' => 'Param 2'));//POST时发送的数据
$request->addHeader('custom_header_key', 'custom_header_value');//自定义头信息
$client</span>-&gt;send(<span class="hljs-variable">$request, $response);//发送请求 /*截图(图或PDF文件)*/
$request->setRepeatingHeader('<h1>Header <span style="float:right">%pageNum% / %pageTotal%</span></h1>',100);//自定义PDF类的头尾及其高度
$request->setRepeatingFooter('<footer>Footer <span style="float:right">%pageNum% / %pageTotal%</span></footer>',100);//自定义PDF类的头尾
$request->setViewportSize(200, 100);//设置可视宽高
$request->setBodyStyles(array('backgroundColor' => '#ff0000'));//设置纸张背景色
$request->setFormat('A4');//设置尺寸格式,如A4
$request->setOrientation('landscape');//设置纸张方向如纵向
$request->setPaperSize('10cm', '20cm');//PDF纸张大小
$request->setMargin('1cm');//PDF纸张边距
$request->setOutputFile('E:\php\file.jpg|file.pdf');//截图或PDF存储路径
$request</span>-&gt;setCaptureDimensions(<span class="hljs-number">240</span>, <span class="hljs-number">320</span>, <span class="hljs-number">10</span>, <span class="hljs-number">20</span>);<span class="hljs-comment">//设置截图宽高与边距$width, $height, $top, $left /*响应结果*/
$response->getHeaders();//返回头组成的数组
$response->getHeader();//返回头
$response->getStatus();//返回状态码:200则正确,其余错误.
$response->getContent();//返回正文
$response->getContentType();//返回正文类型
$response->getUrl();//返回请求地址
$response->getRedirectUrl();//返回重定向后的地址
$response->isRedirect();//返回是否重定向
$response->getConsole();//返回JS控制台内容

A. 常用命令参数: 

1.--ignore-ssl-errors=[true|false]忽略SSL错误,例如过期或自签名证书错误(默认为false)。 
2.--load-images=[true|false]加载所有内联图像(默认为true)。 
其它的很少用得到,http://phantomjs.org/api/command-line.html

B.自定义模块用法: 

global_variables.partial 允许任何javascript变量注入脚本的顶部。 
page_clip_rect.partial 如果请求是屏幕捕获,这将定义页面裁剪矩形。 
page_custom_headers.partial 在页面对象上设置任何自定义标题。 
page_on_error.partial 定义页面错误执行的代码。 
page_on_resource_received.partial 定义在资源接收时执行的代码。 
page_on_resource_timeout.partial 定义在资源超时时执行的代码。 
page_open.partial 定义页面打开时执行的代码。 
page_paper_size.partial 如果请求是PDF输出,这将设置纸张尺寸。 
page_settings.partial 最明显地定义任何页面设置资源超时值。 
page_viewport_size.partial 如果在请求中定义,请设置视口大小。 
page_body_styles.partial 在请求的页面的body标签上设置CSS样式。 
phantom_on_error.partial 定义在PhantomJS错误中执行的代码。 
procedure_capture.partial 定义请求是捕获请求时执行的代码。 
procedure_default.partial 定义为默认请求执行的代码。 
procedure_pdf.partial 定义请求是PDF请求时执行的代码。 
编译的时候所对应的位置:https://github.com/jonnnnyw/php-phantomjs/blob/master/src/JonnyW/PhantomJs/Resources/procedures/http_default.proc

除了上方的默认模块之外,你也可以自定义一个js模块

首先创建至少755权限的.proc文件,例如/my_procedure(名称随意,上面引入时无需后缀).proc

//.proc示例脚本
var page = require('webpage').create();
page.open ('{{ input.getUrl() }}', '{{ input.getMethod() }}', '{{ input.getBody() }}', function (status) {
//你的js脚本
phantom.exit(1);//退出
});
...

更多细节,详见.http://jonnnnyw.github.io/php-phantomjs/4.0/4-custom-scripts/

php结合phantomjs实现网页截屏、抓取js渲染的页面的更多相关文章

  1. 利用PhantomJS进行网页截屏

    利用PhantomJS进行网页截屏 关于PhantomJS PhantomJS 是一个基于WebKit的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种W ...

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

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

  3. 使用PHANTOMJS对网页截屏

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

  4. 如何用phantomjs去抓取js渲染后的页面

    1.安装phantomjs 网上有很多. 2.执行官网上的示例代码 // Read the Phantom webpage '#intro' element text using jQuery and ...

  5. Java使用HtmlUnit抓取js渲染页面

    需求: 需要采集js渲染的页面,有些网站的页面是js渲染的 实现: 基于HtmlUnit实现: public static void getAjaxPage() throws Exception{ W ...

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

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

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

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

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

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

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

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

随机推荐

  1. HDU 6095 17多校5 Rikka with Competition(思维简单题)

    Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...

  2. c语言求最大公约数和最小公倍数(转)

    最大公约数与最小公倍数的求解是很多初学C的人所面临的一道问题.当然这道问题并不难解答,也有很多人已经写过相关的博客,我在此书写此篇博客,一是为了让自己能够夯实基础,另外就是希望能够帮到和我一样的初学者 ...

  3. DG备库,实时应用如何判断,MR进程,及MRP应用归档,三种情况的查询及验证

    本篇文档学习,DG备库,实时应用如何判断,MR进程,及MRP应用归档,三种情况的查询及验证 1.取消MRP进程 备库查询进程状态select process,client_process,sequen ...

  4. Foxmail软件添加QQ邮箱报错

    #报错现象: -ERR Please using authorized code to login. More information at http://servi 请使用授权代码登录.http:/ ...

  5. np.tile语法

    >>> v = np.array([1, 0, 1])>>> vv = np.tile(v,(4,1))>>> print vv[[1 0 1] ...

  6. 百练-16年9月推免-C题-图像旋转

    C:图像旋转 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 输入一个n行m列的黑白图像,将它顺时针旋转90度后输出. 输入 第一行包含两个整数n和m,表示图 ...

  7. 极大极小搜索思想+(α/β)减枝 【转自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】

    极大极小搜索,即minimax搜索算法,专门用来做博弈论的问题的暴力. 多被称为对抗搜索算法. 这个搜索算法的基本思想就是分两层,一层是先手,记为a,还有一层是后手,记为b. 这个搜索是认为这a与b的 ...

  8. Codeforces 520B:Two Buttons(思维,好题)

    题目链接:http://codeforces.com/problemset/problem/520/B 题意 给出两个数n和m,n每次只能进行乘2或者减1的操作,问n至少经过多少次变换后能变成m 思路 ...

  9. Python开发指南规范

    分号 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 行长度 每行不超过80个字符 例外: 长的导入模块语句 注释里的URL 不要使用反斜杠连接行. Python会将 圆括号, 中括号和花括号 ...

  10. IDLE的使用

    为什么要用IDE? 到现在为止,我们也是写过代码的人啦,但你有没有发现,每次写代码要新建文件.写完保存时还要选择存放地点,执行时还要切换到命令行调用python解释器,好麻烦呀,能否一气呵成,让我简单 ...