溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python3爬蟲利器mitmproxy的功能是什么

發(fā)布時(shí)間:2020-08-05 11:44:22 來源:億速云 閱讀:827 作者:小新 欄目:編程語言

這篇文章主要介紹Python3爬蟲利器mitmproxy的功能是什么,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

mitmproxy 的使用

mitmproxy 是一個(gè)支持 HTTP 和 HTTPS 的抓包程序,有類似 Fiddler、Charles 的功能,只不過它是一個(gè)控制臺(tái)的形式操作。

mitmproxy 還有兩個(gè)關(guān)聯(lián)組件。一個(gè)是 mitmdump,它是 mitmproxy 的命令行接口,利用它我們可以對(duì)接 Python 腳本,用 Python 實(shí)現(xiàn)監(jiān)聽后的處理。另一個(gè)是 mitmweb,它是一個(gè) Web 程序,通過它我們可以清楚觀察 mitmproxy 捕獲的請(qǐng)求。

下面我們來了解它們的用法。

1. 準(zhǔn)備工作

請(qǐng)確保已經(jīng)正確安裝好了 mitmproxy,并且手機(jī)和 PC 處于同一個(gè)局域網(wǎng)下,同時(shí)配置好了 mitmproxy 的 CA 證書,具體的配置可以參考第 1 章的說明。

2. mitmproxy 的功能

mitmproxy 有如下幾項(xiàng)功能。

·攔截 HTTP 和 HTTPS 請(qǐng)求和響應(yīng)

·保存 HTTP 會(huì)話并進(jìn)行分析

·模擬客戶端發(fā)起請(qǐng)求,模擬服務(wù)端返回響應(yīng)

·利用反向代理將流量轉(zhuǎn)發(fā)給指定的服務(wù)器

·支持 Mac 和 Linux 上的透明代理

·利用 Python 對(duì) HTTP 請(qǐng)求和響應(yīng)進(jìn)行實(shí)時(shí)處理

3. 抓包原理

和 Charles 一樣,mitmproxy 運(yùn)行于自己的 PC 上,mitmproxy 會(huì)在 PC 的 8080 端口運(yùn)行,然后開啟一個(gè)代理服務(wù),這個(gè)服務(wù)實(shí)際上是一個(gè) HTTP/HTTPS 的代理。

手機(jī)和 PC 在同一個(gè)局域網(wǎng)內(nèi),設(shè)置代理為 mitmproxy 的代理地址,這樣手機(jī)在訪問互聯(lián)網(wǎng)的時(shí)候流量數(shù)據(jù)包就會(huì)流經(jīng) mitmproxy,mitmproxy 再去轉(zhuǎn)發(fā)這些數(shù)據(jù)包到真實(shí)的服務(wù)器,服務(wù)器返回?cái)?shù)據(jù)包時(shí)再由 mitmproxy 轉(zhuǎn)發(fā)回手機(jī),這樣 mitmproxy 就相當(dāng)于起了中間人的作用,抓取到所有 Request 和 Response,另外這個(gè)過程還可以對(duì)接 mitmdump,抓取到的 Request 和 Response 的具體內(nèi)容都可以直接用 Python 來處理,比如得到 Response 之后我們可以直接進(jìn)行解析,然后存入數(shù)據(jù)庫,這樣就完成了數(shù)據(jù)的解析和存儲(chǔ)過程。

4. 設(shè)置代理

首先,我們需要運(yùn)行 mitmproxy,命令如下所示:

啟動(dòng) mitmproxy 的命令如下:

mitmproxy

運(yùn)行之后會(huì)在 8080 端口上運(yùn)行一個(gè)代理服務(wù),如圖 11-12 所示:

Python3爬蟲利器mitmproxy的功能是什么

圖 11-12 mitmproxy 運(yùn)行結(jié)果

右下角會(huì)出現(xiàn)當(dāng)前正在監(jiān)聽的端口。

或者啟動(dòng) mitmdump,它也會(huì)監(jiān)聽 8080 端口,命令如下所示:

mitmdump

運(yùn)行結(jié)果如圖 11-13 所示。

Python3爬蟲利器mitmproxy的功能是什么

圖 11-13 MitmDump 運(yùn)行結(jié)果

將手機(jī)和 PC 連接在同一局域網(wǎng)下,設(shè)置代理為當(dāng)前代理。首先看看 PC 的當(dāng)前局域網(wǎng) IP。

Windows 上的命令如下所示:

ipconfig

Linux 和 Mac 上的命令如下所示:

ifconfig

輸出結(jié)果如圖 11-14 所示:

Python3爬蟲利器mitmproxy的功能是什么

圖 11-14 查看局域網(wǎng) IP

