這篇主要來講下近期做的一個項目-客戶端爬取網(wǎng)頁數(shù)據(jù),用以向客戶個性化推薦產(chǎn)品。那么怎么在Android客戶端上將瀏覽的網(wǎng)頁爬取,提取有價值的數(shù)據(jù)呢?請耐心看下去.
一.爬取介紹
首先讓我們來了解下爬取這個東西。 一般來講對我們而言,需要抓取的是某個網(wǎng)站或者某個應(yīng)用的內(nèi)容,提取有用的價值,內(nèi)容一般分為兩部分,非結(jié)構(gòu)化的文本(e.g. HTML網(wǎng)頁),或結(jié)構(gòu)化的文本(e.g. JSON數(shù)據(jù))。
這邊要特殊介紹下HTML網(wǎng)頁。HTML基本上是傳統(tǒng)爬蟲過程中最常見的,也就是大多數(shù)時候會遇到的情況,例如抓取一個網(wǎng)頁,得到的是HTML,然后需要解析一些常見的元素,提取一些關(guān)鍵的信息。HTML其實理應(yīng)屬于結(jié)構(gòu)化的文本組織,但是又因為一般我們需要的關(guān)鍵信息并非直接可以得到,需要進行對HTML的解析查找,甚至一些字符串操作才能得到,所以還是歸類于非結(jié)構(gòu)化的數(shù)據(jù)處理中。
因為我這期項目做的就是跟HTML網(wǎng)頁相關(guān),所以我很關(guān)心網(wǎng)頁內(nèi)容的來源,以及對應(yīng)的解析爬取方式。
來源:
- 網(wǎng)頁包含內(nèi)容。一般來講基本上是靜態(tài)網(wǎng)頁已經(jīng)寫死的內(nèi)容,或者動態(tài)網(wǎng)頁,采用模板渲染,瀏覽器獲取到HTML的時候已經(jīng)是包含所有的關(guān)鍵信息,所以直接在網(wǎng)頁上看到的內(nèi)容都可以通過特定的HTML標簽得到
- JavaScript代碼加載內(nèi)容。這種情況是由于雖然網(wǎng)頁顯示時,內(nèi)容在HTML標簽里面,但是其實是由于執(zhí)行js代碼加到標簽里面的,所以這個時候內(nèi)容在js代碼里面的,而js的執(zhí)行是在瀏覽器端的操作,所以用程序去請求網(wǎng)頁地址的時候,得到的response是網(wǎng)頁代碼和js的代碼,所以自己在瀏覽器端能看到內(nèi)容。
- Ajax異步請求。這種情況是現(xiàn)在很常見的,尤其是在內(nèi)容以分頁形式顯示在網(wǎng)頁上,并且頁面無刷新,或者是對網(wǎng)頁進行某個交互操作后,得到內(nèi)容。
=========================
解析方式:
- CSS選擇器?,F(xiàn)在的網(wǎng)頁樣式比較多,所以一般的網(wǎng)頁都會有一些CSS的定位,例如class,id等,或者我們根據(jù)常見的節(jié)點路徑進行定位。e.g. #id .class
- XPATH。XPATH是一種頁面元素的路徑選擇方法,可以通過路徑表達式對XML文檔的節(jié)點進行定位。 比如—//*[@id=”finance”],意思是找尋所有節(jié)點符合id為finance的節(jié)點。
- 正則表達式。 用標準正則解析,一般會把HTML當做普通文本,用指定格式匹配當相關(guān)文本,適合小片段文本,或者某一串字符,或者HTML包含javascript的代碼,無法用CSS選擇器或者XPATH。
介紹完這些,看官們?nèi)绻€有些疑問,可以去網(wǎng)上去豐富一下以上提的點,接下來,看Android客戶端對爬取的實現(xiàn)
二.客戶端實現(xiàn)爬取
實現(xiàn)原理:在Android界面上,開啟一個webview,加載比如某郵箱或者某登錄網(wǎng)站的h5頁面,同時在 h5頁面加載完成后注入需要的腳本(可能多個,可依情況拼接注入),腳本會去監(jiān)聽用戶的登錄動作,從而拿到用戶session,去爬取用戶需要的數(shù)據(jù),再通過js調(diào)native函數(shù),展示給用戶!
這邊注入又分兩種方式:靜態(tài)與動態(tài)
- 靜態(tài):在onPageFinished()方法中,讀取需要注入腳本文件,字符串拼接后,使用webview.callJavascript(“javascript:”+jsStr,new ValueCallback())注入 **
- 動態(tài):在onPageFinished()中,使用webview.loadUrl(“javascript:”+jsUrl);該方式可能會導(dǎo)致三星,魅族手機 libc奔潰,我偶爾會遇到!
由于腳本內(nèi)容涉及公司開發(fā)機密,目前不公開,大概實現(xiàn)思想:就是根據(jù)你所爬取的網(wǎng)頁,根據(jù)其特性,再符合你的需求,通過CSS選擇器,以及Ajax請求,去模擬操作,得到數(shù)據(jù)并提取。因為我腳本是通過javascript寫的,通過jquery庫去模擬URL請求,得到data, 這時候的data就是平時看到網(wǎng)頁內(nèi)容的源代碼,依據(jù)上面提到的三種解析方式,基本都可以實現(xiàn)。
三.腳本更新
因為HTML網(wǎng)頁是來自各個公司,不受自己控制,如果其版本改動,我們所寫的腳本不符合改動后的網(wǎng)頁爬取,這時候怎么辦呢?沒關(guān)系,我們在客戶端注入腳本時,對我們的腳本做線上版本的更新,保證腳本在后續(xù)操作上的可行性!下面是腳本的安裝與熱更新流程圖,這邊就不多說了!
安裝腳本:

更新腳本:

腳本爬取的介紹到這里就告一段落了,后續(xù)會繼續(xù)優(yōu)化流程,優(yōu)化爬取策略,有興趣的朋友可以找我討論下,謝謝!
如果覺得此文不錯,麻煩幫我點下“喜歡”。么么噠!