“?大數據時代,衍生出了許多跟數據相關的公司和行業。在這個數據為王的時代,每個人都必須掌握一手獲取數據的能力!”
01
—
什么是Puppeteer?
Puppeteer 是一個 Node 庫,它提供了一個高級 API 來通過 DevTools 協議控制 Chromium 或 Chrome。我們來看看Puppeteer單詞原本的意思:
Puppete 的原意為木偶,即很多90后小時候聽的木偶奇遇記的故事里面講述的那個說謊后鼻子會變長的“小孩”。根據這個單詞的意思,我們就很清楚的明白Puppeteer的執行原理就是像操縱木偶的人一樣,通過各種方式(接口)進行操縱瀏覽器幫你執行各種操作的工具。
02
—
Puppeteer 能幫我們具體做什么?
簡單來說,你能在瀏覽器里做的大部分事情,Puppeteer都可以做!像打開標簽頁,打開百度,輸入搜索關鍵詞,點擊搜索,點擊下一頁....等等你的日常操作行為都能模擬,其它的你不常使用的楷哥也整理了一些:
生成頁面 PDF
抓取 SPA(單頁應用)并生成預渲染內容(即“SSR”(服務器端渲染))
自動提交表單,進行 UI 測試,鍵盤輸入等
創建一個實時更新的自動化測試環境
使用最新的 JavaScript 和瀏覽器功能直接在最新版本的Chrome中執行測試
捕獲網站的timeline trace,幫助你分析該網站的性能問題
測試瀏覽器的自動化擴展
03
—
Puppeteer 為什么可以做到控制瀏覽器?
Puppeteer之所以可以幫助我們做這么多,首先我們需要分析下Puppeteer的整體架構:
我們可以從圖中看到Puppeteer將瀏覽器分為了幾個部分:Browser(瀏覽器),Context(上下文),Page(頁面或標簽),Workers(工人)等部分,他們之間的關系是:
Puppeteer 使用 DevTools 協議 與瀏覽器進行通信。
Browser 實例可以擁有瀏覽器上下文。
BrowserContext 實例定義了一個瀏覽會話并可擁有多個頁面。
Page 至少有一個框架:主框架。可能還有其他框架由 iframe 或 框架標簽 創建。
frame 至少有一個執行上下文 - 默認的執行上下文 - 框架的 JavaScript 被執行。一個框架可能有額外的與 擴展 關聯的執行上下文。
Worker 具有單一執行上下文,并且便于與 WebWorkers 進行交互。
04
—
Puppeteer VS Puppeteer-core?
Puppeteer從v1.7.0開始,每個版本都會發布兩個包:
Puppeteer
Puppeteer-core
Puppeteer是瀏覽器自動化的產品。安裝后,它會下載一個版本的 Chromium,然后使用Puppeteer-core 驅動工作。作為最終用戶產品,Puppeteer支持一堆方便的 PUPPETEER* env 變量來調整行為。Puppeteer-core 是一個核心庫來幫助驅動任何支持 DevTools 協議的東西。Puppeteer-core 在安裝時不會下載 Chromium。作為一個庫,Puppeteer-core 是完全是通過其編程接口驅動的并忽略所有PUPPETEER* env 變量。
總結一下,Puppeteer-core 與Puppeteer不同的地方:
Puppeteer-core 在安裝時不會自動下載 Chromium
Puppeteer-core忽略所有的 PUPPETEER_* env 變量
大多數情況下,你可以使用Puppeteer來進行實際的應用開發,而如果是考慮下載及打包速度問題或者正在構建一個DevTools協議頂部的產品庫,這時你可以選擇使用Puppeteer-core來進行開發。
05
—
爬蟲掃地僧?為什么?
了解了Puppeteer的背景及功能,很多朋友都會猜到為什么Puppeteer被稱之為爬蟲界的掃地僧了吧?因為其模擬的是真實用戶的操作,從打開標簽頁,到輸入關鍵詞,甚至在輸入過程中模擬用戶打字速度的這種精細操作都會嚴重混淆服務端風控服務的判斷,那一般的風控系統會從幾個方面進行反爬蟲?
接口調用頻次限制
同IP的訪問頻次
驗證碼
登錄token驗證
鏈接隨機化
Request請求頭驗證
......
但這些驗證對Puppeteer來說,基本無效。因為對于整個請求方式和行為判斷上講,用戶的真實場景模擬會直接宣布以上攔截方案的死刑。
本文簡單了解了Puppeteer的背景及整體架構,那肯定會有朋友問具體怎么使用呢?關注楷哥,我們繼續交流探討。