中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java利用phantomjs進行截圖實例教程

發布時間:2020-09-04 20:46:33 來源:腳本之家 閱讀:276 作者:這個名字有點特別 欄目:編程語言

前言

最近工作中遇到一個需求,需要實現截圖功能,斷斷續續查找資料、驗證不同的實現方法終于算基本搞定了頁面截圖,因為中間過程曲折花費較多時間,分享出來幫助大家快速實現截圖

為什么選用phantomjs進行截圖

截圖可以實現的方式有很多,比如:

  • selenium
  • HtmlUnit
  • Html2Image、、、and so on但是這些實現的截圖效果都不好。selenium只能實現截屏,不能截取整個頁面,而HtmlUnit、Html2Image對js的支持效果并不好,截下來的圖會有很多空白。phantomjs就是萬精油了,既能截取整個頁面,對js支持的效果又好

PlantomJs提供了如 CSS 選擇器、DOM操作、JSON、HTML5、Canvas、SVG 等。PhantomJS 的用處很廣泛,如網絡監控、網頁截屏、頁面訪問自動化、無需瀏覽器的 Web 測試等,這里只用到網頁截屏。

前期準備

安裝phantomjs。mac os

brew install phantomjs

命令行的方式進行截圖

安裝以后我們就可以小試牛刀了

打開終端,輸入以下命令:

/Users/hetiantian/SoftWares/phantomjs/bin/phantomjs
/Users/hetiantian/SoftWares/phantomjs/examples/rasterize.js
https://juejin.im/post/5bb24bafe51d450e4437fd96
/Users/hetiantian/Desktop/juejin-command.png

查看效果

java利用phantomjs進行截圖實例教程

發現圖片沒有加載好

來看以下剛剛的命令行:

/Users/hetiantian/SoftWares/phantomjs/bin/phantomjs:phantomjs可執行文件保存地址
/Users/hetiantian/SoftWares/phantomjs/examples/rasterize.js:rasterize.js文件地址

這段命令可以理解為用phantomjs去運行rasterize.js文件,所以要想解決圖片空白的問題我們需要去看一下rasterize.js文件。

"use strict";
var page = require('webpage').create(),
 system = require('system'),
 address, output, size, pageWidth, pageHeight;

if (system.args.length < 3 || system.args.length > 5) {
 console.log('Usage: rasterize.js URL filename [paperwidth*paperheight|paperformat] [zoom]');
 console.log(' paper (pdf output) examples: "5in*7.5in", "10cm*20cm", "A4", "Letter"');
 console.log(' image (png/jpg output) examples: "1920px" entire page, window width 1920px');
 console.log('         "800px*600px" window, clipped to 800x600');
 phantom.exit(1);
} else {
 address = system.args[1];
 output = system.args[2];
 page.viewportSize = { width: 600, height: 600 };
 if (system.args.length > 3 && system.args[2].substr(-4) === ".pdf") {
  size = system.args[3].split('*');
  page.paperSize = size.length === 2 ? { width: size[0], height: size[1], margin: '0px' }
           : { format: system.args[3], orientation: 'portrait', margin: '1cm' };
 } else if (system.args.length > 3 && system.args[3].substr(-2) === "px") {
  size = system.args[3].split('*');
  if (size.length === 2) {
   pageWidth = parseInt(size[0], 10);
   pageHeight = parseInt(size[1], 10);
   page.viewportSize = { width: pageWidth, height: pageHeight };
   page.clipRect = { top: 0, left: 0, width: pageWidth, height: pageHeight };
  } else {
   console.log("size:", system.args[3]);
   pageWidth = parseInt(system.args[3], 10);
   pageHeight = parseInt(pageWidth * 3/4, 10); // it's as good an assumption as any
   console.log ("pageHeight:",pageHeight);
   page.viewportSize = { width: pageWidth, height: pageHeight };
  }
 }
 if (system.args.length > 4) {
  page.zoomFactor = system.args[4];
 }
 page.open(address, function (status) {
  if (status !== 'success') {
   console.log('Unable to load the address!');
   phantom.exit(1);
  } else {
   window.setTimeout(function () {
    page.render(output);
    phantom.exit();
   }, 200);
  }
 });
}

嘗試一:

對page.viewportSize = { width: 600, height: 600 };產生了疑問🤔️

把height調大十倍,發現基本是完美截圖了,但是如果頁面的篇幅特別短,會發現有瑕疵,下面留有一大片空白。原因:page.viewportSize = { width: 600, height: 600 };設置的是初始打開瀏覽器的大小,通過增大這個值可以加載js。如果我們能拿到實際頁面的大小在設置height大小,但是不,我不能。

