首頁>科技>

最近Python和GO語言很紅,想學但是隻能看得懂21天精通這種級別的教程。公司的專案暫時不會上py或go的技術棧,給的薪資福利待遇還可以,暫時又不想辭職。沒有專案實戰經驗,完全看不懂大神寫的乾貨,怎麼辦?

既然沒有別人給我們定目標,我就給我自己定一個目標。我在手機上發現一個賣qqyp的app叫touch,裡面有個社群經常有人發帖講述自己chg和yp的經歷,配圖都是這樣風格的(但不侷限於此),just like this!

所以我的目標是要把這些內容連同圖片都爬到我的硬盤裡。

web頁面裡的內容我們都會爬取,無非就是用curl或者wget等工具實現http請求嘛,那麼問題來了APP裡的內容如何爬取?

一位測試同學曾和我說過,某些web頁面載入過程比較複雜,所以需要使用selenium這類測試框架,selenium是模擬了瀏覽器載入頁面的過程,並可以在頁面載入完成後通過頁面元素來斷言測試用例是否通過。

既然web的測試框架可以獲取到頁面的元素,那麼APP的測試框架是不是也能獲取到APP指定控制元件(圖片)的屬性(url)呢?順著這個思路我在百度裡谷歌了一下,發現了appium這個工具。

appium有很強大的功能,具體請參看下面連結。

appium簡介的連結

自己給自己定的需求

使用Python編寫程式,通過appium操作安卓虛擬機器,開啟指定APP並進入帖子頁面,迴圈獲取帖子內容。

環境準備安裝java Python nodejs環境。安裝androidSDK。安裝appium。安裝Genymotion(安卓虛擬機器)。注:本人電腦為mac,1中的軟體可以使用brew安裝,234的軟體請到各自的官網下載安裝,如果下載速度較慢,需要FQ。

appium安裝完成後使用appium-doctor —android命令驗證

如果都打鉤,就ok;如果有叉請自行檢查環境變數相關配置。本人是在本地搭建的上述環境,沒有使用docker。因為無論使用安卓虛擬機器還是真機,docker連線起來都比較麻煩。

用真機手機熱,用虛擬機器電腦熱,抓到內容本人熱。

我們需要appium完成的功能:開啟APP。歡迎頁面跳過後點選按鈕進入帖子列表頁面。

社群->檢視全部->圈子列表->帖子列表

進入帖子詳情介面,點選右上角只看樓主獲取帖子標題、內容。獲取每條回覆內容,下滑迴圈此過程。

需求給自己提好了,開始code。appium選擇了Client/Server的設計模式。只要client能夠傳送http請求給server,那麼的話client用什麼語言來實現都是可以的。我們對Python不熟,所以這裡用Python來擼程式碼,以此熟悉一下Python的語法。

初始化獲取driver相關引數:platformName、deviceName、appPackage、appActivity等。請參考下面連結。

platformName寫Android

檢視deviceName

檢視appPackage和appActivity

獲取APP介面上元素物件,可以通過xpath、id方式獲取。請參考下面連結。

appium元素定位

程式碼擼到這裡遇到了第一個坑,帖子詳情頁的回覆是列表形式呈現,沒有id。如果使用xpath方式獲取只能通過下標來定位,但是安卓只會將螢幕內的元素按下標呈現,滑動到螢幕外的元素就無法通過下標找到了?這可怎麼辦!

使用appium在帖子列表介面模擬上划動作,捕捉不到列表的規律。上劃結束後,列表只能獲取到螢幕呈現的部分,而且下標還是從0開始的。

根據優酪乳爸爸多年碼程式碼的經驗,帖子肯定不是一次性載入完成的,一定會有分頁,上劃操作到某處APP一定會請求API介面。那麼我們監聽APP的網路請求不就能獲取到帖子內容了嗎!

mac下使用charles這個軟體實現。

charles簡介

配置好charles網路監聽後又遇到攔路華,APP的請求是https協議的,charles監聽到的報文都是亂碼的。我在百度上谷歌了一下。

Mac使用Charles進行HTTPS抓包

終於能在charles裡看到明文的網路請求了,於是通過網路請求可以歸納出帖子分頁載入的規律。這樣優酪乳爸爸就可以自己編寫程式,迴圈呼叫API請求抓取資料了。此處又遇到攔路華(我為什麼要加個“又”字)。API的請求做了引數簽名校驗,每次從charles抓到的請求,時效只有5分鐘。

如果抓取程式能夠儘可能的模仿使用者行為,那麼我們會突破所有服務端的屏障。

使用appium的在帖子詳情頁每3秒模擬使用者上劃一次,使用charles監聽虛擬機器的網路請求。這樣charles會源源不斷的捕捉到帖子分頁的API請求。此處又又遇到攔路華(我不喜歡“攔”,但我喜歡“路華”)。此時小姐姐們的照片還是在charles裡,而且還都是url字串。

使用charles的自動儲存功能,定時儲存API響應結果。在charles的選單欄“Tools”->“Auto Save”。按照下圖配置,“Save Type”請選擇“HTTP Archive”。配置完成後,charles抓取到的API響應會儲存為HAR格式的文字檔案。

HAR 格式規範

到這裡總算是撥開雲霧見青天,har檔案記錄是每次API請求的全過程,有url、引數、響應時間和返回值等等,而且還是標準的json格式。我們可以用新學的go語言寫一個控制檯程式來解析har檔案,並將解析後的結果整理歸類,帖子內容存入MySQL資料庫,小姐姐們的圖片curl下載到檔案系統。

新語言的學習並不都是新知識的學習,更多的是程式設計習慣的遷移。

優酪乳爸爸本來是做PHP開發的,現在用GO語言寫這個,本次遷移的技能如下:

日誌記錄MySQL資料庫讀寫斷點除錯文字檔案讀取json解析配置檔案的解析curl下載檔案

所以新語言的學習,第一步只要掌握語法,後續其實就是探索新語言所引入的新特性而已,以go語言為例,它對高併發有獨到的設計。至於我們在舊語言所掌握的一些通用技能,一併遷移過來就好。go語言如何連線redis、RabbitMQ,這等通用的功能無非就是用go語言的方式引用一下包而已。

最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 區塊鏈,“鏈”接遊戲,“鏈”接未來