日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

爬虫学习笔记(二十二)—— Mitmproxy

發(fā)布時(shí)間:2025/3/21 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬虫学习笔记(二十二)—— Mitmproxy 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一、簡(jiǎn)介和安裝
    • 1.1、概念和作用
    • 1.2、安裝
    • 1.3、工具介紹
  • 二、設(shè)置代理
    • 2.1、PC端設(shè)置代理
    • 2.2、PC端安裝證書(shū)
    • 2.3、移動(dòng)端設(shè)置代理
  • 三、 mitmdump
    • 3.1、插件使用
    • 3.2、常用事件
      • 3.2.1、request事件
      • 3.2.2、response事件
    • 3.3、下載圖片

一、簡(jiǎn)介和安裝

1.1、概念和作用

概念

Mitmproxy是一個(gè)免費(fèi)的開(kāi)源交互式的HTTPS代理。MITM即中間人攻擊(Man-in-the-Middle Attack)。

作用

  • 代理的作用,轉(zhuǎn)發(fā)請(qǐng)求,保障服務(wù)端與客戶(hù)端的通信
  • 查看,記錄,修改數(shù)據(jù),引發(fā)服務(wù)端或客戶(hù)端的特定行為
  • 補(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界面,Fiddler、Charles僅支持GUI界面(Fiddler底部有個(gè)命令行工具叫做 QuickExec)


    1.2、安裝

    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í)行文件。


    1.3、工具介紹

    • mitmproxy:命令行界面,允許交互式檢查和修改http數(shù)據(jù)流,不支持windows
    • mitmweb: Web界面,用戶(hù)可以實(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


    二、設(shè)置代理

    2.1、PC端設(shè)置代理

    開(kāi)啟代理時(shí)需要把其他的代理都關(guān)掉

    開(kāi)啟代理

    注:這時(shí)我們剛開(kāi)啟代理,還未安裝證書(shū),如果訪(fǎng)問(wèn)其他網(wǎng)址會(huì)出現(xiàn)報(bào)錯(cuò),如下圖所示:


    2.2、PC端安裝證書(shū)

    在代理狀態(tài)下,訪(fǎng)問(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)鏈接)

    根據(jù)自己的系統(tǒng)環(huán)境下載對(duì)應(yīng)的證書(shū)安裝

    后面點(diǎn)擊下載的證書(shū)按步驟導(dǎo)入就可以了


    2.3、移動(dòng)端設(shè)置代理

    以夜神模擬器為例(注意保證手機(jī)和電腦在同局域網(wǎng)下)

    設(shè)置完代理,打開(kāi)瀏覽器訪(fǎng)問(wèn)http://mitm.it/

    下載安裝證書(shū)

    三、 mitmdump

    官方文檔:https://docs.mitmproxy.org/stable/addons-overview/

    3.1、插件使用

  • 插件的本質(zhì)就是一個(gè)腳本文件,在Python中就是一個(gè)類(lèi)的實(shí)例對(duì)象。
  • 此處插件是Counter實(shí)例對(duì)象,request方法是一個(gè)事件
  • 對(duì)于request事件,它的參數(shù)是一個(gè)mitmproxy.http.HTTPFlow的對(duì)象。
  • 如:(官方文檔例子)

    """ Basic skeleton of a mitmproxy addon.Run as follows: mitmproxy -s anatomy.py """ from mitmproxy import ctxclass Counter:def __init__(self):self.num = 0def request(self, flow):self.num = self.num + 1ctx.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)宣布其提示。可以在交互式工具的事件日志中或mitmdump的控制臺(tái)中找到輸出。

    可以使用mitmdump -s ./anatomy.py運(yùn)行插件(anatomy.py是創(chuàng)建的文件名)。


    3.2、常用事件

    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. ? """

    3.2.1、request事件

    (注意:記得在代理狀態(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類(lèi)型的數(shù)據(jù),URL的鍵值參數(shù)print('url的鍵值參數(shù)',flow.request.query)#請(qǐng)求方法print('請(qǐng)求方法',flow.request.method)#請(qǐng)求類(lèi)型print('請(qǐng)求類(lèi)型',flow.request.scheme)#獲取請(qǐng)求內(nèi)容'''print('請(qǐng)求內(nèi)容',flow.request.get_text)print('請(qǐng)求內(nèi)容類(lè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'))

    3.2.2、response事件

    (注意:記得在代理狀態(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類(lèi)型print('返回內(nèi)容bytes類(lèi)型',flow.response.content)#取得響應(yīng)的文本print('應(yīng)的文本',flow.response.get_text)#修改響應(yīng) 的文本flow.response.set_text('你的響應(yīng)內(nèi)容被修改了!')

    3.3、下載圖片

    (注意:記得在代理狀態(tài)下執(zhí)行,命令:mitmdump -q -s ./xxx.py 加-q會(huì)使打印更清晰可觀)

    import os index = 0def response(flow):global indexprint('===========下載==============')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

    總結(jié)

    以上是生活随笔為你收集整理的爬虫学习笔记(二十二)—— Mitmproxy的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。