今天向大家介紹app爬取。
@
一:爬取主要流程簡述
1.APP的爬取比Web爬取更加容易,反爬蟲沒有那么強,且大部分數據是以JSON形式傳輸的,解析簡單。
2.在APP中想要查看請求與響應(類似瀏覽器的開發者工具監聽到的各個網絡請求和響應),就需要借助抓包軟件。
3.在抓取之前,需要設置代理將手機處於抓包軟件的監聽下,就可以用同一網絡進行監聽,獲得所有的網絡和請求。
4.如果是有規則的,就只需要分析即可;如果沒有規律,就可以用另一個工具mitmdump對接Python腳本直接處理Response。
5.抓取肯定不能由人手動完成,還需要做到自動化,還要對App進行自動化控制,可以用庫Appium。
二:抓包工具Charles
1.Charles的使用
Charles是一個網絡抓包工具,比Fiddler功能更強大,可以進行分析移動App的數據包,獲取所有的網絡請求和網絡內容
2.安裝
(1)安裝鏈接
官網:https://www.charlesproxy.com
(2)須知
charles是收費軟件,但可以免費試用30天。試用期過了,還可以試用,不過每次試用不能超過30分鍾,啟動有10秒的延遲,但大部分還可以使用。
(3)安裝后

3.證書配置
(1)證書配置說明
現在很多網頁都在向HTTPS(超文本傳輸協議的加密版,即HTTP加入SSL層),經過SSL加密更加安全,真實,大部分都由CA機構頒發安全簽章(12306不是CA機構頒發,但不被信任)。現在應用HTTPS協議的App通信數據都會是加密的,常規的截包方法是無法識別請求內部的數據的。
要抓取APP端的數據,要在PC和手機端都安裝證書。
(2)windows系統安裝證書配置
打開Charles,點擊Help->SSL Proxying->Install Charles Root Certificate,進入證書的安裝頁面:

點擊安裝證書,就會打開證書安裝向導,然后點擊下一步,此時需要選擇證書的存儲區域,選擇第二個選項”將所有證書放入下列存儲”:

然后點擊瀏覽,選擇證書存儲位置為”受信任的根證書頒發機構”,點擊確認並進入下一步:

(3)Android手機安裝證書配置
手機與電腦連接同一個WiFi。
設置如下:
可以用操作系統命令ipconfig查看PC端ip:

為10.61.131.172,默認代理端口號為8888。之后代理服務器為電腦的IP地址。端口為8888。設置如下:

會發現360手機的標志

接下來對手機下載證書:
訪問手機訪問 chls.pro/ssl ,下載證書:

此時下載的是個.pem 格式的。需要手動更改為.crt 格式,最后隨便放進某個文件夾即可:

用手機(我用的360手機)設置里的安全,找到從存儲設備安裝找到該crt文件進行配置:

此時需要設置鎖屏:

就可以完成證書的安裝。
4.開啟SSL監聽
點擊Proxy->SSLProxying Settings,在彈出的窗口中點擊Add按鈕,添加需要監聽的地址和端口號。需要監聽所有的HTTPS請求,可以直接將地址和端口設置為,即添加:*設置,就可以抓取所有的HTTPS請求包;如果不配置,抓取的HTTPS請求包狀態可能是unknown。


這樣就指定只監聽我們需要的ip和端口的請求和響應。
5.原理
Charles運行時會在PC端的8888開啟一個代理服務,實際上是一個HTTP/HTTPS的代理。
可以是用手機通過相同的無線網絡連接(這里用的是校園網),設置手機代理為Charles的代理地址,這樣手機訪問互聯網的數據就會經過Charles抓包工具,Charles轉發這些數據到真實的服務器,再轉發到手機中。這樣抓包工具(Charles)就起到了中間人的作用,還有權對請求和響應進行修改。
6.抓包
我們可以看到我們已經請求了很多數據了,點擊左上角的掃帚按鈕即可清空捕獲到的所有請求,然后點擊第二個監聽按鈕,表明Charles正在監聽App的網絡數據流。如下:

抓包后可以看到音樂:

可以通過分析不同的URL請求,獲得數據,也可以通過修改數據,得到那些參數是需要的。

