亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

使用PhantomJS實現網頁截圖服務

2019-11-14 15:40:50
字體:
來源:轉載
供稿:網友

    這是上半年遇到的一個小需求,想實現網頁的抓取,并保存為圖片。研究了不少工具,效果都不理想,不是顯示太差了(Canvas、Html2Image、Cobra),就是性能不怎么樣(如SWT的Brower)。后發現無界面瀏覽器可以滿足這個條件,大致研究了一下PhantomJS與CutyCapt,兩者都是Webkit內核,其中PhantomJS使用上更方便一些,尤其在Windows平臺上,如果在linux下,從2.0版本后需要自己去機器上編譯了(大概要編譯3個小時,不得不說,g++就是個渣渣,同樣的項目,在vc下編譯快得,不談了,畢竟是免費開源的編譯器)。下面介紹PhantomJS結合java代碼實現的網頁截圖技術:

   

 一、環境準備

    1、PhantomJS腳本的目錄:D:/xxx/phantomjs-2.0.0-windows/bin/phantomjs

    2、截圖腳本:D:/xxx/phantomjs-2.0.0-windows/bin/rasterize.js

    截圖的腳本在官網上有提供,但是我這里需要說明一下它的高寬度設計原理:

page.viewportSize = { width: 600, height: 600 };

   這個是默認的高度,也就是600X600,我建議大家把height設置小一點,我這邊設置的是width:800,height:200。因為實際上,在不同時設置高度與亮度的情況下,如果真實的網頁的高度大于設置值時,圖片會自動擴充高寬度的,直到整個頁面顯示完(當你想截取小的圖片時,可能由于默認設置的太大,會使圖片有很大一塊空的)。如果同時設置了高寬度,下面的代碼會被執行,就會對網頁的部分進行截取了:

page.clipRect = { top: 0, left: 0, width: pageWidth, height: pageHeight };

    3、先用命令行測試一下:    

D:/xxx/phantomjs-2.0.0-windows/bin/phantomjs D:/xxx/phantomjs-2.0.0-windows/bin/rasterize.js http://www.QQ.com D:/test.png

    如果配置好了,應該可以看到生成的圖片了。當然還可以配置高寬度的參數,在上面的命令后加上:" 1000px"或" 1000px*400px",都是可以的。

 

