第31讲:抓包利器 Charles 的使用
本課時我們主要學習如何使用 Charles。
Charles 是一個網絡抓包工具,我們可以用它來做 App 的抓包分析,得到 App 運行過程中發生的所有網絡請求和響應內容,這就和 Web 端瀏覽器的開發者工具 Network 部分看到的結果一致。
Charles、Fiddler 等都是非常強大的 HTTP 抓包軟件,功能基本類似,不過 Charles 的跨平臺支持更好。所以我們選用 Charles 作為主要的移動端抓包工具,用于分析移動 App 的數據包,輔助完成 App 數據抓取工作。
本節目標
本節我們以電影示例 App 為例,通過 Charles 抓取 App 運行過程中的網絡數據包,然后查看具體的 Request 和 Response 內容,以此來了解 Charles 的用法。
同時抓取到數據包之后,我們采用 Python 將請求進行改寫,從而實現 App 數據的爬取。
準備工作
請確保已經正確安裝 Charles 并開啟了代理服務,另外準備一部 Android 手機,系統版本最好是在 7.0 以下。
如果系統版本在 7.0 及以上,可能出現 SSL Pining 的問題,可以參考第一課時的思路來解決。
然后手機連接 Wi-Fi,和 PC 處于同一個局域網下,另外將 Charles 代理和 Charles CA 證書設置好,同時需要開啟 SSL 監聽。
此過程的配置流程可以參見:https://cuiqingcai.com/5255.html。
最后手機上安裝本節提供的 apk(apk 隨課件一同領取),進行接下來的 Charles 抓包操作。
原理
首先將 Charles 運行在自己的 PC 上,Charles 運行的時候會在 PC 的 8888 端口開啟一個代理服務,這個服務實際上是一個 HTTP/HTTPS 的代理。
確保手機和 PC 在同一個局域網內,我們可以使用手機模擬器通過虛擬網絡連接,也可以使用手機真機和 PC 通過無線網絡連接。
設置手機代理為 Charles 的代理地址,這樣手機訪問互聯網的數據包就會流經 Charles,Charles 再轉發這些數據包到真實的服務器,服務器返回的數據包再由 Charles 轉發回手機,Charles 就起到中間人的作用,所有流量包都可以捕捉到,因此所有 HTTP 請求和響應都可以捕獲到。同時 Charles 還有權力對請求和響應進行修改。
抓包
好,我們先打開 Charles,初始狀態下 Charles 的運行界面如圖所示。
Charles 會一直監聽 PC 和手機發生的網絡數據包,捕獲到的數據包就會顯示在左側,隨著時間的推移,捕獲的數據包越來越多,左側列表的內容也會越來越多。
可以看到,圖中左側顯示了 Charles 抓取到的請求站點,我們點擊任意一個條目便可以查看對應請求的詳細信息,其中包括 Request、Response 等內容。
接下來清空 Charles 的抓取結果,點擊左側的掃帚按鈕即可清空當前捕獲到的所有請求。然后點擊第二個監聽按鈕,確保監聽按鈕是打開的,這表示 Charles 正在監聽 App 的網絡數據流,如圖所示。
這時打開 App,注意一定要提前設置好 Charles 的代理并配置好 CA 證書,否則沒有效果。
打開 App 之后我們就可以看到類似如下的頁面。
這時候我們就可以發現 Charles 里面已經抓取到了對應的數據包,出現了類似如圖所示的結果。
我們在 App 里不斷上拉,可以看到 Charles 捕獲到這個過程中 App 內發生的所有網絡請求,如圖所示。
左側列表中會出現一個 dynamic1.scrape.cuiqingcai.com 的鏈接,而且在 App 上拉過程它在不停閃動,這就是當前 App 發出的獲取數據的請求被 Charles 捕獲到了。
為了驗證其正確性,我們點擊查看其中一個條目的詳情信息。切換到 Contents 選項卡,這時我們發現一些 JSON 數據,核對一下結果,結果有 results 字段,每一個條目的 name 字段就是電影的信息,這與 App 里面呈現的內容是完全一致的,如圖所示。
這時可以確定,此請求對應的接口就是獲取電影數據的接口。這樣我們就成功捕獲到了在上拉刷新的過程中發生的請求和響應內容。
分析
現在分析一下這個請求和響應的詳細信息。首先可以回到 Overview 選項卡,上方顯示了請求的接口 URL,接著是響應狀態 Status Code、請求方式 Method 等,如圖所示。
這個結果和原本在 Web 端用瀏覽器開發者工具內捕獲到的結果形式是類似的。
接下來點擊 Contents 選項卡,查看該請求和響應的詳情信息。
上半部分顯示的是 Request 的信息,下半部分顯示的是 Response 的信息。比如針對 Reqeust,我們切換到 Headers 選項卡即可看到該 Request 的 Headers 信息,針對 Response,我們切換到 JSON Text 選項卡即可看到該 Response 的 Body 信息,并且該內容已經被格式化,如圖所示。
由于這個請求是 GET 請求,所以我們還需要關心的就是 GET 的參數信息,切換到 Query String 選項卡即可查看,如圖所示。
這樣我們就成功抓取到了 App 中的電影數據接口的請求和響應,并且可以查看 Response 返回的 JSON 數據。
至于其他 App,我們同樣可以使用這樣的方式來分析。如果我們可以直接分析得到請求的 URL 和參數的規律,直接用程序模擬即可批量抓取。
重發
Charles 還有一個強大功能,它可以將捕獲到的請求加以修改并發送修改后的請求。點擊上方的修改按鈕,左側列表就多了一個以編輯圖標為開頭的鏈接,這就代表此鏈接對應的請求正在被我們修改,如圖所示。
我們可以將參數中的某個字段修改下,比如這里將 offset 字段由 0 修改為 10。這時我們已經對原來請求攜帶的 Query 參數做了修改,然后點擊下方的 Execute 按鈕即可執行修改后的請求,如圖所示。
可以發現左側列表再次出現了接口的請求結果,內容變成了第 11~20 條內容,如圖所示。
有了這個功能,我們就可以方便地使用 Charles 來做調試,可以通過修改參數、接口等來測試不同請求的響應狀態,就可以知道哪些參數是必要的哪些是不必要的,以及參數分別有什么規律,最后得到一個最簡單的接口和參數形式以供程序模擬調用使用。
模擬
現在我們已經成功完成了抓包操作了,所有的請求一目了然,請求的 URL 就是 https://dynamic1.scrape.cuiqingcai.com/api/movie/,后面跟了兩個 GET 請求參數。經過觀察,可以很輕松地發現 offset 就是偏移量,limit 就是一次請求要返回的結果數量。比如 offset 為 20,limit 為 10,就代表獲取第 21~30 條數據。另外我們通過觀察發現一共就是 100 條數據,offset 從 0 到 90 遍歷即可。
接下來我們用 Python 簡單實現一下模擬請求即可,這里寫法一些從簡了,代碼如下:
import requestsBASE_URL = 'https://dynamic1.scrape.cuiqingcai.com/api/movie?offset={offset}&limit=10' for i in range(0, 10):offset = i * 10url = BASE_URL.format(offset=offset)data = requests.get(url).json()print('data', data)運行結果如下:
data {'count': 100, 'results': [{'id': 1, 'name': '霸王別姬', 'alias': 'Farewell My Concubine', 'cover': 'https://p0.meituan.net/movie/ce4da3e03e655b5b88ed31b5cd7896cf62472.jpg@464w_644h_1e_1c', 'categories': ['劇情', '愛情'], 'published_at': '1993-07-26', 'minute': 171, 'score': 9.5, 'regions': ['中國大陸', '中國香港']}, {'id': 2, 'name': '這個殺手不太冷', 'alias': 'Léon', 'cover': ... 'published_at': '1995-07-15', 'minute': 89, 'score': 9.0, 'regions': ['美國']}]}data {'count': 100, 'results': [{'id': 11, 'name': 'V字仇殺隊', 'alias': 'V for Vendetta', 'cover': 'https://p1.meituan.net/movie/06ec3c1c647942b1e40bca84036014e9490863.jpg@464w_644h_1e_1c', 'categories': ['劇情', '動作', '科幻', '驚悚'], 'published_at': '2005-12-11', 'minute': 132, 'score': 8.9, 'regions': ['美國', '英國', '德國']}, ... 'categories': ['紀錄片'], 'published_at': '2001-12-12', 'minute': 98, 'score': 9.1, 'regions': ['法國', '德國', '意大利', '西班牙', '瑞士']}]}data {'count': 100, 'results': [{'id': 21, 'name': '黃金三鏢客', 'alias': 'Il buono, il brutto, il cattivo.', 'cover': ...可以看到每個請求都被我們輕松模擬實現了,數據也被爬取下來了。
由于這個 App 的接口沒有任何加密,所以僅僅靠抓包完之后觀察規律我們就能輕松完成 App 接口的模擬爬取。
結語
以上內容便是通過 Charles 抓包分析 App 請求的過程。通過 Charles,我們成功抓取 App 中流經的網絡數據包,捕獲原始的數據,還可以修改原始請求和重新發起修改后的請求進行接口測試。
知道了請求和響應的具體信息,如果我們可以分析得到請求的 URL 和參數的規律,直接用程序模擬即可批量抓取,這當然最好不過了。
但是隨著技術的發展,App 接
總結
以上是生活随笔為你收集整理的第31讲:抓包利器 Charles 的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第26讲:模拟登录爬取实战案例
- 下一篇: 第20讲:代理的基本原理和用法