這是有規則的,無規則的如果沒有規律的url,就可以用另一個工具mitmdump對接Python腳本直接處理Response。
三:抓包工具mitmproxy(免費的)
1.簡介
mitmproxy是一個支持HTTP和HTTPS的抓包程序,有類似Fiddler和Charles的功能,但它是一個控制台的形式操作。
2.關聯組件
mirmproxy還有兩個關聯組件。一個是mitmdump,是命令行接口,可以對接Python腳本,用Python處理數據;另一個是mitmweb,是一個web程序,可以清楚地查看mitmproxy捕獲的請求。
3.安裝和證書配置
(1)用pip安裝
這個是安裝python后就有的安裝方法,也是最簡單的安裝方法,在控制台輸入
Pip install mitmproxy即可,會自動安裝mitmdump和mitmweb組件:

但是到最后安裝會失敗:

是因為安裝這個包的 window 系統需要首先安裝 Microsoft Visual C++ V14.0以上 才行。
可以在https://visualstudio.microsoft.com/downloads/
直接下載即可,安裝之后需要c++的庫之類的東西都安裝了,然后再在命令行進行安裝 mitmproxy即可:

然后進入安裝目錄,我們選擇第三個:

在“安裝 Visual Studio”屏幕中找到所需的工作負載,選擇"使用的桌面開發C++"工作負荷:
注:這里的文件太大,我直接安裝到E盤。

之后再安裝就可以安裝成功了:

(2)在GitHub或官網上安裝
GitHub:https://github.com/mitmproxy/mitmproxy
官網:https://mitmproxy.org
下載地址:https://github.com/mitmproxy/mitmproxy/releases
3.證書配置
(1) 產生CA證書
對於mitmproxy來說,如果想要截獲HTTPS請求,也需要設置證書。它在安裝后會提供一套CA證書,只要客戶端信任了mitmproxy的證書,就可以通過mitmproxy獲取HTTPS請求的具體內容,否則無法解析HTTPS請求。
在cmd中輸入命令行接口命令mitmdump,產生CA證書,在用戶目錄找到CA證書:


這里的目錄可以自行指定,但必須是在第一次運行mimdump時。
(2)PC端安裝
電腦是Window系統,因此用mitmproxy-ca.p12,雙擊后出現導入證書的引導頁:

點擊下一步,不需要設置密碼:

接下來點擊下一步,需要選擇證書的存儲區域,和配置Charles一樣:

最后會有警告,選擇是即可,證書就安裝到我們的電腦上了:


(3)手機端安裝
我的手機是Android系統,直接把mitmproxy-ca.pem文件發送到手機上即可。
配置方法和Charles類似。HTTPS請求。
手動更改為.crt 格式,最后隨便放進某個文件夾即可,用手機(我用的360手機)設置里的安全,找到從存儲設備安裝找到該crt文件進行配置:


4.抓包原理
在mitmproxy中,會在PC端的8080端口運行,然后開啟一個代理服務,就是一個HTTP/HTTPS代理,類似ip代理。
手機和PC在同一局域網內,設置代理為mitmproxy的代理地址,抓包工具mitmproxy就相當於中間人的作用,數據就會流經抓包工具。這個過程還可以對接mitmdump,抓取到的請求和響應都可以直接用Python來處理,然后分析,存到本地,或存到數據庫。
5.設置代理
在抓包前需要先設手機局域網置代理為抓包工具mitmproxy代理。
(1)啟動代理服務
在cmd中輸入mitmproxy,會在8080端口運行一個代理服務,由於該命令不支持Windows系統,因此在Windows系統中用mitmdump命令:

用mitmdump啟動代理服務,監聽8080端口:

(2)設置當前代理
將手機和電腦連到同一局域網下,先用操作系統命令ipconfig查看PC端當前局域網的ip:

為10.61.131.172,在手機端設置代理如下:

這樣就配置好了mitmproxy的代理。
6.抓包
運行mitmweb(由於mitmproxy不能用),就可以看到手機上的所有請求:

網頁呈現如下:

隨便打開一條網絡請求,發現和在網頁的開發者工具下,監聽到的一樣:


7.mitmproxy的高級功能mitmdump
上面的功能與方法在Fiddler和Charles中也有,那么mitmproxy的優勢何在?
在mitmproxy中它的強大體現到mitmdump工具,可以對接Python對數據請求進行處理。
它是mitmproxy的命令行接口,可以對接python程序對請求進行處理,不需要手動截取和分析HTTP請求和響應,進行數據存儲和解析都可以通過Python來完成。
(1)簡單獲取數據(隨便一個app)
我們先創建一個文件夾:

