Puppeteer 爬蟲技術實踐
信息簡介
Puppeteer是Chrome開發團隊發布的一個通過Chrome DevTool Protocol來控制瀏覽器Chrome(下文若無顯式稱呼Chromium,瀏覽器都同指Chromium吧,至於Chrome、Chromium的區別大家自行搜索吧)的一組基於NodeJS的API包,即通過Puppeteer提供的方法可以達到控制Chrome的目的。
技術細節
- Puppeteer Github
- Chrome DevTool Protoco 地址
- Puppeteer API 英文 | 中文
- 當你遇到問題時先到這里看看Troubleshooting
為什么提到它Puppeteer
因為它提供的API能方便地控制瀏覽器,控制瀏覽器能干什么?最直接的就是UI自動化測試、實現爬蟲應用、網站截屏、生成網站PDF等。其實真正起到控制瀏覽器的是Chrome DevTool Protocol,而基於此也有很多其它語言實現的API包,大家可自行到github搜索查看。本人選擇Nodejs主要還是官方維護,方便同步升級不用擔心被遺忘(本人的糊口語言是C#,一個大部分被同行看不起和技術廠商遺忘SDK的語言🤣)。
使用簡介
Puppeteer 主要提供兩種方式:Headless 、FullHead,我自己簡單的理解為“無界面”和“有界面”,其實主要是二者在請求頭部和渲染方式上區別(比如被網站檢測到頭部信息、以及渲染環境)。為什么強調這兩種方式,因為這涉及到你的爬蟲被網站監測到能力,目前Headless很簡單就可以使用,但是FullHead模式就有難點,因為FullHead模式要打開瀏覽器界面,那么當你將爬蟲應用部署到Docker環境下時你就要模擬這個界面,這個就太難了,大概google了半天才找到使用xvfb模擬界面解決了。當你實現了FullHead模式那么你的爬蟲應用生存幾率就又大了1%。
快速使用
因為我使用的nodejs版本,故測試demo者請自行安裝Nodejs環境。
- 初始化
-
npm init
2.安裝Puppeteer
-
npm install puppeteer --save
安裝時因為GF的原因,會下載很緩慢,可以通過配置環境變量解決(下文也會告訴大家使用已經裝好的瀏覽器)
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD :配置為true跳過下載
PUPPETEER_EXECUTABLE_PATH: 瀏覽器執行文件路徑,切記是執行文件不同系統文件名皆不同
由於平常都在使用Docker,為了熟悉Linux命令所以我這里用的bash命令,windows下自己修改環境命令
圖中看到已經跳過安裝
下面寫一段屏幕截圖的腳本
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://www.cnblogs.com/'); await page.screenshot({path: 'cnblogs.png'}); await browser.close(); })();
上面的腳本意思是啟動一個HeadLess模式瀏覽器,然后打開博客園並進行截屏保存。
上圖已經看到博客園的截屏,但是貌似有點和我們平常看到的不太一樣,下一篇文章我將詳細介紹如何更精細的使用puppeteer控制瀏覽器而更像我們平常使用的瀏覽器瀏覽網站。