一般類似 10.*.*.* 或 172.16.*.* 或 192.168.1.* 這樣的 IP 就是當(dāng)前 PC 的局域網(wǎng) IP,例如此圖中 PC 的 IP 為 192.168.1.28,手機(jī)代理設(shè)置類似如圖 11-15 所示。

Python3爬蟲利器mitmproxy的功能是什么

圖 11-15 代理設(shè)置

這樣我們就配置好了 mitmproxy 的的代理。

5. mitmproxy 的使用

確保 mitmproxy 正常運(yùn)行,并且手機(jī)和 PC 處于同一個(gè)局域網(wǎng)內(nèi),設(shè)置了 mitmproxy 的代理,具體的配置方法可以參考第 1 章。

運(yùn)行 mitmproxy,命令如下所示:

mitmproxy

設(shè)置成功之后,我們只需要在手機(jī)瀏覽器上訪問任意的網(wǎng)頁或?yàn)g覽任意的 App 即可。例如在手機(jī)上打開百度,mitmproxy 頁面便會(huì)呈現(xiàn)出手機(jī)上的所有請(qǐng)求,如圖 11-16 所示。

Python3爬蟲利器mitmproxy的功能是什么

圖 11-16 所有請(qǐng)求

這就相當(dāng)于之前我們在瀏覽器開發(fā)者工具監(jiān)聽到的瀏覽器請(qǐng)求,在這里我們借助于 mitmproxy 完成。Charles 完全也可以做到。

這里是剛才手機(jī)打開百度頁面時(shí)的所有請(qǐng)求列表,左下角顯示的 2/38 代表一共發(fā)生了 38 個(gè)請(qǐng)求,當(dāng)前箭頭所指的是第二個(gè)請(qǐng)求。

每個(gè)請(qǐng)求開頭都有一個(gè) GET 或 POST,這是各個(gè)請(qǐng)求的請(qǐng)求方式。緊接的是請(qǐng)求的 URL。第二行開頭的數(shù)字就是請(qǐng)求對(duì)應(yīng)的響應(yīng)狀態(tài)碼,后面是響應(yīng)內(nèi)容的類型,如 text/html 代表網(wǎng)頁文檔、image/gif 代表圖片。再往后是響應(yīng)體的大小和響應(yīng)的時(shí)間。

當(dāng)前呈現(xiàn)了所有請(qǐng)求和響應(yīng)的概覽,我們可以通過這個(gè)頁面觀察到所有的請(qǐng)求。

如果想查看某個(gè)請(qǐng)求的詳情,我們可以敲擊回車,進(jìn)入請(qǐng)求的詳情頁面,如圖 11-17 所示。

Python3爬蟲利器mitmproxy的功能是什么

圖 11-17 詳情頁面

可以看到 Headers 的詳細(xì)信息,如 Host、Cookies、User-Agent 等。

最上方是一個(gè) Request、Response、Detail 的列表,當(dāng)前處在 Request 這個(gè)選項(xiàng)上。這時(shí)我們再點(diǎn)擊 TAB 鍵,即可查看這個(gè)請(qǐng)求對(duì)應(yīng)的響應(yīng)詳情,如圖 11-18 所示。

Python3爬蟲利器mitmproxy的功能是什么

圖 11-18 響應(yīng)詳情

最上面是響應(yīng)頭的信息,下拉之后我們可以看到響應(yīng)體的信息。針對(duì)當(dāng)前請(qǐng)求,響應(yīng)體就是網(wǎng)頁的源代碼。

這時(shí)再敲擊 TAB 鍵,切換到最后一個(gè)選項(xiàng)卡 Detail,即可看到當(dāng)前請(qǐng)求的詳細(xì)信息,如服務(wù)器的 IP 和端口、HTTP 協(xié)議版本、客戶端的 IP 和端口等,如圖 11-19 所示。

Python3爬蟲利器mitmproxy的功能是什么

圖 11-19 詳細(xì)信息

mitmproxy 還提供了命令行式的編輯功能,我們可以在此頁面中重新編輯請(qǐng)求。敲擊 e 鍵即可進(jìn)入編輯功能,這時(shí)它會(huì)詢問你要編輯哪部分內(nèi)容,如 Cookies、Query、URL 等,每個(gè)選項(xiàng)的第一個(gè)字母會(huì)高亮顯示。敲擊要編輯內(nèi)容名稱的首字母即可進(jìn)入該內(nèi)容的編輯頁面,如敲擊 m 即可編輯請(qǐng)求的方式,敲擊 q 即可修改 GET 請(qǐng)求參數(shù) Query。

這時(shí)我們敲擊 q,進(jìn)入到編輯 Query 的頁面。由于沒有任何參數(shù),我們可以敲擊 a 來增加一行,然后就可以輸入?yún)?shù)對(duì)應(yīng)的 Key 和 Value,如圖 11-20 所示。

Python3爬蟲利器mitmproxy的功能是什么

