Mitmproxy是一個(gè)免費(fèi)的開(kāi)源交互式的HTTPS代理。MITM即中間人攻擊(Man-in-the-Middle Attack)。
代理的作用,轉(zhuǎn)發(fā)請(qǐng)求,保障服務(wù)端與客戶端的通信
查看,記錄,修改數(shù)據(jù),引發(fā)服務(wù)端或客戶端的特定行為
補(bǔ)充:Mitmproxy與Fiddler、Charles異同
相同點(diǎn): a、都是用來(lái)捕獲 HTTP,HTTPS 請(qǐng)求的(其他協(xié)議比如 TCP,UDP,IP,ICMP 等就用Wireshark)
b、抓包、斷點(diǎn)調(diào)試、請(qǐng)求替換、構(gòu)造請(qǐng)求、模擬弱網(wǎng)等
不同點(diǎn):a、Fiddler只能運(yùn)行在Windows系統(tǒng);Mitmproxy、Charles是跨平臺(tái)的,可運(yùn)行在Windows、Mac或Linux系統(tǒng)等。
b、Fiddler、Mitmproxy開(kāi)源免費(fèi)、Charles是收費(fèi)的(可破解)。
c、Mitmproxy支持命令行交互模式、GUI界面,F(xiàn)iddler、Charles僅支持GUI界面
(Fiddler底部有個(gè)命令行工具叫做 QuickExec)
pip install mitmproxy
或
pip install -i https://pypi.douban.com/simple mitmproxy
如果直接安裝的速度太慢了,可以在命令行中添加國(guó)內(nèi)的鏡像源加快速度,就是第二條命令。注意:python 版本不低于3.6
檢查是否安裝成功:命令行中輸入命令查看mitmdump --version
安裝成功后在Python安裝路徑Script路徑下可以找到 mitmdump.exe
、mitmproxy.exe
、mitmweb.exe
這三個(gè)可執(zhí)行文件。
mitmproxy
:命令行界面,允許交互式檢查和修改http數(shù)據(jù)流,不支持windows
mitmweb
: Web界面,用戶可以實(shí)時(shí)看到發(fā)生的請(qǐng)求,過(guò)濾請(qǐng)求,查看請(qǐng)求數(shù)據(jù)
mitmdump
: 一個(gè)命令行工具,沒(méi)有界面,不能交互,但是可以通過(guò)啟動(dòng)參數(shù)并結(jié)合自定義腳本進(jìn)行定制化功能的實(shí)現(xiàn),是我們運(yùn)行的環(huán)境
這三個(gè)命令功能一致,且都可以加載自定義腳本,唯一的區(qū)別是交互界面的不同;
mitmproxy,mitmweb主要用來(lái)做調(diào)試,部署項(xiàng)目時(shí)使用mitmdump。
開(kāi)啟代理時(shí)需要把其他的代理都關(guān)掉
注:這時(shí)我們剛開(kāi)啟代理,還未安裝證書(shū),如果訪問(wèn)其他網(wǎng)址會(huì)出現(xiàn)報(bào)錯(cuò),如下圖所示:
在代理狀態(tài)下,訪問(wèn)http://mitm.it/,PC端與移動(dòng)端操作相同。
(注意:設(shè)置完成后,瀏覽器打開(kāi)網(wǎng)頁(yè)發(fā)現(xiàn)都是未連接網(wǎng)絡(luò),需要先啟動(dòng)mitmweb.exe或者mitmdump.exe程序才能打開(kāi)鏈接)
后面點(diǎn)擊下載的證書(shū)按步驟導(dǎo)入就可以了
以夜神模擬器為例(注意保證手機(jī)和電腦在同局域網(wǎng)下)
設(shè)置完代理,打開(kāi)瀏覽器訪問(wèn)http://mitm.it/
官方文檔:https://docs.mitmproxy.org/stable/addons-overview/
Counter
實(shí)例對(duì)象,request
方法是一個(gè)事件request
事件,它的參數(shù)是一個(gè)mitmproxy.http.HTTPFlow
的對(duì)象。如:(官方文檔例子)
""" Basic skeleton of a mitmproxy addon. Run as follows: mitmproxy -s anatomy.py """ from mitmproxy import ctx class Counter: def __init__(self): self.num = 0 def request(self, flow): self.num = self.num + 1 ctx.log.info("We've seen %d flows" % self.num) addons = [ Counter() ]
上面是一個(gè)簡(jiǎn)單的插件,用于跟蹤我們已經(jīng)看到的流(或更具體的HTTP請(qǐng)求)數(shù)量。每次看到新的流量時(shí),它都會(huì)使用mitmproxy的內(nèi)部日志記錄機(jī)制來(lái)宣布其提示??梢栽诮换ナ焦ぞ叩氖录罩局谢騧itmdump的控制臺(tái)中找到輸出。
可以使用mitmdump -s ./anatomy.py
運(yùn)行插件(anatomy.py是創(chuàng)建的文件名)。
def request(self, flow: mitmproxy.http.HTTPFlow): """ The full HTTP request has been read. """ def response(self, flow: mitmproxy.http.HTTPFlow): """ The full HTTP response has been read. """
(注意:記得在代理狀態(tài)下執(zhí)行,命令:mitmdump -s ./xxx.py
)
from mitmproxy import http def request(flow:http.HTTPFlow): #注意函數(shù)名request不能寫(xiě)錯(cuò) #獲取請(qǐng)求頭信息 print('請(qǐng)求頭',flow.request.headers) #完整請(qǐng)求地址 print('請(qǐng)求url',flow.request.url) #域名 print('域名',flow.request.host) #請(qǐng)求路徑 url除域名之外的內(nèi)容 print('請(qǐng)求路徑',flow.request.path) #返回MultiDictView類型的數(shù)據(jù),URL的鍵值參數(shù) print('url的鍵值參數(shù)',flow.request.query) #請(qǐng)求方法 print('請(qǐng)求方法',flow.request.method) #請(qǐng)求類型 print('請(qǐng)求類型',flow.request.scheme) #獲取請(qǐng)求內(nèi)容 ''' print('請(qǐng)求內(nèi)容',flow.request.get_text) print('請(qǐng)求內(nèi)容類型',type(flow.request.get_text)) print('請(qǐng)求內(nèi)容bytes',flow.request.raw_content) print('請(qǐng)求內(nèi)容bytes',flow.request.get_content) ''' if 'https://www.baidu.com' in flow.request.url: #取得請(qǐng)求參數(shù)wd的值 print(flow.request.query.get('wd')) #取得所有請(qǐng)求參數(shù) print(list(flow.request.query.keys())) #修改請(qǐng)求參數(shù) flow.request.query.set_all('wd',['python']) #打印修改過(guò)后的參數(shù) print(flow.request.query.get('wd'))
(注意:記得在代理狀態(tài)下執(zhí)行,命令:mitmdump -s ./xxx.py
)
from mitmproxy import http def response(flow:http.HTTPFlow): #注意函數(shù)名response不能寫(xiě)錯(cuò) #狀態(tài)碼 print('狀態(tài)碼',flow.response.status_code) #返回內(nèi)容,已解碼 print('返回內(nèi)容',flow.response.text) #返回內(nèi)容, bytes類型 print('返回內(nèi)容bytes類型',flow.response.content) #取得響應(yīng)的文本 print('應(yīng)的文本',flow.response.get_text) #修改響應(yīng) 的文本 flow.response.set_text('你的響應(yīng)內(nèi)容被修改了!')
(注意:記得在代理狀態(tài)下執(zhí)行,命令:mitmdump -q -s ./xxx.py
加-q會(huì)使打印更清晰可觀)
import os index = 0 def response(flow): global index print('===========下載==============') print(flow.request.url) if flow.request.url[-3:] == 'jpg': dir = 'images' if not os.path.exists(dir): os.mkdir(dir) filename = dir+'/'+str(index)+'.jpg' with open(filename,'wb') as f: f.write(flow.response.get_content()) index+=1
以上就是python爬蟲(chóng)Mitmproxy安裝使用學(xué)習(xí)筆記的詳細(xì)內(nèi)容,更多關(guān)于python爬蟲(chóng)Mitmproxy的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
標(biāo)簽:銀川 安慶 三亞 湘西 烏魯木齊 呼倫貝爾 葫蘆島 呼倫貝爾
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python爬蟲(chóng)Mitmproxy安裝使用學(xué)習(xí)筆記》,本文關(guān)鍵詞 python,爬蟲(chóng),Mitmproxy,安裝,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。