Puppeteer 是 Google Chrome 團隊官方的Chrome 自動化工具。它本身是基於Chrome Dev Protocol協議實現的,但它提供了更高層次API封裝,使用起來更加方便快捷。加上google這個大咖加官方的背景,更使得其地位更是提升了不少。
我之前在文章使用Chrome快速實現數據的抓取(五)—— puppeteer中簡單的介紹過一下它,之前准備寫一系列文章來詳細介紹下它的,但由於種種原因一直耽擱了,這篇文章其實在電腦里已經存了不少時間了,今天抽空整理了下,將其發表出來。
安裝NodeJS
Puppeteer是一個NodeJS的開發包,因此需要安裝Node環境的,它本身依賴的最低版本是Node v6.4。但由於里面的大量異步調用,因此最好使用支持async/await的 v7.6或更高版本。
關於NodeJS的安裝這里就不介紹了,我這里使用的是windows環境,基本上是一路next就好了。
安裝puppeteer
建立Node工程后,首先需要引入puppeteer包,使用npm命令即可:
npm install puppeteer
但這兒有一個需要注意的地方是,這個包會下載一個Chromium,由於網絡原因,這個過程是非常慢的,並且也會造成重復下載,每個工程都要下載一個,費時費力。
這個問題的解決方法是,安裝時添加--ignore-scripts命令跳過Chromium的下載,
npm install puppeteer --ignore-scripts
然后指定我們安裝的Chrome或Chromium啟動。具體方法后面再介紹
示例:
首先還是來一個簡單的示例。
const puppeteer = require('puppeteer');
async function run () {
const browser = await puppeteer.launch({
headless: false,
executablePath: "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"
});
const page = await browser.newPage();
await page.goto('https://tianfang.cnblogs.com');
await page.screenshot({ path: 'screen.png' });
await browser.close();
};
run();
代碼很簡單,運行后就會啟動一個chrome,然后訪問我的博客,並且截圖保存。
首先我們來看前面代碼的啟動參數:
const browser = await puppeteer.launch({
headless: false,
executablePath: "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"
});
這里我設置了兩個參數:
- 是否開啟界面: headless
如果把它設為true的話,則不顯示界面,理論上也有更好的性能。這里將其設置為false,主要是為了調試方便。
- Chrome路徑: executablePath
因為我安裝的時候跳過了Chromium的下載,因此這里顯式指定了chrome的路徑。
在日常使用中,往往還有些其它參數要設置的。
用戶數據路徑,這樣chrome可以使用你的一些設置和緩存
注意: 如果用戶數據路徑中包含中文,記得將js保存為utf8格式,以免不認識
- 其它參數: args
默認情況下,chrome是不加載擴展的,可以在args中啟用擴展
args: [
`--disable-extensions-except=${ext}`,
`--load-extension=${ext}`
]
設置瀏覽器大小:
默認瀏覽器大小是1024*768,可以通過page.setViewport設置其大小。
page.setViewport({ width: 1024, height: 768 });
有了上面基礎后,前面代碼就改為如下所示了:
const puppeteer = require('puppeteer');
const chrome_exe = String.raw`${process.env["ProgramFiles(x86)"]}\Google\Chrome\Application\chrome.exe`;
const user_data_path = String.raw`${process.env.LocalAppData}\Google\Chrome\User Data\Default`;
async function run() {
const browser = await puppeteer.launch({
headless: false,
userDataDir: user_data_path,
executablePath: chrome_exe
});
const page = await browser.newPage();
page.setViewport({ width: 1600, height: 800 });
await page.goto('https://tianfang.cnblogs.com');
await page.screenshot({ path: 'screen.png' });
await browser.close();
};
run();
小結:
由於篇幅所限,本文就簡單的介紹到這里。具體進一步使用方法待下一篇文章中繼續介紹。感興趣的朋友可以看看這兩篇文章。(實際是同一篇文章,中文的那個是譯文)
另外,雖然有Puppeteer珠玉在前,也還是有Chromeless這樣1w多start的受歡迎的第三方社區版本出現,感興趣的朋友可以了解一下。