nodejs爬蟲puppeteer框架設(shè)計(jì)思想與應(yīng)用
先說明一下技術(shù)棧的應(yīng)用,使用typescript進(jìn)行編寫基于nodeJS環(huán)境的爬蟲,也就是說puppeteer建立在nodeJS中,而開發(fā)者進(jìn)行編寫typescript代碼,這樣比較優(yōu)美一點(diǎn)也有良好的封裝特性,然后typescript編譯為JavaScript運(yùn)行建立在node中的puppeteer框架。
下面來談一談puppeteer的處理邏輯和應(yīng)用思想,這是一個(gè)用戶操作為準(zhǔn)的框架,puppeteer干的事情就是模擬一個(gè)真實(shí)(虛假)的用戶去進(jìn)行瀏覽網(wǎng)頁(yè)。然后通過一個(gè)真實(shí)的瀏覽器在程序中去進(jìn)行控制dom文檔,包括獲取值參數(shù)等等后面再配合上mongoDB或者各種三方庫(kù)形成一套完整的模擬操作爬蟲系統(tǒng)。
其中puppeteer的設(shè)計(jì)思想是
Puppeteer 和Browser互動(dòng),browser代表瀏覽器,可以干瀏覽器可以干的所有事情,而Puppeteer
則是對(duì)瀏覽器進(jìn)行控制的系統(tǒng),讓我們可以對(duì)瀏覽器進(jìn)行控制,可能在實(shí)際應(yīng)用中不是特別重要,但是我后面遇到的bug就出在了Puppeteer當(dāng)中。
page則代表一個(gè)頁(yè)面,瀏覽器又可以創(chuàng)建一個(gè)頁(yè)面,page可以干網(wǎng)頁(yè)能夠做的任何事情。
如果對(duì)頁(yè)面進(jìn)行異步選擇器操作那么頁(yè)面則會(huì)返回一個(gè)異步ElementHandle,返回的這是一個(gè)dom的查詢提供了查詢信息,不過我們可以通常不使用這個(gè)方法。因?yàn)橛懈玫倪x擇那就是eval類函數(shù)返回dom信息,這樣更加切合網(wǎng)頁(yè)代碼流程操作。
這里也就是說page.$eval這個(gè)函數(shù),這里寫JavaScript代碼,直接返回我們需要的所有信息。
那什么時(shí)候用$查詢信息呢?
在瀏覽器代碼和我們自己的代碼高度重合難以分離的情況下使用,我們知道啊,JavaScript沒辦法被調(diào)試,所以程序在返回之前在瀏覽器中怎么運(yùn)行都是未知數(shù)。但是建議盡量不要把代碼都堆到eval中,雖然eval也可以傳我們創(chuàng)建的變量。
正確的做法是使用eval只進(jìn)行獲取dom值,返回dom值我們這邊我們進(jìn)行處理業(yè)務(wù)邏輯,否則代碼會(huì)變的難以維護(hù)。
查詢的是可以嵌套的,嵌套的查詢可能會(huì)返回JSHandle類型,這代表的是一個(gè)style屬性,可以對(duì)style屬性進(jìn)行操作。
這就是puppeteer大體的設(shè)計(jì)思想了,可以完全勝任爬蟲任務(wù)。
其中還有幾個(gè)類也一并介紹吧:
這個(gè)框架是一個(gè)非常模擬正常用戶操作的爬蟲框架,所以幾乎一半的api都是關(guān)于模擬操作的
Keyboard 關(guān)于鍵盤操作的類
Mouse 關(guān)于鼠標(biāo)操作的類
Frame 關(guān)于框架操作的類,這個(gè)可能你會(huì)不理解什么是框架,給一個(gè)提示<iframe>嵌入頁(yè)面,這是一個(gè)關(guān)于框架管理的類
request 這是一個(gè)page頁(yè)面中如果有網(wǎng)頁(yè)請(qǐng)求那么就可以被這個(gè)類捕獲到,然后我們就可以進(jìn)行業(yè)務(wù)邏輯。
target 一些基礎(chǔ)信息獲取