Puppeteer 是一個 Node 庫,它提供了一個高級 API 來經過 DevTools 協議控制 Chromium 或 Chrome。node
Puppeteer 是 Google Chrome 團隊官方的無界面(Headless)Chrome 工具。正由於這個官方聲明,許多業內自動化測試庫都已經中止維護,包括 PhantomJS。Selenium IDE for Firefox 項目也由於缺少維護者而終止。chrome
puppetter能夠生成頁面的截圖和PDF,抓取SSR,抓取網站內容,模擬登錄等。puppetter能夠作這麼多少玩的事情,我開始躍躍試試,從新寫一套爬蟲。開始行動!npm
Puppeteer 要求使用 Node v6.4.0,但由於文中大量使用 async/await,須要 Node v7.6.0 或以上。json
$ mkdir puppeteer-demo
$ cd puppeteer-demo
複製代碼
$ npm init
複製代碼
因爲 Puppeteer並非穩定的版本並且天天都在更新,因此若是你想要最新的功能能夠直接經過 GitHub 的倉庫安裝。瀏覽器
$ npm i --save puppeteer
複製代碼
安裝時可能會出現如下報錯:bash
ERROR: Failed to download Chromium r588429! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" env variable to skip download.
複製代碼
Chromium瀏覽器有58M左右,可能會出現安裝失敗的狀況。app
解決方法一:less
vi .npmrc
type puppeteer_download_host = https://npm.taobao.org/mirrors
yarn add puppeteer -D
複製代碼
代理puppeteer下載地址異步
解決方法二:官方建議設置環境變量 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD
忽略瀏覽器的下載async
env PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true npm i puppeteer -D
複製代碼
引伸一下~
Puppeteer 尋找某些環境變量來幫助其操做。 若是 puppeteer 在環境中沒有找到它們,這些變量的小寫變體將從 npm 配置 中使用。
引伸結束~
忽略了Chromium瀏覽器下載後,咱們成功下載好了puppeteer。而後去找puppeteer安裝包package.json中對應的chrome版本。(puppeteer/package.json->puppeteer.chromium_revision,具體見lib/Downloader.js
)
這裏的依賴chromium版本是588429,
接着去官網手動下載Chromium文件,下載地址:npm.taobao.org/mirrors/chr… 解壓後放在本地
1、直接放在puppeteer默認讀取目錄下
例如:node_modules\puppeteer.local-chromium\win64-526987(系統類型-版本號)\chrome-win32(下載的文件名)\
2、放在其餘目錄
我將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.
新建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();
})();
複製代碼