鄭昀 2016/3
關鍵詞:爬蟲、Crawler、分布式、競情分析、自動分片、
本文檔適用人員:研發和數據員工
提綱:
- 一個點解決不了,那就引入成百上千點
- master-slave管理模式
- 分布式爬蟲任務的管理
- 小結
一,一個點解決不了,那就引入成百上千點
我們需要競對在各個城市的各種經營數據,比如競對門店的地址電話,用戶活躍度,門店星級,商品數,折扣領取次數等,這數據通常在網頁上,甚至有些數據只有破解手機客戶端的通訊才能拿到,我在《移動客戶端數據抓取·外部工具篇》和《移動客戶端數據抓取·代碼注入篇》里描述過(注1:如附錄A和B所示)。
為了避免被競對的Rate Limitor屏蔽,我們提出將抓取客戶端分散在各地,它們到(雲端的)中心節點注冊,領取抓取任務,下載抓取腳本,上報抓取日志,中心節點可以對這些客戶端調度和管理,即常見的 master/slave 模式。
感謝佰清、川川、中周等對魔鏡項目的貢獻。
二,master/slave管理模式
當時我們認為,唯有做到如下特性,這個魔鏡系統才是一個能自動運行、最小人工干預的分布式抓取系統,才能被其他人所接手維護:
- 集群中可以並發有多個抓取任務,都是不同需求方提出的;
- 任務可以自動分片,比如按城市分片,按頁面分片等;
- 集群中,負責抓取網頁和解析網頁的節點是自動發現的;
- 集群可以調度作業,一個節點掛了可以將任務漂移給其他節點執行,任務不會丟失;
- 任務可以暫停,還可以重新抓取;
- 各個節點上的日志能上報收集,並在控制台統一展示;
三,分布式爬蟲任務的管理
3.1.任務-子任務
首先,我們定義抓取任務的層級關系為:
任務->子任務。
任務依據什么自動拆解出子任務呢?
目前是城市。
第一步,我創建任務,從下拉列表中指定抓取腳本,指定抓取城市,如下圖所示:

(圖1 創建任務)
目前已經有6個抓取腳本:

(圖2 抓取腳本下拉列表)
你也可以自己上傳腳本,如下圖所示:

(圖3 自行上傳抓取腳本)
3.2.slave清單
在前面提到的任務創建頁面上,城市數按切片數平攤,就能衍生出一大堆子任務。
客戶端(Slave)啟動之后,自己注冊到 Master 上來領取這些子任務。
通過 Slave 列表頁,我們可以看到當前有多少個客戶端注冊上來了:

(圖4 Slave列表)
3.3.任務運行
點擊任務管理->任務列表,可以看到當前有多少個抓取任務:

(圖5 任務列表頁)
任務的操作項有:
- 查看(任務詳情)
- 編輯
- 查看子任務
- 日志
- 刪除
- 暫停
點擊查看子任務的操作項,我們進入子任務詳情頁,從下圖可以看到有多少個機器領取並執行抓取任務:

