Android 模擬登錄網(wǎng)頁—腳本爬取數(shù)據(jù)

這篇主要來講下近期做的一個項目-客戶端爬取網(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)的解析爬取方式。
來源:

  1. 網(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標簽得到
  2. JavaScript代碼加載內(nèi)容。這種情況是由于雖然網(wǎng)頁顯示時,內(nèi)容在HTML標簽里面,但是其實是由于執(zhí)行js代碼加到標簽里面的,所以這個時候內(nèi)容在js代碼里面的,而js的執(zhí)行是在瀏覽器端的操作,所以用程序去請求網(wǎng)頁地址的時候,得到的response是網(wǎng)頁代碼和js的代碼,所以自己在瀏覽器端能看到內(nèi)容。
  3. Ajax異步請求。這種情況是現(xiàn)在很常見的,尤其是在內(nèi)容以分頁形式顯示在網(wǎng)頁上,并且頁面無刷新,或者是對網(wǎng)頁進行某個交互操作后,得到內(nèi)容。

=========================
解析方式:

  1. CSS選擇器?,F(xiàn)在的網(wǎng)頁樣式比較多,所以一般的網(wǎng)頁都會有一些CSS的定位,例如class,id等,或者我們根據(jù)常見的節(jié)點路徑進行定位。e.g. #id .class
  2. XPATH。XPATH是一種頁面元素的路徑選擇方法,可以通過路徑表達式對XML文檔的節(jié)點進行定位。 比如—//*[@id=”finance”],意思是找尋所有節(jié)點符合id為finance的節(jié)點。
  3. 正則表達式。 用標準正則解析,一般會把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)

  1. 靜態(tài):在onPageFinished()方法中,讀取需要注入腳本文件,字符串拼接后,使用webview.callJavascript(“javascript:”+jsStr,new ValueCallback())注入 **
  2. 動態(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)化爬取策略,有興趣的朋友可以找我討論下,謝謝!

如果覺得此文不錯,麻煩幫我點下“喜歡”。么么噠!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概要 64學(xué)時 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,880評論 0 3
  • HTTP基本原理 URI、URL、URN(Uninform Resource) URI(Identifier):統(tǒng)...
    GHope閱讀 2,306評論 2 26
  • 沒有被正確同步的含義是什么 沒有正確同步的代碼對于不同的人來說可能會有不同的理解。在Java內(nèi)存模型這個語義環(huán)境下...
    竹天亮閱讀 564評論 0 0
  • 遇見最美好的回憶~ 七年時間彈指一揮間,改變了容顏,不變我們的內(nèi)心,不管未來如何,你們永遠在我心中~給我溫暖和感動...
    訥言自律閱讀 235評論 0 2

友情鏈接更多精彩內(nèi)容