“?大數(shù)據(jù)時(shí)代臂拓,衍生出了許多跟數(shù)據(jù)相關(guān)的公司和行業(yè)厚脉。在這個(gè)數(shù)據(jù)為王的時(shí)代,每個(gè)人都必須掌握一手獲取數(shù)據(jù)的能力胶惰!”
01
—
什么是Puppeteer?
Puppeteer 是一個(gè) Node 庫傻工,它提供了一個(gè)高級(jí) API 來通過 DevTools 協(xié)議控制 Chromium 或 Chrome。我們來看看Puppeteer單詞原本的意思:
Puppete 的原意為木偶,即很多90后小時(shí)候聽的木偶奇遇記的故事里面講述的那個(gè)說謊后鼻子會(huì)變長(zhǎng)的“小孩”中捆。根據(jù)這個(gè)單詞的意思鸯匹,我們就很清楚的明白Puppeteer的執(zhí)行原理就是像操縱木偶的人一樣,通過各種方式(接口)進(jìn)行操縱瀏覽器幫你執(zhí)行各種操作的工具泄伪。
02
—
Puppeteer 能幫我們具體做什么臂容?
簡(jiǎn)單來說科雳,你能在瀏覽器里做的大部分事情,Puppeteer都可以做脓杉!像打開標(biāo)簽頁糟秘,打開百度,輸入搜索關(guān)鍵詞球散,點(diǎn)擊搜索尿赚,點(diǎn)擊下一頁....等等你的日常操作行為都能模擬,其它的你不常使用的楷哥也整理了一些:
生成頁面 PDF
抓取 SPA(單頁應(yīng)用)并生成預(yù)渲染內(nèi)容(即“SSR”(服務(wù)器端渲染))
自動(dòng)提交表單蕉堰,進(jìn)行 UI 測(cè)試凌净,鍵盤輸入等
創(chuàng)建一個(gè)實(shí)時(shí)更新的自動(dòng)化測(cè)試環(huán)境
使用最新的 JavaScript 和瀏覽器功能直接在最新版本的Chrome中執(zhí)行測(cè)試
捕獲網(wǎng)站的timeline trace,幫助你分析該網(wǎng)站的性能問題
測(cè)試瀏覽器的自動(dòng)化擴(kuò)展
03
—
Puppeteer 為什么可以做到控制瀏覽器屋讶?
Puppeteer之所以可以幫助我們做這么多冰寻,首先我們需要分析下Puppeteer的整體架構(gòu):
我們可以從圖中看到Puppeteer將瀏覽器分為了幾個(gè)部分:Browser(瀏覽器),Context(上下文),Page(頁面或標(biāo)簽)皿渗,Workers(工人)等部分斩芭,他們之間的關(guān)系是:
Puppeteer 使用 DevTools 協(xié)議 與瀏覽器進(jìn)行通信。
Browser 實(shí)例可以擁有瀏覽器上下文乐疆。
BrowserContext 實(shí)例定義了一個(gè)瀏覽會(huì)話并可擁有多個(gè)頁面划乖。
Page 至少有一個(gè)框架:主框架〖吠粒可能還有其他框架由 iframe 或 框架標(biāo)簽 創(chuàng)建琴庵。
frame 至少有一個(gè)執(zhí)行上下文 - 默認(rèn)的執(zhí)行上下文 - 框架的 JavaScript 被執(zhí)行。一個(gè)框架可能有額外的與 擴(kuò)展 關(guān)聯(lián)的執(zhí)行上下文仰美。
Worker 具有單一執(zhí)行上下文迷殿,并且便于與 WebWorkers 進(jìn)行交互。
04
—
Puppeteer VS Puppeteer-core咖杂?
Puppeteer從v1.7.0開始庆寺,每個(gè)版本都會(huì)發(fā)布兩個(gè)包:
Puppeteer
Puppeteer-core
Puppeteer是瀏覽器自動(dòng)化的產(chǎn)品。安裝后翰苫,它會(huì)下載一個(gè)版本的 Chromium,然后使用Puppeteer-core 驅(qū)動(dòng)工作。作為最終用戶產(chǎn)品奏窑,Puppeteer支持一堆方便的 PUPPETEER* env 變量來調(diào)整行為导披。Puppeteer-core 是一個(gè)核心庫來幫助驅(qū)動(dòng)任何支持 DevTools 協(xié)議的東西。Puppeteer-core 在安裝時(shí)不會(huì)下載 Chromium埃唯。作為一個(gè)庫撩匕,Puppeteer-core 是完全是通過其編程接口驅(qū)動(dòng)的并忽略所有PUPPETEER* env 變量。
總結(jié)一下墨叛,Puppeteer-core 與Puppeteer不同的地方:
Puppeteer-core 在安裝時(shí)不會(huì)自動(dòng)下載 Chromium
Puppeteer-core忽略所有的 PUPPETEER_* env 變量
大多數(shù)情況下止毕,你可以使用Puppeteer來進(jìn)行實(shí)際的應(yīng)用開發(fā),而如果是考慮下載及打包速度問題或者正在構(gòu)建一個(gè)DevTools協(xié)議頂部的產(chǎn)品庫漠趁,這時(shí)你可以選擇使用Puppeteer-core來進(jìn)行開發(fā)扁凛。
05
—
爬蟲掃地僧?為什么闯传?
了解了Puppeteer的背景及功能谨朝,很多朋友都會(huì)猜到為什么Puppeteer被稱之為爬蟲界的掃地僧了吧?因?yàn)槠淠M的是真實(shí)用戶的操作甥绿,從打開標(biāo)簽頁字币,到輸入關(guān)鍵詞,甚至在輸入過程中模擬用戶打字速度的這種精細(xì)操作都會(huì)嚴(yán)重混淆服務(wù)端風(fēng)控服務(wù)的判斷共缕,那一般的風(fēng)控系統(tǒng)會(huì)從幾個(gè)方面進(jìn)行反爬蟲洗出?
接口調(diào)用頻次限制
同IP的訪問頻次
驗(yàn)證碼
登錄token驗(yàn)證
鏈接隨機(jī)化
Request請(qǐng)求頭驗(yàn)證
......
但這些驗(yàn)證對(duì)Puppeteer來說,基本無效图谷。因?yàn)閷?duì)于整個(gè)請(qǐng)求方式和行為判斷上講翩活,用戶的真實(shí)場(chǎng)景模擬會(huì)直接宣布以上攔截方案的死刑。
本文簡(jiǎn)單了解了Puppeteer的背景及整體架構(gòu)蜓萄,那肯定會(huì)有朋友問具體怎么使用呢隅茎?關(guān)注楷哥,我們繼續(xù)交流探討嫉沽。