(圖6 子任務列表頁)
子任務的操作項有:
- 重新抓取:也就是再次發布這個子任務,由節點認領並執行。因為有可能這個子任務的執行狀態是(因為網絡問題,或對方站點屏蔽而)執行失敗,我們需要讓它從新運行。
- 日志
我們做管理后台,一般都要求能直接在控制台里看日志,這樣能快速排查問題。下面我們看一下任務以及子任務的日志:
(圖7 任務的日志頁)
四,小結
過去幾年里,我要求我們開發交付的系統必須是商用系統,它至少要做到:
- 自成體系,自證靠譜;
- 可視化的控制台;
- 監控報警完善;
- 隨時可以交出去;
我們正在升級改造的魔鏡、魔盒、CloudEngine、Summoner、Janus、數屏等組件服務都應該向這個方向靠攏,開發者要以此為指導思想要求自己。
-EOF-
以前寫的研發解決方案:
附錄A:
移動客戶端數據抓取·外部工具篇
2016-03-27 鄭昀 老兵筆記
一,如何抓取App(iOS/Android)與服務器端的數據包(若已加密,請解密)
- 讓App運行在手機上:
- 辦法一:
- 手機正常連接WiFi,設置(手機上的)HTTP代理為(你的)個人電腦上的Fiddler2(電腦的IP,以及Fiddler的默認端口8888)
- 通過Fiddler2可以抓到HTTP/HTTPS的數據包
- 通過WireShark可以抓到HTTP/HTTPS/TCP的數據包
- 辦法二:
- 個人電腦上通過Connectify Hotspot或者獵豹免費WiFi軟件創建一個熱點
- 手機連接這個熱點
- 通過WireShark可以抓到HTTP/HTTPS/TCP的數據包
- 讓App運行在個人電腦上的BlueStacks模擬器里:
- 辦法三:
- 通過WireShark可以抓到HTTP/HTTPS/TCP的數據包
所需軟件清單:
BlueStacks模擬器:http://www.bluestacks.cn/
Fiddle2:http://www.telerik.com/fiddler
WireShark:https://www.wireshark.org/download.html
二,如果App(iOS/Android)與服務器端的通訊是SSL加密,如何破?
解題思路是:
- 旁路偵聽,是無法對SSL會話解密的(畢竟不是人人都能做GFW);
- 只有中間人(代理服務器角色)才能偷梁換柱,成功解密,拿到響應原文;
- 參考http://blog.csdn.net/yzzst/article/details/46739581
其中一種解題方法是:
利用Fiddler2:
注意:如上面方法一所述,Fiddler作為HTTP代理,只能捕獲HTTP/HTTPS的包;如果App與遠端通過HTTPS協商之后,選擇開啟一個TCP端口做加密傳輸,那么Fiddler就無濟於事了。
- 手機設置HTTP代理,走同一AP下的電腦桌面上的 Fiddler(或MAC 上的Charles)代理聯網;
- Fiddler Option需要對HTTPS做特殊設置,參考下面文獻1;
- 手機需要信任從Fiddler 導出來的根證書;
- 手機上啟動App,做點擊操作,查看截獲到的HTTPS內容解密原文;
參考文獻:
1,2014,CSDN,Fiddler抓取Android真機上的HTTPS包
2,2015,CSDN,聊聊HTTPS與Android安全(二)
3,2015,github,貓哥網絡編程系列:HTTP PEM 萬能調試法
4,2013,Android利用Fiddler進行網絡數據抓包
三,如果App通過HTTP/HTTPS協商后與遠端建立TCP通道加密傳輸,如何破?
WireShark可以抓到這些TCP包,但是由於WireShark是旁路偵聽,所以它不能像Fiddler一樣偷梁換柱。
如果說服務器端是咱們自己的應用程序,那么老版本的WireShark允許配置RSA Keys來解密:

新版本的WireShark允許使用Pre-Master-Key,在某些場景下可以直接解密:

但顯然也沒那么容易。
-待續-
附錄B:
移動客戶端數據抓取·代碼注入篇
2016-03-27 鄭昀 老兵筆記
聽了老陳的講座后,我大致總結一下:
網絡抓包分析,WireShark是最強工具,Fiddler2是最易用工具(但只針對HTTP/HTTPS)。譬如說,
- 某團App是明文HTTP包,所以Crawler+Json串分析即可;
- 某評App走的HTTP,但做了序列化,Response Body里是二進制,只能用它自己的方法反序列化拿到原文。
- 某寶App走SSL,只能用它自己的方法拿到原文了。
所以最終的思路還是代碼注入。
第一步,務必能看懂 Smali 語言(比匯編語言高級那么一點點)。能看懂,才能根據蛛絲馬跡找到要注入的函數入口。

用JEB工具能看APK的Smali和Java代碼,可操作性也很好,適合快速定位關鍵代碼。
第二步,用Apkdb將目標dex文件反編譯為smali文件,然后增加寫日志的類,在關鍵smali代碼處增加日志輸出;用Apkdb將smali文件夾“回編譯”為dex文件。
第三步,把新dex加入apk文件里(就是一個壓縮包)。
第四步,用apkdb對apk文件簽名。或者用“幸運破解器”禁掉Android簽名驗證:

第五步,將apk文件覆蓋源文件。在模擬器里運行該應用。查看磁盤日志,分析行為。
小結:
Android代碼注入,獲取特定場景下的遠端響應原文,這是一個需要耐心和細心的工作,要花大量時間反復調試。
-EOF-
不妨訂閱我的微信訂閱號『老兵筆記』: