今天向你們介紹app爬取。
@python
1.APP的爬取比Web爬取更加容易,反爬蟲沒有那麼強,且大部分數據是以JSON形式傳輸的,解析簡單。android
2.在APP中想要查看請求與響應(相似瀏覽器的開發者工具監聽到的各個網絡請求和響應),就須要藉助抓包軟件。c++
3.在抓取以前,須要設置代理將手機處於抓包軟件的監聽下,就能夠用同一網絡進行監聽,得到全部的網絡和請求。git
4.若是是有規則的,就只須要分析便可;若是沒有規律,就能夠用另外一個工具mitmdump對接Python腳本直接處理Response。github
5.抓取確定不能由人手動完成,還須要作到自動化,還要對App進行自動化控制,能夠用庫Appium。
web
Charles是一個網絡抓包工具,比Fiddler功能更強大,能夠進行分析移動App的數據包,獲取全部的網絡請求和網絡內容
數據庫
官網:https://www.charlesproxy.comjson
charles是收費軟件,但能夠免費試用30天。試用期過了,還能夠試用,不過每次試用不能超過30分鐘,啓動有10秒的延遲,但大部分還可使用。windows
如今不少網頁都在向HTTPS(超文本傳輸協議的加密版,即HTTP加入SSL層),通過SSL加密更加安全,真實,大部分都由CA機構頒發安全簽章(12306不是CA機構頒發,但不被信任)。如今應用HTTPS協議的App通訊數據都會是加密的,常規的截包方法是沒法識別請求內部的數據的。
要抓取APP端的數據,要在PC和手機端都安裝證書。
打開Charles,點擊Help->SSL Proxying->Install Charles Root Certificate,進入證書的安裝頁面:
點擊安裝證書,就會打開證書安裝嚮導,而後點擊下一步,此時須要選擇證書的存儲區域,選擇第二個選項」將全部證書放入下列存儲」:
而後點擊瀏覽,選擇證書存儲位置爲」受信任的根證書頒發機構」,點擊確認並進入下一步:
手機與電腦鏈接同一個WiFi。
設置以下:
能夠用操做系統命令ipconfig查看PC端ip:
爲10.61.131.172,默認代理端口號爲8888。以後代理服務器爲電腦的IP地址。端口爲8888。設置以下:
會發現360手機的標誌
接下來對手機下載證書:
訪問手機訪問 chls.pro/ssl ,下載證書:
此時下載的是個.pem 格式的。須要手動更改成.crt 格式,最後隨便放進某個文件夾便可:
用手機(我用的360手機)設置裏的安全,找到從存儲設備安裝找到該crt文件進行配置:
此時須要設置鎖屏:
就能夠完成證書的安裝。
點擊Proxy->SSLProxying Settings,在彈出的窗口中點擊Add按鈕,添加須要監聽的地址和端口號。須要監聽全部的HTTPS請求,能夠直接將地址和端口設置爲,即添加:*設置,就能夠抓取全部的HTTPS請求包;若是不配置,抓取的HTTPS請求包狀態多是unknown。
這樣就指定只監聽咱們須要的ip和端口的請求和響應。
Charles運行時會在PC端的8888開啓一個代理服務,其實是一個HTTP/HTTPS的代理。
能夠是用手機經過相同的無線網絡鏈接(這裏用的是校園網),設置手機代理爲Charles的代理地址,這樣手機訪問互聯網的數據就會通過Charles抓包工具,Charles轉發這些數據到真實的服務器,再轉發到手機中。這樣抓包工具(Charles)就起到了中間人的做用,還有權對請求和響應進行修改。
咱們能夠看到咱們已經請求了不少數據了,點擊左上角的掃帚按鈕便可清空捕獲到的全部請求,而後點擊第二個監聽按鈕,代表Charles正在監聽App的網絡數據流。以下:
抓包後能夠看到音樂:
能夠經過分析不一樣的URL請求,得到數據,也能夠經過修改數據,獲得那些參數是須要的。
這是有規則的,無規則的若是沒有規律的url,就能夠用另外一個工具mitmdump對接Python腳本直接處理Response。
mitmproxy是一個支持HTTP和HTTPS的抓包程序,有相似Fiddler和Charles的功能,但它是一個控制檯的形式操做。
mirmproxy還有兩個關聯組件。一個是mitmdump,是命令行接口,能夠對接Python腳本,用Python處理數據;另外一個是mitmweb,是一個web程序,能夠清楚地查看mitmproxy捕獲的請求。
這個是安裝python後就有的安裝方法,也是最簡單的安裝方法,在控制檯輸入
Pip install mitmproxy便可,會自動安裝mitmdump和mitmweb組件:
可是到最後安裝會失敗:
是由於安裝這個包的 window 系統須要首先安裝 Microsoft Visual C++ V14.0以上 才行。
能夠在https://visualstudio.microsoft.com/downloads/
直接下載便可,安裝以後須要c++的庫之類的東西都安裝了,而後再在命令行進行安裝 mitmproxy便可:
而後進入安裝目錄,咱們選擇第三個:
在「安裝 Visual Studio」屏幕中找到所需的工做負載,選擇"使用的桌面開發C++"工做負荷:
注:這裏的文件太大,我直接安裝到E盤。
以後再安裝就能夠安裝成功了:
GitHub:https://github.com/mitmproxy/mitmproxy
官網:https://mitmproxy.org
下載地址:https://github.com/mitmproxy/mitmproxy/releases
對於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文件進行配置:
在mitmproxy中,會在PC端的8080端口運行,而後開啓一個代理服務,就是一個HTTP/HTTPS代理,相似ip代理。
手機和PC在同一局域網內,設置代理爲mitmproxy的代理地址,抓包工具mitmproxy就至關於中間人的做用,數據就會流經抓包工具。這個過程還能夠對接mitmdump,抓取到的請求和響應均可以直接用Python來處理,而後分析,存到本地,或存到數據庫。
在抓包前須要先設手機局域網置代理爲抓包工具mitmproxy代理。
在cmd中輸入mitmproxy,會在8080端口運行一個代理服務,因爲該命令不支持Windows系統,所以在Windows系統中用mitmdump命令:
用mitmdump啓動代理服務,監聽8080端口:
將手機和電腦連到同一局域網下,先用操做系統命令ipconfig查看PC端當前局域網的ip:
爲10.61.131.172,在手機端設置代理以下:
這樣就配置好了mitmproxy的代理。
運行mitmweb(因爲mitmproxy不能用),就能夠看到手機上的全部請求:
網頁呈現以下:
隨便打開一條網絡請求,發現和在網頁的開發者工具下,監聽到的同樣:
上面的功能與方法在Fiddler和Charles中也有,那麼mitmproxy的優點何在?
在mitmproxy中它的強大致現到mitmdump工具,能夠對接Python對數據請求進行處理。
它是mitmproxy的命令行接口,能夠對接python程序對請求進行處理,不須要手動截取和分析HTTP請求和響應,進行數據存儲和解析均可以經過Python來完成。
咱們先建立一個文件夾:
而後打開轉到該文件夾下:
輸入mitmdump -w outfile(outfile名稱和擴展名能夠自定義,文件放到當前cmd打開目錄下,也能夠用絕對相對路徑,但比較麻煩):
截取廣播頁面:
以後把截獲的數據保存到文件夾下:
打開文件,發現好多亂碼:
下面會對其進行處理。
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。
這樣就可讓服務器識別不出咱們的是爬蟲程序了。
mitmdump提供了專門的日誌輸出功能,就是設定輸出到控制檯的顏色,能夠分別爲不一樣級別配置不一樣的顏色,更加直觀:
效果以下:
能夠輸出一些請求信息,好比請求鏈接(url),請求頭(headers),請求Cookies(cookies),請求Host(host),請求方法(method),請求端口(port),請求協議(scheme)等。
還能夠把這些請求的信息進行修改後,再發送到服務器中,這樣,服務器返回的可能不是app想請求的網頁,這就是爲何一些app打開後卻訪問到了其餘網址的緣由。
也能夠經過該用法,經過修改Cookies,添加代理等方式來儘量避免反爬。
這裏就先進行略過。
響應就是請求後服務器返回的信息,也就是咱們須要的,大部分是json格式文件。
對於json格式文件,mitmdump也提供了對應的處理接口,就是response()方法。
咱們能夠打印各個http/https請求的響應內容,不過text纔是咱們想要的json格式文件,也能夠用content,不過返回的是二進制文件。
代碼以下:
咱們先試一下:
內容有些亂,接下來咱們就進行分析獲得咱們須要的數據。
獲取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文件:
把接口保存到txt文件中:
發現只有很長的接口才返回json文件。所以下面就須要對這些接口進行篩選。
代碼在pa_qu_json.py文件中,須要先建立一個json爬取數據文件夾,爬取後的結果以下:
接下來用Python處理便可,這裏只是簡單爬取。在實際應用中,不是人工的,是用代碼自動化進行分析各個請求和響應進行爬取。這裏有個跨平臺的移動端自動化測試工具,能夠很方便地進行自動化爬取,在下一個爬蟲博客中會詳細講到,但願你們把寶貴意見提出來一塊兒學習進步。