[Python3網路爬蟲開發實戰] Charles 的使用

adrry01發表於2019-12-08

Charles 的使用
Charles 是一個網路抓包工具,我們可以用它來做 App 的抓包分析,得到 App 執行過程中發生的所有網路請求和響應內容,這就和 Web 端瀏覽器的開發者工具 Network 部分看到的結果一致。

相比 Fiddler 來說,Charles 的功能更強大,而且跨平臺支援更好。所以我們選用 Charles 作為主要的移動端抓包工具,用於分析移動 App 的資料包,輔助完成 App 資料抓取工作。

  1. 本節目標
    本節我們以京東 App 為例,通過 Charles 抓取 App 執行過程中的網路資料包,然後檢視具體的 Request 和 Response 內容,以此來了解 Charles 的用法。

  2. 準備工作
    請確保已經正確安裝 Charles 並開啟了代理服務,手機和 Charles 處於同一個區域網下,Charles 代理和 CharlesCA 證照設定好,另外需要開啟 SSL 監聽,具體的配置可以參考第 1 章的說明。

  3. 原理
    首先 Charles 執行在自己的 PC 上,Charles 執行的時候會在 PC 的 8888 埠開啟一個代理服務,這個服務實際上是一個 HTTP/HTTPS 的代理。

確保手機和 PC 在同一個區域網內,我們可以使用手機模擬器通過虛擬網路連線,也可以使用手機真機和 PC 通過無線網路連線。

設定手機代理為 Charles 的代理地址,這樣手機訪問網際網路的資料包就會流經 Charles,Charles 再轉發這些資料包到真實的伺服器,伺服器返回的資料包再由 Charles 轉發回手機,Charles 就起到中間人的作用,所有流量包都可以捕捉到,因此所有 HTTP 請求和響應都可以捕獲到。同時 Charles 還有權力對請求和響應進行修改。

  1. 抓包
    初始狀態下 Charles 的執行介面如圖 11-1 所示:
    在這裡插入圖片描述

圖 11-1 Charles 執行介面

Charles 會一直監聽 PC 和手機發生的網路資料包,捕獲到的資料包就會顯示在左側,隨著時間的推移,捕獲的資料包越來越多,左側列表的內容也會越來越多。

可以看到,圖中左側顯示了 Charles 抓取到的請求站點,我們點選任意一個條目便可以檢視對應請求的詳細資訊,其中包括 Request、Response 等內容。

接下來清空 Charles 的抓取結果,點選左側的掃帚按鈕即可清空當前捕獲到的所有請求。然後點選第二個監聽按鈕,確保監聽按鈕是開啟的,這表示 Charles 正在監聽 App 的網路資料流,如圖 11-2 所示。
在這裡插入圖片描述
圖 11-2 監聽過程

這時開啟手機京東,注意一定要提前設定好 Charles 的代理並配置好 CA 證照,否則沒有效果。

開啟任意一個商品,如 iPhone,然後開啟它的商品評論頁面,如圖 11-3 所示。
在這裡插入圖片描述
圖 11-3 評論頁面

不斷上拉載入評論,可以看到 Charles 捕獲到這個過程中京東 App 內發生的所有網路請求,如圖 11-4 所示。
在這裡插入圖片描述
圖 11-4 監聽結果

左側列表中會出現一個 api.m.jd.com 連結,而且它在不停閃動,很可能就是當前 App 發出的獲取評論資料的請求被 Charles 捕獲到了。我們點選將其展開,繼續上拉重新整理評論。隨著上拉的進行,此處又會出現一個個網路請求記錄,這時新出現的資料包請求確定就是獲取評論的請求。

為了驗證其正確性,我們點選檢視其中一個條目的詳情資訊。切換到 Contents 選項卡,這時我們發現一些 JSON 資料,核對一下結果,結果有 commentData 欄位,其內容和我們在 App 中看到的評論內容一致,如圖 11-5 所示。
在這裡插入圖片描述
圖 11-5 Json 資料結果

這時可以確定,此請求對應的介面就是獲取商品評論的介面。這樣我們就成功捕獲到了在上拉重新整理的過程中發生的請求和響應內容。

  1. 分析
    現在分析一下這個請求和響應的詳細資訊。首先可以回到 Overview 選項卡,上方顯示了請求的介面 URL,接著是響應狀態 Status Code、請求方式 Method 等,如圖 11-6 所示。
    在這裡插入圖片描述
    圖 11-6 監聽結果

這個結果和原本在 Web 端用瀏覽器開發者工具內捕獲到的結果形式是類似的。

接下來點選 Contents 選項卡,檢視該請求和響應的詳情資訊。

上半部分顯示的是 Request 的資訊,下半部分顯示的是 Response 的資訊。比如針對 Reqeust,我們切換到 Headers 選項卡即可看到該 Request 的 Headers 資訊,針對 Response,我們切換到 JSON TEXT 選項卡即可看到該 Response 的 Body 資訊,並且該內容已經被格式化,如圖 11-7 所示。
在這裡插入圖片描述
圖 11-7 監聽結果

由於這個請求是 POST 請求,所以我們還需要關心的就是 POST 的表單資訊,切換到 Form 選項卡即可檢視,如圖 11-8 所示。
在這裡插入圖片描述
圖 11-8 監聽結果

這樣我們就成功抓取 App 中的評論介面的請求和響應,並且可以檢視 Response 返回的 JSON 資料。

至於其他 App,我們同樣可以使用這樣的方式來分析。如果我們可以直接分析得到請求的 URL 和引數的規律,直接用程式模擬即可批量抓取。

  1. 重發
    Charles 還有一個強大功能,它可以將捕獲到的請求加以修改併傳送修改後的請求。點選上方的修改按鈕,左側列表就多了一個以編輯圖示為開頭的連結,這就代表此連結對應的請求正在被我們修改,如圖 11-9 所示。
    在這裡插入圖片描述
    圖 11-9 編輯頁面

我們可以將 Form 中的某個欄位移除,比如這裡將 partner 欄位移除,然後點選 Remove。這時我們已經對原來請求攜帶的 Form Data 做了修改,然後點選下方的 Execute 按鈕即可執行修改後的請求,如圖 11-10 所示。在這裡插入圖片描述
圖 11-10 編輯頁面

可以發現左側列表再次出現了介面的請求結果,內容仍然不變,如圖 11-11 所示。

在這裡插入圖片描述
圖 11-11 重新請求後結果

刪除 Form 表單中的 partner 欄位並沒有帶來什麼影響,所以這個欄位是無關緊要的。

有了這個功能,我們就可以方便地使用 Charles 來做除錯,可以通過修改引數、介面等來測試不同請求的響應狀態,就可以知道哪些引數是必要的哪些是不必要的,以及引數分別有什麼規律,最後得到一個最簡單的介面和引數形式以供程式模擬呼叫使用。

  1. 結語
    以上內容便是通過 Charles 抓包分析 App 請求的過程。通過 Charles,我們成功抓取 App 中流經的網路資料包,捕獲原始的資料,還可以修改原始請求和重新發起修改後的請求進行介面測試。

知道了請求和響應的具體資訊,如果我們可以分析得到請求的 URL 和引數的規律,直接用程式模擬即可批量抓取,這當然最好不過了。

但是隨著技術的發展,App 介面往往會帶有金鑰,我們並不能直接找到這些規律,那麼怎麼辦呢?接下來,我們將瞭解利用 Charles 和 mitmdump 直接對接 Python 指令碼實時處理抓取到的 Response 的過程。

相關文章