零、背景
我之前寫過關於 charles 的使用筆記,為什么現在又要來寫同類型的 mitmproxy 工具呢?下面我會娓娓道來他比 charles 多出的強大功能。
一、介紹
mitmproxy
是一個支持 HTTP 和 HTTPS 的抓包程序, 類似 Fiddle、Charles , 只不過它通過 CMD 的形式操作。
mitmproxy 還有兩個關聯組件:
一個是 mitmdump
,它是 mitmproxy 的命令行接口,利用它可以對接 Python 腳本,實現監聽后的處理;
另一個是 mitmweb
,它是一個Web 程序,通過它以清楚地觀察到 mitmproxy 捕獲的請求。(跟 charles 差不多)
二、安裝與配置
1、安裝
(1)方法一:通過 pip 安裝
pip3 install mitmproxy
會自動附帶安裝 mitmdump 和mitmweb。
(2)方法二:通過 brew 安裝
brew install mitmproxy
2、配置
抓 HTTPS 需要配置 CA 證書。
(1) 電腦端(以 mac 為例)
運行起 mitmdump
命令。
然后找到 ~/.mitmproxy/mitmprox-ca-cert.pem
文件,雙擊,彈出 Keychain Access窗口,找到名為 mitmproxy 的 CA 證書,選擇 Always Trust。
(2) 手機端(以 Android 為例)
同樣將 ~/.mitmproxy/mitmprox-ca-cert.pem
文件發送給手機,在手機端打開后,填入證書名和點擊確認按鈕,如下圖:
三、使用
下面的例子都以爬手機端為例,記得讓手機和 PC 處於同一個局域網。
1、mitmproxy
1、命令行運行 mitmproxy
命令,會啟動一個代理,默認監聽 8080 端口。
2、手機設置里修改網絡的代理設置:
3、現在就可以在命令行里查看經過的網絡請求了
4、也可查看請求的具體詳情:
5、還有編輯、重發功能
2、mitmweb
可以理解成界面版的 mitmproxy。
略。
3、mitmdump
上面介紹的功能其實 Fiddle、 Charles 也有,那么mitmproxy 的優勢何在哪?
這就要提到 mitmdump
了,有了它我們可以直接對接 Python 腳本對請求進行處理。比如對數據的解析、存儲、修改等。
示例 demo:
from mitmproxy import ctx
def request(flow):
# 獲取
request = flow.request
# 修改
request.headers['User-Agent'] = 'MitmProxy'
# 日志輸出
print(request.host)
ctx.log.info(request.host) # 顏色同上
ctx.log.warn(request.host) # 顏色:黃
ctx.log.error(request.host) # 顏色:紅
def response(flow):
response = flow.response
ctx.log.info(str(response.status_code))
詳細文檔:https://mitmproxy.readthedocs.io/en/v2.0.2/mitmdump.html
4、拓展 —— httpbin.org
通過 mitmdump 對 request 做了修改,想要看修改后達成的效果,推薦客戶端去訪問這個網址:http://httpbin.org/get 即可知曉。
四、坑
1、爬的成功率不高,失敗的會報錯 :Cannot establish TLS with client……
會是 https 抓不到的問題?但我的電腦和手機端的 CA 證書都裝了呀,費解。
解決方案:待解決
參考資料
《python 3 網絡爬蟲開發實踐》