Fork me on GitHub

php&phantomjs

引自用PhantomJS来给AJAX站点做SEO优化

主要目的是 SEO。前后端分离导致页面对 spider 不友好,判断是 spider 请求时,用 phantomjs 在服务端生成渲染好的静态页返回

安装 phantomjs

1
2
3
4
5
下载地址:[这里](http://phantomjs.org/download.html),根据服务器类型下载
文件目录:
root/phantomjs/bin/phantomjs
root/phantomjs/phantomjs.js
root 为项目根目录,确保 root/phantomjs/bin/phantomjs 有可执行权限

phantomjs.js 内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/*global phantom*/
"use strict";

// 单个资源等待时间,避免资源加载后还需要加载其他资源
var resourceWait = 500;
var resourceWaitTimer;

// 最大等待时间
var maxWait = 5000;
var maxWaitTimer;

// 资源计数
var resourceCount = 0;

// PhantomJS WebPage模块
var page = require('webpage').create();

// NodeJS 系统模块
var system = require('system');

// 从CLI中获取第二个参数为目标URL
var url = system.args[1];

// 设置PhantomJS视窗大小
page.viewportSize = {
width: 1280,
height: 1014
};
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36';

// 获取镜像
var capture = function(errCode) {

// 外部通过stdout获取页面内容
console.log(page.content);

// 清除计时器
clearTimeout(maxWaitTimer);

// 任务完成,正常退出
phantom.exit(errCode);

};

// 资源请求并计数
page.onResourceRequested = function(req) {
resourceCount++;
clearTimeout(resourceWaitTimer);
};

// 资源加载完毕
page.onResourceReceived = function(res) {

// chunk模式的HTTP回包,会多次触发resourceReceived事件,需要判断资源是否已经end
if (res.stage !== 'end') {
return;
}

resourceCount--;

if (resourceCount === 0) {

// 当页面中全部资源都加载完毕后,截取当前渲染出来的html
// 由于onResourceReceived在资源加载完毕就立即被调用了,我们需要给一些时间让JS跑解析任务
// 这里默认预留500毫秒
resourceWaitTimer = setTimeout(capture, resourceWait);

}
};

// 资源加载超时
page.onResourceTimeout = function(req) {
resouceCount--;
};

// 资源加载失败
page.onResourceError = function(err) {
resourceCount--;
};

// 打开页面
page.open(url, function(status) {

if (status !== 'success') {

phantom.exit(1);

} else {

// 当改页面的初始html返回成功后,开启定时器
// 当到达最大时间(默认5秒)的时候,截取那一时刻渲染出来的html
maxWaitTimer = setTimeout(function() {

capture(2);

}, maxWait);

}

});

php 执行 phantomjs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 使用 phantom 请求 js 渲染后的页面
* @param string $fetchURL
* @return string
*/
static public function phantom($fetchURL)
{
$phantomJS = ROOT_PATH . '/phantomjs/bin/phantomjs';
$spider = ROOT_PATH . '/phantomjs/phantom.js';
$return = [];
exec("$phantomJS $spider $fetchURL 2>/dev/null", $return);

return implode('', $return);
}
-------------感谢您的阅读 有问题请留言(或mailto:frostbelt@sina.cn)-------------