然后打開轉到該文件夾下:

輸入mitmdump -w outfile(outfile名稱和擴展名可以自定義,文件放到當前cmd打開目錄下,也可以用絕對相對路徑,但比較麻煩):
截取廣播頁面:


之后把截獲的數據保存到文件夾下:

打開文件,發現好多亂碼:

下面會對其進行處理。
(2)可以指定一個腳本來處理截獲的數據:
Mitmdump -s script.py(腳本名字可以自定義),需要放在cmd當前目錄下,也可以用絕對相對路徑,但比較麻煩。
寫入如下代碼:

就是定義了一個request()方法,參數為url,其實是一個HTTPFlow對象,通過request屬性即可獲取到當前請求對象。然后打印出請求頭,將User-Agent(用戶代理,簡稱 UA,它是一個特殊字符串頭,使得服務器能夠識別客戶使用的操作系統及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言瀏覽器插件等)修改為MitmProxy。
運行之后手機端訪問http://httpbin.org/get,可以看到請求頭:

PC端如下:

手機端請求的Headers實際上就是請求的Headers,User-Agent被修改成了mitmproxy(防反爬),PC端顯示修改后的Headers內容,其User-Agent正是MitProxy。
這樣就可以讓服務器識別不出我們的是爬蟲程序了。
(3)日志輸出
mitmdump提供了專門的日志輸出功能,就是設定輸出到控制台的顏色,可以分別為不同級別配置不同的顏色,更加直觀:

效果如下:

(4)輸出請求數據
可以輸出一些請求信息,比如請求連接(url),請求頭(headers),請求Cookies(cookies),請求Host(host),請求方法(method),請求端口(port),請求協議(scheme)等。
還可以把這些請求的信息進行修改后,再發送到服務器中,這樣,服務器返回的可能不是app想請求的網頁,這就是為什么一些app打開后卻訪問到了其他網址的原因。
也可以通過該用法,通過修改Cookies,添加代理等方式來盡可能避免反爬。
這里就先進行略過。
(5)獲得響應
響應就是請求后服務器返回的信息,也就是我們需要的,大部分是json格式文件。
對於json格式文件,mitmdump也提供了對應的處理接口,就是response()方法。
我們可以打印各個http/https請求的響應內容,不過text才是我們想要的json格式文件,也可以用content,不過返回的是二進制文件。
代碼如下:

我們先試一下:

內容有些亂,接下來我們就進行分析得到我們需要的數據。
四:利用mitmproxy進行app數據獲取
1.獲取請求url
獲取http/https請求url,也可以認為是接口:
修改python文件,獲得請求的url:

然后停留在該頁面:

會發現出現了好多url:

我們一一分析一下,發現接口信息分別是:
這個接口
https://images.sanmaoyou.com/img/new_images/5ac83890033ec.jpg
是GET請求獲取文件:

這個接口的為json文件,為GET獲取方式:


這個接口
https://images.sanmaoyou.com/audio/library/2018-04/5ac83887c5263.mp3
是下載音樂,為GET獲取方式:

這個接口
http://sdk-open-phone.getui.com/api.php?format=json&t=1&d=76060FDC1EFFF74C1956225F1DBEE6AF006578C33658C4AF90D802512BF321C8&k=2是POST方式,是傳文件。
我們在向右點擊下一個廣播,進行驗證:

發現基本上,新打開一個廣播后,會加載mp3文件,圖片文件,比較長的接口就返回json文件:

2.接口url文件
把接口保存到txt文件中:

發現只有很長的接口才返回json文件。因此下面就需要對這些接口進行篩選。
3.爬取json
代碼在pa_qu_json.py文件中,需要先創建一個json爬取數據文件夾,爬取后的結果如下:


接下來用Python處理即可,這里只是簡單爬取。在實際應用中,不是人工的,是用代碼自動化進行分析各個請求和響應進行爬取。這里有個跨平台的移動端自動化測試工具,可以很方便地進行自動化爬取,在下一個爬蟲博客中會詳細講到,希望大家把寶貴意見提出來一起學習進步。