并且不能接受預先設定一個很大的height值,比如30000,因為不能接受底下留白的效果

嘗試二:

在window.setTimeout方法之前加入以下代碼

 page.evaluate(function(){
  scrollBy(0, 18000); 
});

無奈evaluate里不能在用for循環了,前端渣渣真的不知道如何改,遂放棄

java代碼方式進行截圖

需要的依賴

  <dependency>
   <groupId>org.seleniumhq.selenium</groupId>
   <artifactId>selenium-java</artifactId>
   <version>2.45.0</version>
  </dependency>

  <dependency>
   <groupId>com.codeborne</groupId>
   <artifactId>phantomjsdriver</artifactId>
   <version>1.2.1</version>
   <!-- this will _always_ be behind -->
   <exclusions>
    <exclusion>
     <groupId>org.seleniumhq.selenium</groupId>
     <artifactId>selenium-java</artifactId>
    </exclusion>
    <exclusion>
     <groupId>org.seleniumhq.selenium</groupId>
     <artifactId>selenium-remote-driver</artifactId>
    </exclusion>
   </exclusions>
  </dependency>

代碼實現

public class PhantomjsTest2 {
 public static void main(String[] args) throws InterruptedException, IOException {
  //設置必要參數
  DesiredCapabilities dcaps = new DesiredCapabilities();
  //ssl證書支持
  dcaps.setCapability("acceptSslCerts", true);
  //截屏支持
  dcaps.setCapability("takesScreenshot", true);
  //css搜索支持
  dcaps.setCapability("cssSelectorsEnabled", true);
  //js支持
  dcaps.setJavascriptEnabled(true);
  //驅動支持(第二參數表明的是你的phantomjs引擎所在的路徑)
  dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,
    "/Users/hetiantian/SoftWares/phantomjs/bin/phantomjs");
  //創建無界面瀏覽器對象
  PhantomJSDriver driver = new PhantomJSDriver(dcaps);

  //設置隱性等待(作用于全局)
  driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
  long start = System.currentTimeMillis();
  //打開頁面
  driver.get("https://juejin.im/post/5bb24bafe51d450e4437fd96");
  Thread.sleep(30 * 1000);
  JavascriptExecutor js = driver;
  for (int i = 0; i < 33; i++) {
   js.executeScript("window.scrollBy(0,1000)");
   //睡眠10s等js加載完成
   Thread.sleep(5 * 1000);
  }
  //指定了OutputType.FILE做為參數傳遞給getScreenshotAs()方法,其含義是將截取的屏幕以文件形式返回。
  File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
  Thread.sleep(3000);
  //利用FileUtils工具類的copyFile()方法保存getScreenshotAs()返回的文件對象
  FileUtils.copyFile(srcFile, new File("/Users/hetiantian/Desktop/juejin-01.png"));
  System.out.println("耗時:" + (System.currentTimeMillis() - start) + " 毫秒");
 }
}

注釋已經夠詳細了不多說了。唯一說一點:通過去執行js代碼實現頁面滑動,并且每次滑動都會通過睡眠保證有時間可以將 js加載進來。會調用33次滑動,因為phantomjs截取最大的高度為32767px(int  32位的最大整數),所以滑動33次可以保證能夠截取到的最大頁面部分其js已經是加載完成了的

附:window.scrollBy(0,1000)、window.scrollTo(0,1000)的區別

window.scrollBy(0,1000)
window.scrollBy(0,1000)
執行到這里頁面滑動1000+1000px
window.scrollTo(0,1000)
window.scrollTo(0,1000)
執行到這里頁面滑動到1000px處

window.scrollTo(0, document.body.scrollHeight可以滑動到頁面底部,不選擇有兩個原因:

1)一下子滑動到底部js會來不及被加載

2)有些頁面沒有底部,可以一直滑動加載

注:這里所說的js來不及加載指的是:想要截取頁面的js來不及加載

該方式的缺點:比較費時間。果然熊和魚掌不可兼得也,統計了一下截取一張圖片大概需要四分多鐘

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

文成县| 望江县| 三原县| 文化| 广河县| 洛宁县| 侯马市| 邹平县| 安阳市| 崇阳县| 渝北区| 玉环县| 寻乌县| 阿荣旗| 滦南县| 射阳县| 康平县| 宜城市| 东乌珠穆沁旗| 林口县| 育儿| 嘉鱼县| 锡林郭勒盟| 玛纳斯县| 承德县| 开平市| 公安县| 永仁县| 朔州市| 洪泽县| 唐河县| 东安县| 长阳| 宣汉县| 临西县| 平山县| 株洲市| 海伦市| 鸡泽县| 梁平县| 北宁市|