圖 11-20 編輯頁面

這里我們輸入 Key 為 wd,Value 為 NBA。

然后再敲擊 esc 鍵和 q 鍵,返回之前的頁面,再敲擊 e 和 p 鍵修改 Path。和上面一樣,敲擊 a 增加 Path 的內(nèi)容,這時(shí)我們將 Path 修改為 s,如圖 11-21 所示。

Python3爬蟲利器mitmproxy的功能是什么

圖 11-21 編輯頁面

再敲擊 esc 和 q 鍵返回,這時(shí)我們可以看到最上面的請(qǐng)求鏈接變成了 https://www.baidu.com/s?wd=NBA,訪問這個(gè)頁面,可以看到百度搜索 NBA 關(guān)鍵詞的搜索結(jié)果,如圖 11-22 所示。

Python3爬蟲利器mitmproxy的功能是什么

圖 11-22 請(qǐng)求詳情

敲擊 a 保存修改,敲擊 r 重新發(fā)起修改后的請(qǐng)求,即可看到上方請(qǐng)求方式前面多了一個(gè)回旋箭頭,這說明重新執(zhí)行了修改后的請(qǐng)求。這時(shí)我們再觀察響應(yīng)體內(nèi)容,即可看到搜索 NBA 的頁面結(jié)果的源代碼,如圖 11-23 所示。

Python3爬蟲利器mitmproxy的功能是什么

圖 11-23 響應(yīng)結(jié)果

以上內(nèi)容便是 mitmproxy 的簡單用法。利用 mitmproxy,我們可以觀察到手機(jī)上的所有請(qǐng)求,還可以對(duì)請(qǐng)求進(jìn)行修改并重新發(fā)起。

Fiddler、Charles 也有這個(gè)功能,而且它們的圖形界面操作更加方便。那么 mitmproxy 的優(yōu)勢何在?

mitmproxy 的強(qiáng)大之處體現(xiàn)在它的另一個(gè)工具 mitmdump,有了它我們可以直接對(duì)接 Python 對(duì)請(qǐng)求進(jìn)行處理。下面我們來看看 mitmdump 的用法。

6. MitmDump 的使用

mitmdump 是 mitmproxy 的命令行接口,同時(shí)還可以對(duì)接 Python 對(duì)請(qǐng)求進(jìn)行處理,這是相比 Fiddler、Charles 等工具更加方便的地方。有了它我們可以不用手動(dòng)截獲和分析 HTTP 請(qǐng)求和響應(yīng),只需寫好請(qǐng)求和響應(yīng)的處理邏輯即可。它還可以實(shí)現(xiàn)數(shù)據(jù)的解析、存儲(chǔ)等工作,這些過程都可以通過 Python 實(shí)現(xiàn)。

實(shí)例引入

我們可以使用命令啟動(dòng) mitmproxy,并把截獲的數(shù)據(jù)保存到文件中,命令如下所示:

mitmdump -w outfile

其中 outfile 的名稱任意,截獲的數(shù)據(jù)都會(huì)被保存到此文件中。

還可以指定一個(gè)腳本來處理截獲的數(shù)據(jù),使用 – s 參數(shù)即可:

mitmdump -s script.py

這里指定了當(dāng)前處理腳本為 script.py,它需要放置在當(dāng)前命令執(zhí)行的目錄下。

我們可以在腳本里寫入如下的代碼:

def request(flow):
    flow.request.headers['User-Agent'] = 'MitmProxy'
    print(flow.request.headers)

我們定義了一個(gè) request() 方法,參數(shù)為 flow,它其實(shí)是一個(gè) HTTPFlow 對(duì)象,通過 request 屬性即可獲取到當(dāng)前請(qǐng)求對(duì)象。然后打印輸出了請(qǐng)求的請(qǐng)求頭,將請(qǐng)求頭的 User-Agent 修改成了 MitmProxy。

運(yùn)行之后我們在手機(jī)端訪問 http://httpbin.org/get,就可以看到有如下情況發(fā)生。

手機(jī)端的頁面顯示如圖 11-24 所示。

Python3爬蟲利器mitmproxy的功能是什么

圖 11-24 手機(jī)端頁面

PC 端控制臺(tái)輸出如圖 11-25 所示。

Python3爬蟲利器mitmproxy的功能是什么

圖 11-25 PC 端控制臺(tái)

手機(jī)端返回結(jié)果的 Headers 實(shí)際上就是請(qǐng)求的 Headers,User-Agent 被修改成了 mitmproxy。PC 端控制臺(tái)輸出了修改后的 Headers 內(nèi)容,其 User-Agent 的內(nèi)容正是 mitmproxy。

所以,通過這三行代碼我們就可以完成對(duì)請(qǐng)求的改寫。print() 方法輸出結(jié)果可以呈現(xiàn)在 PC 端控制臺(tái)上,可以方便地進(jìn)行調(diào)試。

