puppetter安裝就踩坑-解決篇

圓兒圈圈發表於2018-09-13

PUPPETEER概述

Puppeteer 是一個 Node 庫,它提供了一個高階 API 來通過 DevTools 協議控制 Chromium 或 Chrome。

Puppeteer 是 Google Chrome 團隊官方的無介面(Headless)Chrome 工具。正因為這個官方宣告,許多業內自動化測試庫都已經停止維護,包括 PhantomJS。Selenium IDE for Firefox 專案也因為缺乏維護者而終止。

puppetter可以生成頁面的截圖和PDF,抓取SSR,抓取網站內容,模擬登陸等。puppetter可以做這麼多少玩的事情,我開始躍躍試試,重新寫一套爬蟲。開始行動!

安裝

Puppeteer 要求使用 Node v6.4.0,但因為文中大量使用 async/await,需要 Node v7.6.0 或以上。

初始化專案

  1. 新建目錄
$ mkdir puppeteer-demo
$ cd puppeteer-demo
複製程式碼
  1. 初始化專案
$ npm init
複製程式碼
  1. 安裝 Puppeteer。

由於 Puppeteer並不是穩定的版本而且每天都在更新,所以如果你想要最新的功能可以直接通過 GitHub 的倉庫安裝。

$ npm i --save puppeteer
複製程式碼

安裝時可能會出現以下報錯:

ERROR: Failed to download Chromium r588429! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" env variable to skip download.
複製程式碼

Chromium瀏覽器有58M左右,可能會出現安裝失敗的情況。

解決方法一:

vi .npmrc

type puppeteer_download_host = https://npm.taobao.org/mirrors

yarn add puppeteer -D
複製程式碼

代理puppeteer下載地址

解決方法二:官方建議設定環境變數 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD 忽略瀏覽器的下載

env PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true npm i puppeteer -D
複製程式碼

引申一下~

環境變數

Puppeteer 尋找某些環境變數來幫助其操作。 如果 puppeteer 在環境中沒有找到它們,這些變數的小寫變體將從 npm 配置 中使用。

  • HTTP_PROXY, HTTPS_PROXY, NO_PROXY - 定義用於下載和執行 Chromium 的 HTTP 代理設定。
  • PUPPETEER_SKIP_CHROMIUM_DOWNLOAD - 請勿在安裝步驟中下載繫結的 Chromium。 PUPPETEER_DOWNLOAD_HOST - 覆蓋用於下載 Chromium 的 URL 的主機部分。
  • PUPPETEER_CHROMIUM_REVISION - 在安裝步驟中指定一個你喜歡 puppeteer 使用的特定版本的 Chromium。

引申結束~

忽略了Chromium瀏覽器下載後,我們成功下載好了puppeteer。然後去找puppeteer安裝包package.json中對應的chrome版本。(puppeteer/package.json->puppeteer.chromium_revision,具體見lib/Downloader.js)

puppetter安裝就踩坑-解決篇

這裡的依賴chromium版本是588429,

接著去官網手動下載Chromium檔案,下載地址:npm.taobao.org/mirrors/chr… 解壓後放在本地

在專案中引入Chromium檔案

一、直接放在puppeteer預設讀取目錄下

例如:node_modules\puppeteer.local-chromium\win64-526987(系統型別-版本號)\chrome-win32(下載的檔名)\

二、放在其他目錄

我將Chromium檔案直接放在專案目錄puppeteer-demo下,執行時需要使用puppeteer.executablePath()設定路徑引數

const pathToExtension = require('path').join(__dirname, 'chrome-mac/Chromium.app/Contents/MacOS/Chromium');

puppeteer.launch({executablePath: pathToExtension});
複製程式碼

puppeteer.executablePath()

returns: A path where Puppeteer expects to find bundled Chromium. Chromium might not exist there if the download was skipped with PUPPETEER_SKIP_CHROMIUM_DOWNLOAD.


  1. 執行Puppeteer

新建screenShot.js,引入puppeteer包然後配置Chromium啟動路徑。 呼叫puppeteer.launch方法啟動Chromium。

這裡需要提醒注意申明的函式是一個async函式,使用了ES 2017 async/await特性。該函式是一個非同步函式,會返回一個Promise。如果async最終順利返回值,Promise則可以順利reslove,得到結果;否則將會reject一個錯誤。

因為我們使用了async函式,我們使用await來暫停函式的執行,直到Promise返回一個browser物件。

const puppeteer = require('puppeteer');

(async () => {
    const pathToExtension = require('path').join(__dirname, 'chrome-mac/Chromium.app/Contents/MacOS/Chromium');
    const browser = await puppeteer.launch({
        headless: false,
        executablePath: pathToExtension
    });
    const page = await browser.newPage();
    await page.goto('https://www.baidu.com');
    await page.setViewport({width: 1000, height: 500});
    await page.screenshot({path: 'example.png'});
    await browser.close();
})();
複製程式碼

相關文章