業務背景
由於公司民宿的業務需求,需要
- 在未登錄情況下基於爬蟲針對途家網的房源的房態、價格、房源信息、上下架情況等進行實時追蹤,
- 在登錄情況下,同步房東端的房源、訂單、賬單等信息;
- 在登錄情況下,完成房東房源的開關房、上下架、改價、改庫存等操作;
- 完成自動登錄獲取cookie的操作;
**其中房態與價格為業務核心**
爬蟲與反爬發展過程
1.PC網頁階段;
2.手機H5階段;
3.舊版本APP階段;
4.APP逆向階段;
5.佛系階段;
具體過程
1.PC網頁階段:
*此時期,所有爬蟲模塊均為基於scrapy的單機式爬蟲,業務量規模較小,所有接口均為途家網網頁端接口;
*工作難點在於接口的js加密的逆向,破解TJH等相關參數的生成方式,debug時會有無限死循環函數導致chrome卡死,最終解決方案是一步一步單步調試,完全破解加密參數,使用python重寫js的加密邏輯,也可以使用execjs調用js核心代碼;
2.手機H5階段:
*基於PC接口破解的方式存在兩個弊端,一是途家TJH加密版本經常升級,導致爬蟲也失效;二是會產生假的數據,臟數據會污染生產環境。在某個版本后發現途家h5端雖有加密參數但是加密參數不生效,遂改成此接口,但不久h5接口亦有加密參數,因此該階段只是過渡,此時業務量一般;
3.舊版本APP階段:
*由於網頁易升級的弊端,因此切換為老版本途家APP,使用flidder抓包,雖有加密參數,然亦未做處理,該版本穩定一段時間后失效,而且此時業務量急速擴張,需要穩定的爬蟲模塊支持;
4.APP逆向階段:
*使用新版本途家APP,使用flidder抓包,其中核心的房態與價格功能均加密,初期其雖有加密參數,但校驗比較松散,經不斷升級調整,其請求頭的header與payload的數據耦合性極高。
*最終解決辦法是基於jadx與IDA分析源代碼,找出其加密.so文件,使用frida注入運行狀態的app以調用生產加密參數的靜態函數,並使用Flask發布接口獲取frida的結果;
*此階段業務量繼續飛速擴張,房源數量已達數萬套,同時對多個模塊進行了改造,自建了分布式的系統以保證及時性
5.佛系階段:
* 可以看出途家做了極多的反爬措施,無論是假數據、js加密,還是各種極高耦合性的加密參數,還是IP或者登陸校驗,以至於現在取消了PC網頁端的情況,但目前來看都不是很難攻克。
*針對速度及時性的要求,途家房源數量較多,目前的處理方案是:設計分布式架構,使用redis做任務隊列,scrapy/request負責抓取(根據場景使用),request的請求都放在線程池多線程運行,scrapy的都是同時起多進程,一個主節點為master負責產生任務,使用reids的zset對優先級進行排序,多個woker節點負責從redis取出優先級高的任務進行消費,目前仍在繼續解耦合中,最終目的是爬蟲爬取與業務完全分離,只負責數據正確與及時的抓取;