hacker_Lees的博客通过本文主要向大家介绍了phantomjs等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
1、 在使用phantomjs的时候需要下载phantomjs,网上有window版本和Linux版本。将phantomjs放在linux上的指定位置之后(如下面的/home/tpl/phantomjs-1.9.7-linux-x86_64/处),
2、 按照类似如下命令进行测试,是否可以生成图片(执行前检查phantomjs的权限,要有执行权限):
/home/tpl/phantomjs-1.9.7-linux-x86_64/bin/phantomjs
/home/tpl/phantomjs-1.9.7-linux-x86_64/examples/test.js
http://www.baidu.com
/home/test/index.png
注意上面的命令,每个之间用空格隔开,其中:
/home/tpl/phantomjs-1.9.7-linux-x86_64/bin/phantomjs表示的是phantomjs所在的位置
/home/tpl/phantomjs-1.9.7-linux-x86_64/examples/test.js表示使用快照的时候需要的一个js
http://www.baidu.com 要生成快照的页面
/home/test/index.png 表示要将截的图放在的位置
3、要使用程序生成快照,需要执行shell命令或者cmd命令
能够兼容Java和windows的一段java代码如下:
package xxxxx.webservice.snapshot;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.NET.URL;
import com.ucap.utils.OsUtils;
/**
* SnapshotServiceImpl.java 用于生成快照的服务类
*
* @attention 使用注意事项
* @author
* @date
* @note 判断在Linux上的情况
*/
public class SnapshotServiceImpl implements SnapshotService {
/**
* phantomjsPath :phantomjs
* /home/tpl/phantomjs-1.9.7-linux-x86_64/bin/phantomjs
* /home/tpl/phantomjs-1.9.7-linux-x86_64/examples/test.js
* http://xxxxx:5555/tpl/special/2016/5/19/2d0cd5d12a974e438a2f4a13300f60d2/index.html
*
* exportPath :导出路径,这是一个绝对路径
*
* 关于phantomjs的执行命令如:
* /home/tpl/phantomjs-1.9.7-linux-x86_64/bin/phantomjs
* /home/tpl/phantomjs-1.9.7-linux-x86_64/examples/test.js
* http://xxxx:5555/tpl/special/2016/5/19/2d0cd5d12a974e438a2f4a13300f60d2/index.html
* /home/test/index.png
*/
public String createSnapshot(String phantomjsPath, String exportPath) {
URL path = this.getClass().getClassLoader().getResource("/");
String str = path.getPath();
File file = new File(str);
str = file.getParentFile().getParentFile().getParentFile()
.getAbsolutePath()
+ "/temp" + exportPath;
String[] strArray = null;
// 判断linux的执行情况
if (OsUtils.IS_LINUX) {
strArray = new String[3];
strArray[0] = "/bin/sh";
strArray[1] = "-c";
strArray[2] = phantomjsPath + " " + str;
} else if (OsUtils.IS_WINDOWS) {
strArray = new String[4];
strArray[0] = "cmd.exe";
strArray[1] = "/C";
strArray[2] = phantomjsPath;
strArray[3] = str;
}
File fileInfo = new File(str);
File fi = new File(fileInfo.getParentFile().getAbsolutePath());
if (!fi.exists()) {
fi.mkdirs();
}
// windows下phantomjs位置
Runtime rt = Runtime.getRuntime();
Process process = null;
try {
process = rt.exec(strArray);
} catch (IOException e) {
e.printStackTrace();
}
StringBuffer sbf = null;
InputStream is = null;
try {
is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
sbf = new StringBuffer();
String tmp = "";
while ((tmp = br.readLine()) != null) {
sbf.append(tmp);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
is = null;
}
}
return sbf.toString();
}
}
其中一个依赖的test.js如下:
var page = require('webpage').create();
//-----------------------------获取窗口的宽高信息,并设置,write by 涂作权 start------------------------------------
var winWidth = null;
var winHeight = null;
// 获取窗口宽度
if (window.innerWidth) {
winWidth = window.innerWidth;
} else if ((document.body) && (document.body.clientWidth)) {
winWidth = document.body.clientWidth;
}
// 获取窗口高度
if (window.innerHeight) {
winHeight = window.innerHeight;
} else if ((document.body) && (document.body.clientHeight)) {
winHeight = document.body.clientHeight;
}
// 通过深入 Document 内部对 body 进行检测,获取窗口大小
if (document.documentElement && document.documentElement.clientHeight && document.documentElement.clientWidth) {
winHeight = document.documentElement.clientHeight;
winWidth = document.documentElement.clientWidth;
}
page.viewportSize = {width:winWidth,height:winHeight};
page.clipRect = {top:0,left:0,width:winWidth,height:winHeight};
//-----------------------------获取窗口的宽高信息,并设置end--------------------------------------
//-----------------------------------------------------------------------------------------------
page.settings = {
javascriptEnabled:false,
loadImages:true,
userAgent:'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 (KHTML, like Gecko) PhantomJS/19.0'
};
//-----------------------------------------------------------------------------------------------
system = require('system');
//var url = 'http://yule.club.sohu.com/gifttrade/thread/2m2efbrpfui';
var address;
var loca;
if(system.args.length == 1){
phantom.exit();
}else{
adress = system.args[1];
loca = system.args[2];
page.open(adress, function (status){
if (status != "success"){
console.log('FAIL to load the address');
phantom.exit();
}
page.evaluate(function(){
//此函数在目标页面执行的,上下文环境非本phantomjs,所以不能用到这个js中其他变量
//window.scrollTo(0,10000);//滚动到底部
//滚动到自适应高度
//window.document.body.scrollTop = document.body.scrollHeight;
/* window.setTimeout(function(){
var plist = document.querySelectorAll("a");
var len = plist.length;
while(len)
{
len--;
var el = plist[len];
el.style.border = "1px solid red";
}
},5000);*/
});
window.setTimeout(function (){
//在本地生成截图
page.render(loca);
//console.log(loca);
phantom.exit();
}, 1000);
});
}