二、服務器代碼

    作為一個網頁截圖服務,這部分代碼片段應當被布署在服務器上,當然不必全照搬啦,根據自己的需求來用就好了:

  1 package lekkoli.test;  2   3 import java.io.BufferedInputStream;  4 import java.io.BufferedReader;  5 import java.io.ByteArrayOutputStream;  6 import java.io.File;  7 import java.io.FileInputStream;  8 import java.io.IOException;  9 import org.apache.log4j.Logger;  10  11 /** 12  * 網頁轉圖片處理類,使用外部CMD 13  * @author lekkoli 14  */ 15 public class PhantomTools { 16  17     PRivate static final Logger _logger = Logger.getLogger(PhantomTools.class); 18  19     // private static final String _tempPath = "/data/temp/phantom_"; 20     // private static final String _shellCommand = "/usr/local/xxx/phantomjs /usr/local/xxx/rasterize.js ";  Linux下的命令 21     private static final String _tempPath = "D:/data/temp/phantom_"; 22     private static final String _shellCommand = "D:/xxx/phantomjs-2.0.0-windows/bin/phantomjs D:/xxx/phantomjs-2.0.0-windows/bin/rasterize.js ";     23  24     private String _file; 25     private String _size; 26  27     /** 28      * 構造截圖類 29      * @parm hash 用于臨時文件的目錄唯一化 30      */ 31     public PhantomTools(int hash) { 32         _file = _tempPath + hash + ".png"; 33     } 34  35     /** 36      * 構造截圖類 37      * @parm hash 用于臨時文件的目錄唯一化 38      * @param size 圖片的大小,如800px*600px(此時高度會裁切),或800px(此時 高度最少=寬度*9/16,高度不裁切) 39      */ 40     public PhantomTools(int hash, String size) { 41         this(hash); 42         if (size != null) 43             _size = " " + size; 44     } 45  46     /** 47      * 將目標網頁轉為圖片字節流 48      * @param url 目標網頁地址 49      * @return 字節流 50      */ 51     public byte[] getByteImg(String url) throws IOException { 52         BufferedInputStream in = null; 53         ByteArrayOutputStream out = null; 54         File file = null; 55         byte[] ret = null; 56         try { 57             if (exeCmd(_shellCommand + url + " " + _file + (_size != null ? _size : ""))) { 58                 file = new File(_file); 59                 if (file.exists()) { 60                     out = new ByteArrayOutputStream(); 61                     byte[] b = new byte[5120]; 62                     in = new BufferedInputStream(new FileInputStream(file)); 63                     int n; 64                     while ((n = in.read(b, 0, 5120)) != -1) { 65                         out.write(b, 0, n); 66                     } 67                     file.delete(); 68                     ret = out.toByteArray(); 69                 } 70             } else { 71                 ret = new byte[] {}; 72             } 73         } finally { 74             try { 75                 if (out != null) { 76                     out.close(); 77                 } 78             } catch (IOException e) { 79                 _logger.error(e); 80             } 81             try { 82                 if (in != null) { 83                     in.close(); 84                 } 85             } catch (IOException e) { 86                 _logger.error(e); 87             } 88             if (file != null && file.exists()) { 89                 file.delete(); 90             } 91         } 92         return ret; 93     } 94  95     /** 96      * 執行CMD命令 97      */ 98     private static boolean exeCmd(String commandStr) { 99         BufferedReader br = null;100         try {101             Process p = Runtime.getRuntime().exec(commandStr);102             if (p.waitFor() != 0 && p.exitValue() == 1) {103                 return false;104             }105         } catch (Exception e) {106             _logger.error(e);107         } finally {108             if (br != null) {109                 try {110                     br.close();111                 } catch (Exception e) {112                     _logger.error(e);113                 }114             }115         }116         return true;117     }118 }

    使用上面的PhantomTools類,可以很方便地調用getByteImg方法來生成并獲取圖片內容。  

     

    附上我的截圖配置腳本:rasterize.js,至于PhantomJS,大家就自行去官網下載吧。

    轉載請注明原址:http://www.49028c.com/lekko/p/4796062.html  


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品爱啪在线线免费观看| 亚洲第一精品久久忘忧草社区| 亚洲第一区第二区| 成人免费在线视频网站| 久久精品国产亚洲精品| 91精品久久久久久久久久入口| 国产精品视频精品视频| 精品国产乱码久久久久久虫虫漫画| 91精品久久久久久久久青青| 7m第一福利500精品视频| 久久久久久久999精品视频| 国产视频在线观看一区二区| 久久九九免费视频| 一区二区三区 在线观看视| 97国产suv精品一区二区62| 91精品国产高清久久久久久久久| 久久亚洲精品小早川怜子66| 欧美大成色www永久网站婷| 人人做人人澡人人爽欧美| 亚洲欧美激情另类校园| 国产亚洲精品激情久久| 亚洲大尺度美女在线| 欧美激情免费观看| 亚洲精品免费在线视频| 成人a在线观看| 青青草国产精品一区二区| 在线播放亚洲激情| 亚洲精品视频免费在线观看| 欧美精品在线视频观看| 亚洲人成电影网站色…| 久久免费在线观看| 色哟哟网站入口亚洲精品| 96pao国产成视频永久免费| 久久久影视精品| 欧美视频中文字幕在线| 色狠狠av一区二区三区香蕉蜜桃| 97国产suv精品一区二区62| www国产精品com| 91精品国产91久久久久久不卡| 狠狠做深爱婷婷久久综合一区| 国产精品中文在线| 国产精品羞羞答答| 免费不卡欧美自拍视频| 色视频www在线播放国产成人| 欧美极品xxxx| 麻豆国产va免费精品高清在线| 亚洲免费福利视频| 精品久久中文字幕| 国产91精品高潮白浆喷水| 97视频在线播放| 欧美另类99xxxxx| 国产精品自产拍在线观看中文| 国产日韩精品在线播放| 隔壁老王国产在线精品| 少妇高潮 亚洲精品| 欧美激情精品久久久久久蜜臀| 欧美一级电影久久| 欧美福利视频在线观看| 中文字幕久久久av一区| 欧美多人爱爱视频网站| 亚洲精品久久久一区二区三区| 欧美在线激情视频| 久久韩剧网电视剧| 国产精品网址在线| 成人网中文字幕| 国产成人在线视频| 中文字幕在线观看亚洲| 成人国产精品日本在线| 亚洲香蕉在线观看| 成人深夜直播免费观看| 欧美性猛交xxxx免费看漫画| 久热在线中文字幕色999舞| 久久精品成人欧美大片古装| 国产精品视频公开费视频| 国产精品久久9| 在线观看视频亚洲| 亚洲精品自拍视频| 国产不卡在线观看| 亚洲老头同性xxxxx| 亚洲男人天堂手机在线| 国产精品成人一区二区三区吃奶| 亚洲成人精品视频| 亚洲毛片一区二区| 久久91精品国产| 亚洲毛片在线观看| 国产福利精品av综合导导航| 91麻豆桃色免费看| 国产精品久久久久久中文字| 日韩精品极品视频| 亚洲第一福利网| 日本久久久a级免费| 久久精彩免费视频| 亚洲成年网站在线观看| 精品中文视频在线| 久久韩剧网电视剧| 中文字幕av一区二区三区谷原希美| 日韩福利视频在线观看| 97久久久免费福利网址| 国产精品一区二区久久久| 国产精品久久9| 久久成人一区二区| 国语自产精品视频在线看抢先版图片| 国产精品久久久久久五月尺| 久久99久久99精品免观看粉嫩| 欧日韩不卡在线视频| 91av视频在线| 免费91麻豆精品国产自产在线观看| 亚洲护士老师的毛茸茸最新章节| 国产精品一区电影| 亚洲国产日韩欧美在线动漫| 亚洲精品美女在线观看| 1769国内精品视频在线播放| 国产精品99一区| 理论片在线不卡免费观看| 97视频在线观看网址| 国产亚洲福利一区| 91免费的视频在线播放| 亚洲精品国偷自产在线99热| 中文字幕亚洲欧美在线| 成人免费淫片aa视频免费| 丰满岳妇乱一区二区三区| 亚洲精品mp4| 国产亚洲欧洲高清一区| 亚洲第一视频在线观看| 欧美特黄级在线| 亚洲国产精品久久久久秋霞蜜臀| 欧美电影院免费观看| 国产精品999999| 成人福利在线观看| 亚洲人午夜精品免费| 国内偷自视频区视频综合| 亚洲男女自偷自拍图片另类| 亚洲精品大尺度| 91免费国产网站| 九九视频直播综合网| 91精品成人久久| 国产精品观看在线亚洲人成网| 欧美肥臀大乳一区二区免费视频| 亚洲色图av在线| 国产69久久精品成人看| 日本精品中文字幕| 亚洲一区二区三| 国产日本欧美在线观看| 成人精品aaaa网站| 中文字幕一区二区三区电影| 国模私拍视频一区| 亚洲理论在线a中文字幕| 国产精品无av码在线观看| 91久久综合亚洲鲁鲁五月天| 日本免费一区二区三区视频观看| 国产精品亚洲第一区| 亚洲精品视频播放| 色婷婷**av毛片一区| 久久久女人电视剧免费播放下载| 亚洲欧美在线一区二区| 日本久久久久亚洲中字幕| 久久影院中文字幕| 欧美中文字幕精品| 欧美成人免费一级人片100| 亚洲成年人在线| 久久久久久久av| 国产成人亚洲综合| 色综合久久88| 国产噜噜噜噜噜久久久久久久久|