phantomjs的使用+Java程式碼+依賴js(相容Linux和windows版本)
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
/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 begin modify by 塗作權 2016-5-19 判斷在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); }); } |