您好,登錄后才能下訂單哦!
這篇文章主要介紹Python3爬蟲利器mitmproxy的功能是什么,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
mitmproxy 的使用
mitmproxy 是一個支持 HTTP 和 HTTPS 的抓包程序,有類似 Fiddler、Charles 的功能,只不過它是一個控制臺的形式操作。
mitmproxy 還有兩個關聯組件。一個是 mitmdump,它是 mitmproxy 的命令行接口,利用它我們可以對接 Python 腳本,用 Python 實現監聽后的處理。另一個是 mitmweb,它是一個 Web 程序,通過它我們可以清楚觀察 mitmproxy 捕獲的請求。
下面我們來了解它們的用法。
1. 準備工作
請確保已經正確安裝好了 mitmproxy,并且手機和 PC 處于同一個局域網下,同時配置好了 mitmproxy 的 CA 證書,具體的配置可以參考第 1 章的說明。
2. mitmproxy 的功能
mitmproxy 有如下幾項功能。
·攔截 HTTP 和 HTTPS 請求和響應
·保存 HTTP 會話并進行分析
·模擬客戶端發起請求,模擬服務端返回響應
·利用反向代理將流量轉發給指定的服務器
·支持 Mac 和 Linux 上的透明代理
·利用 Python 對 HTTP 請求和響應進行實時處理
3. 抓包原理
和 Charles 一樣,mitmproxy 運行于自己的 PC 上,mitmproxy 會在 PC 的 8080 端口運行,然后開啟一個代理服務,這個服務實際上是一個 HTTP/HTTPS 的代理。
手機和 PC 在同一個局域網內,設置代理為 mitmproxy 的代理地址,這樣手機在訪問互聯網的時候流量數據包就會流經 mitmproxy,mitmproxy 再去轉發這些數據包到真實的服務器,服務器返回數據包時再由 mitmproxy 轉發回手機,這樣 mitmproxy 就相當于起了中間人的作用,抓取到所有 Request 和 Response,另外這個過程還可以對接 mitmdump,抓取到的 Request 和 Response 的具體內容都可以直接用 Python 來處理,比如得到 Response 之后我們可以直接進行解析,然后存入數據庫,這樣就完成了數據的解析和存儲過程。
4. 設置代理
首先,我們需要運行 mitmproxy,命令如下所示:
啟動 mitmproxy 的命令如下:
mitmproxy
運行之后會在 8080 端口上運行一個代理服務,如圖 11-12 所示:
圖 11-12 mitmproxy 運行結果
右下角會出現當前正在監聽的端口。
或者啟動 mitmdump,它也會監聽 8080 端口,命令如下所示:
mitmdump
運行結果如圖 11-13 所示。
圖 11-13 MitmDump 運行結果
將手機和 PC 連接在同一局域網下,設置代理為當前代理。首先看看 PC 的當前局域網 IP。
Windows 上的命令如下所示:
ipconfig
Linux 和 Mac 上的命令如下所示:
ifconfig
輸出結果如圖 11-14 所示:
圖 11-14 查看局域網 IP
一般類似 10.*.*.* 或 172.16.*.* 或 192.168.1.* 這樣的 IP 就是當前 PC 的局域網 IP,例如此圖中 PC 的 IP 為 192.168.1.28,手機代理設置類似如圖 11-15 所示。
圖 11-15 代理設置
這樣我們就配置好了 mitmproxy 的的代理。
5. mitmproxy 的使用
確保 mitmproxy 正常運行,并且手機和 PC 處于同一個局域網內,設置了 mitmproxy 的代理,具體的配置方法可以參考第 1 章。
運行 mitmproxy,命令如下所示:
mitmproxy
設置成功之后,我們只需要在手機瀏覽器上訪問任意的網頁或瀏覽任意的 App 即可。例如在手機上打開百度,mitmproxy 頁面便會呈現出手機上的所有請求,如圖 11-16 所示。
圖 11-16 所有請求
這就相當于之前我們在瀏覽器開發者工具監聽到的瀏覽器請求,在這里我們借助于 mitmproxy 完成。Charles 完全也可以做到。
這里是剛才手機打開百度頁面時的所有請求列表,左下角顯示的 2/38 代表一共發生了 38 個請求,當前箭頭所指的是第二個請求。
每個請求開頭都有一個 GET 或 POST,這是各個請求的請求方式。緊接的是請求的 URL。第二行開頭的數字就是請求對應的響應狀態碼,后面是響應內容的類型,如 text/html 代表網頁文檔、image/gif 代表圖片。再往后是響應體的大小和響應的時間。
當前呈現了所有請求和響應的概覽,我們可以通過這個頁面觀察到所有的請求。
如果想查看某個請求的詳情,我們可以敲擊回車,進入請求的詳情頁面,如圖 11-17 所示。
圖 11-17 詳情頁面
可以看到 Headers 的詳細信息,如 Host、Cookies、User-Agent 等。
最上方是一個 Request、Response、Detail 的列表,當前處在 Request 這個選項上。這時我們再點擊 TAB 鍵,即可查看這個請求對應的響應詳情,如圖 11-18 所示。
圖 11-18 響應詳情
最上面是響應頭的信息,下拉之后我們可以看到響應體的信息。針對當前請求,響應體就是網頁的源代碼。
這時再敲擊 TAB 鍵,切換到最后一個選項卡 Detail,即可看到當前請求的詳細信息,如服務器的 IP 和端口、HTTP 協議版本、客戶端的 IP 和端口等,如圖 11-19 所示。
圖 11-19 詳細信息
mitmproxy 還提供了命令行式的編輯功能,我們可以在此頁面中重新編輯請求。敲擊 e 鍵即可進入編輯功能,這時它會詢問你要編輯哪部分內容,如 Cookies、Query、URL 等,每個選項的第一個字母會高亮顯示。敲擊要編輯內容名稱的首字母即可進入該內容的編輯頁面,如敲擊 m 即可編輯請求的方式,敲擊 q 即可修改 GET 請求參數 Query。
這時我們敲擊 q,進入到編輯 Query 的頁面。由于沒有任何參數,我們可以敲擊 a 來增加一行,然后就可以輸入參數對應的 Key 和 Value,如圖 11-20 所示。
圖 11-20 編輯頁面
這里我們輸入 Key 為 wd,Value 為 NBA。
然后再敲擊 esc 鍵和 q 鍵,返回之前的頁面,再敲擊 e 和 p 鍵修改 Path。和上面一樣,敲擊 a 增加 Path 的內容,這時我們將 Path 修改為 s,如圖 11-21 所示。
圖 11-21 編輯頁面
再敲擊 esc 和 q 鍵返回,這時我們可以看到最上面的請求鏈接變成了 https://www.baidu.com/s?wd=NBA,訪問這個頁面,可以看到百度搜索 NBA 關鍵詞的搜索結果,如圖 11-22 所示。
圖 11-22 請求詳情
敲擊 a 保存修改,敲擊 r 重新發起修改后的請求,即可看到上方請求方式前面多了一個回旋箭頭,這說明重新執行了修改后的請求。這時我們再觀察響應體內容,即可看到搜索 NBA 的頁面結果的源代碼,如圖 11-23 所示。
圖 11-23 響應結果
以上內容便是 mitmproxy 的簡單用法。利用 mitmproxy,我們可以觀察到手機上的所有請求,還可以對請求進行修改并重新發起。
Fiddler、Charles 也有這個功能,而且它們的圖形界面操作更加方便。那么 mitmproxy 的優勢何在?
mitmproxy 的強大之處體現在它的另一個工具 mitmdump,有了它我們可以直接對接 Python 對請求進行處理。下面我們來看看 mitmdump 的用法。
6. MitmDump 的使用
mitmdump 是 mitmproxy 的命令行接口,同時還可以對接 Python 對請求進行處理,這是相比 Fiddler、Charles 等工具更加方便的地方。有了它我們可以不用手動截獲和分析 HTTP 請求和響應,只需寫好請求和響應的處理邏輯即可。它還可以實現數據的解析、存儲等工作,這些過程都可以通過 Python 實現。
實例引入
我們可以使用命令啟動 mitmproxy,并把截獲的數據保存到文件中,命令如下所示:
mitmdump -w outfile
其中 outfile 的名稱任意,截獲的數據都會被保存到此文件中。
還可以指定一個腳本來處理截獲的數據,使用 – s 參數即可:
mitmdump -s script.py
這里指定了當前處理腳本為 script.py,它需要放置在當前命令執行的目錄下。
我們可以在腳本里寫入如下的代碼:
def request(flow): flow.request.headers['User-Agent'] = 'MitmProxy' print(flow.request.headers)
我們定義了一個 request() 方法,參數為 flow,它其實是一個 HTTPFlow 對象,通過 request 屬性即可獲取到當前請求對象。然后打印輸出了請求的請求頭,將請求頭的 User-Agent 修改成了 MitmProxy。
運行之后我們在手機端訪問 http://httpbin.org/get,就可以看到有如下情況發生。
手機端的頁面顯示如圖 11-24 所示。
圖 11-24 手機端頁面
PC 端控制臺輸出如圖 11-25 所示。
圖 11-25 PC 端控制臺
手機端返回結果的 Headers 實際上就是請求的 Headers,User-Agent 被修改成了 mitmproxy。PC 端控制臺輸出了修改后的 Headers 內容,其 User-Agent 的內容正是 mitmproxy。
所以,通過這三行代碼我們就可以完成對請求的改寫。print() 方法輸出結果可以呈現在 PC 端控制臺上,可以方便地進行調試。
日志輸出
mitmdump 提供了專門的日志輸出功能,可以設定不同級別以不同顏色輸出結果。我們把腳本修改成如下內容:
from mitmproxy import ctx def request(flow): flow.request.headers['User-Agent'] = 'MitmProxy' ctx.log.info(str(flow.request.headers)) ctx.log.warn(str(flow.request.headers)) ctx.log.error(str(flow.request.headers))
這里調用了 ctx 模塊,它有一個 log 功能,調用不同的輸出方法就可以輸出不同顏色的結果,以方便我們做調試。例如,info() 方法輸出的內容是白色的,warn() 方法輸出的內容是黃色的,error() 方法輸出的內容是紅色的。運行結果如圖 11-26 所示。
圖 11-26 運行結果
不同的顏色對應不同級別的輸出,我們可以將不同的結果合理劃分級別輸出,以更直觀方便地查看調試信息。
Request
最開始我們實現了 request() 方法并且對 Headers 進行了修改。下面我們來看看 Request 還有哪些常用的功能。我們先用一個實例來感受一下。
from mitmproxy import ctx def request(flow): request = flow.request info = ctx.log.info info(request.url) info(str(request.headers)) info(str(request.cookies)) info(request.host) info(request.method) info(str(request.port)) info(request.scheme)
我們修改腳本,然后在手機上打開百度,即可看到 PC 端控制臺輸出了一系列的請求,在這里我們找到第一個請求。控制臺打印輸出了 Request 的一些常見屬性,如 URL、Headers、Cookies、Host、Method、Scheme 等。輸出結果如圖 11-27 所示。
圖 11-27 輸出結果
結果中分別輸出了請求鏈接、請求頭、請求 Cookies、請求 Host、請求方法、請求端口、請求協議這些內容。
同時我們還可以對任意屬性進行修改,就像最初修改 Headers 一樣,直接賦值即可。例如,這里將請求的 URL 修改一下,腳本修改如下所示:
def request(flow): url = 'https://httpbin.org/get' flow.request.url = url
手機端得到如下結果,如圖 11-28 所示。
圖 11-28 手機端頁面
比較有意思的是,瀏覽器最上方還是呈現百度的 URL,但是頁面已經變成了 httpbin.org 的頁面了。另外,Cookies 明顯還是百度的 Cookies。我們只是用簡單的腳本就成功把請求修改為其他的站點。通過這種方式修改和偽造請求就變得輕而易舉。
通過這個實例我們知道,有時候 URL 雖然是正確的,但是內容并非是正確的。我們需要進一步提高自己的安全防范意識。
Request 還有很多屬性,在此不再一一列舉。更多屬性可以參考:http://docs.mitmproxy.org/en/latest/scripting/api.html。
只要我們了解了基本用法,會很容易地獲取和修改 Reqeust 的任意內容,比如可以用修改 Cookies、添加代理等方式來規避反爬。
Response
對于爬蟲來說,我們更加關心的其實是響應的內容,因為 Response Body 才是爬取的結果。對于響應來說,mitmdump 也提供了對應的處理接口,就是 response() 方法。下面我們用一個實例感受一下。
from mitmproxy import ctx def response(flow): response = flow.response info = ctx.log.info info(str(response.status_code)) info(str(response.headers)) info(str(response.cookies)) info(str(response.text))
將腳本修改為如上內容,然后手機訪問:http://httpbin.org/get。
這里打印輸出了響應的 status_code、headers、cookies、text 這幾個屬性,其中最主要的 text 屬性就是網頁的源代碼。
PC 端控制臺輸出如圖 11-29 所示。
圖 11-29 PC 端控制臺
控制臺輸出了響應的狀態碼、響應頭、Cookies、響應體這幾部分內容。
我們可以通過 response() 方法獲取每個請求的響應內容。接下來再進行響應的信息提取和存儲,我們就可以成功完成爬取了。
以上是Python3爬蟲利器mitmproxy的功能是什么的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。