基于Puppeteer實現地圖打印輸出

一 Puppeteer簡介

Puppeteer.js是谷歌官方推出的一個nodejs庫,它提供了一組用來操縱Chrome的API(默認headless也就是無UI的chrome,也可以配置為有UI),有點類似于PhantomJS,但Puppeteer是Chrome官方團隊進行維護的,前景更好。使用Puppeteer,相當于同時具有Linux和Chrome的能力,應用場景會非常多。就爬蟲領域來說,遠比一般的爬蟲工具功能更豐富,性能分析、自動化測試也不在話下。官方列出的主要功能如下:

  • 利用網頁生成PDF、圖片
  • 爬取SPA應用,并生成預渲染內容(即“SSR” 服務端渲染)'
  • 可以從網站抓取內容
  • 自動化表單提交、UI測試、鍵盤輸入等
  • 幫你創建一個最新的自動化測試環境(chrome),可以直接在此運行測試用例
  • 捕獲站點的時間線,以便追蹤你的網站,幫助分析網站性能問題
    安裝如下很簡單:
npm install puppeteer

二 輸出地圖圖片

在工程項目中,常常有導出地圖圖片保存的需求,這種需求很多時候,直接在前端canvas渲染圖片導出即可,參考:OpenLayers3關于Map Export的Canvas跨域,但很多時候,Map的Layer來源很多,有公網第三方網站的,有工程自己服務器的,并不是每個地圖服務器都支持cors操作,canvas渲染常常無法使用,而使用服務端請求出圖也是一種可選方案。

測試以本地的一個web頁面為準:

測試頁面.png

廢話不多說,直接上代碼:

const puppeteer = require('puppeteer');
(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    
    //登錄地圖網頁
    await page.goto('http://localhost:63342/%E7%89%B9%E6%95%88demo/Gansu.html');
        
    //根據頁面上下文,獲取map div的寬高  
    let result = await page.evaluate((divid) => {
        let mapdiv=document.querySelector(`#${divid}`);
        let width= parseInt(mapdiv.offsetWidth);
        let height=parseInt(mapdiv.offsetHeight);
        return Promise.resolve([width,height]);
    }, 'map');
    console.log(result); 
    
    //等待1.2秒
    await sleep(1200);
    //print png
    await page.screenshot({
        path: 'clickbd.png',
        //fullPage與clip使用時互斥
        //fullPage: true,  //整頁輸出
        //只clip出map div的范圍輸出地圖
        clip:{
            x:0,
            y:0,
            width:result[0],
            height:result[1]
        }
    });
    browser.close();
})();


function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

以上代碼保存為工程中,起名叫print.js,然后執行:

node print.js

等待之后,輸出結果如下:

結果.png

本文只簡單介紹下Puppeteer,可以預見,將來會越來越火,畢竟是chrome官方維護的庫,比同類產品牌子更大。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,811評論 25 708
  • Swift版本點擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,508評論 7 249
  • 鑒于今天是萬圣節,所以先祝大家萬圣節快樂嘍!其實從邊疆省份來到北京的我,對萬圣節的了解也只限于那些美國電影:一排排...
    白灼時閱讀 140評論 0 0
  • 今天是韻律的紅天行者,今天在內在應該會有很多的提升,最近特別喜歡行天行者,昨天的星座上說我有行天行者的使命感,意識...
    youyous閱讀 547評論 0 0
  • 一夜之間,夏秋過渡。 現在的天空高而遠,藍的透徹。云被風梳理的柔順體貼。明明樹葉還是綠的茂盛,卻已經開始凋零。 這...
    strongheartcat閱讀 262評論 0 0