日志輸出

mitmdump 提供了專門的日志輸出功能,可以設(shè)定不同級(jí)別以不同顏色輸出結(jié)果。我們把腳本修改成如下內(nèi)容:

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))

這里調(diào)用了 ctx 模塊,它有一個(gè) log 功能,調(diào)用不同的輸出方法就可以輸出不同顏色的結(jié)果,以方便我們做調(diào)試。例如,info() 方法輸出的內(nèi)容是白色的,warn() 方法輸出的內(nèi)容是黃色的,error() 方法輸出的內(nèi)容是紅色的。運(yùn)行結(jié)果如圖 11-26 所示。

Python3爬蟲利器mitmproxy的功能是什么

圖 11-26 運(yùn)行結(jié)果

不同的顏色對(duì)應(yīng)不同級(jí)別的輸出,我們可以將不同的結(jié)果合理劃分級(jí)別輸出,以更直觀方便地查看調(diào)試信息。

Request

最開始我們實(shí)現(xiàn)了 request() 方法并且對(duì) Headers 進(jìn)行了修改。下面我們來看看 Request 還有哪些常用的功能。我們先用一個(gè)實(shí)例來感受一下。

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)

我們修改腳本,然后在手機(jī)上打開百度,即可看到 PC 端控制臺(tái)輸出了一系列的請(qǐng)求,在這里我們找到第一個(gè)請(qǐng)求??刂婆_(tái)打印輸出了 Request 的一些常見屬性,如 URL、Headers、Cookies、Host、Method、Scheme 等。輸出結(jié)果如圖 11-27 所示。

Python3爬蟲利器mitmproxy的功能是什么

圖 11-27 輸出結(jié)果

結(jié)果中分別輸出了請(qǐng)求鏈接、請(qǐng)求頭、請(qǐng)求 Cookies、請(qǐng)求 Host、請(qǐng)求方法、請(qǐng)求端口、請(qǐng)求協(xié)議這些內(nèi)容。

同時(shí)我們還可以對(duì)任意屬性進(jìn)行修改,就像最初修改 Headers 一樣,直接賦值即可。例如,這里將請(qǐng)求的 URL 修改一下,腳本修改如下所示:

def request(flow):
    url = 'https://httpbin.org/get'
    flow.request.url = url

手機(jī)端得到如下結(jié)果,如圖 11-28 所示。

Python3爬蟲利器mitmproxy的功能是什么

圖 11-28 手機(jī)端頁面

比較有意思的是,瀏覽器最上方還是呈現(xiàn)百度的 URL,但是頁面已經(jīng)變成了 httpbin.org 的頁面了。另外,Cookies 明顯還是百度的 Cookies。我們只是用簡單的腳本就成功把請(qǐng)求修改為其他的站點(diǎn)。通過這種方式修改和偽造請(qǐng)求就變得輕而易舉。

通過這個(gè)實(shí)例我們知道,有時(shí)候 URL 雖然是正確的,但是內(nèi)容并非是正確的。我們需要進(jìn)一步提高自己的安全防范意識(shí)。

Request 還有很多屬性,在此不再一一列舉。更多屬性可以參考:http://docs.mitmproxy.org/en/latest/scripting/api.html。

只要我們了解了基本用法,會(huì)很容易地獲取和修改 Reqeust 的任意內(nèi)容,比如可以用修改 Cookies、添加代理等方式來規(guī)避反爬。

Response

對(duì)于爬蟲來說,我們更加關(guān)心的其實(shí)是響應(yīng)的內(nèi)容,因?yàn)?Response Body 才是爬取的結(jié)果。對(duì)于響應(yīng)來說,mitmdump 也提供了對(duì)應(yīng)的處理接口,就是 response() 方法。下面我們用一個(gè)實(shí)例感受一下。

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))

將腳本修改為如上內(nèi)容,然后手機(jī)訪問:http://httpbin.org/get。

這里打印輸出了響應(yīng)的 status_code、headers、cookies、text 這幾個(gè)屬性,其中最主要的 text 屬性就是網(wǎng)頁的源代碼。

PC 端控制臺(tái)輸出如圖 11-29 所示。

Python3爬蟲利器mitmproxy的功能是什么

圖 11-29 PC 端控制臺(tái)

控制臺(tái)輸出了響應(yīng)的狀態(tài)碼、響應(yīng)頭、Cookies、響應(yīng)體這幾部分內(nèi)容。

我們可以通過 response() 方法獲取每個(gè)請(qǐng)求的響應(yīng)內(nèi)容。接下來再進(jìn)行響應(yīng)的信息提取和存儲(chǔ),我們就可以成功完成爬取了。

以上是Python3爬蟲利器mitmproxy的功能是什么的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI