Python抓包工具mitmproxy安装配置与脚本开发实战

Finn
Finn
发布时间:2026-10-13| 4人浏览过
原创

本文详细介绍开源抓包工具mitmproxy的安装、配置及高级用法。涵盖Windows与Android平台的证书信任配置,解析mitmproxy、mitmweb与mitmdump三大组件的区别。重点讲解如何利用mitmdump对接Python脚本,通过request和response钩子实现请求头修改、URL重定向及响应数据自动存储,助力开发者高效进行网络调试与爬虫开发。

mitmproxy功能与原理概述

一、介绍说明

mitmproxy是一款支持HTTP和HTTPS协议的抓包工具,功能类似Fiddler和Charles,但采用命令行界面进行操作。

该工具包含两个重要关联组件:mitmdump是其命令行接口,允许通过Python脚本对接实现监听后的数据处理;mitmweb则是Web界面程序,提供可视化的请求观察体验。

mitmproxy主要功能包括:

1、拦截HTTP和HTTPS请求与响应

2、保存HTTP会话记录并支持后续分析

3、模拟客户端发起请求,或模拟服务器端返回响应

4、利用反向代理机制将流量转发至指定服务器

5、支持Mac和Linux系统的透明代理模式

6、通过Python脚本对HTTP请求与响应进行实时处理

mitmproxy运行在本地PC的8080端口,开启代理服务,该服务本质是一个HTTP/HTTPS代理服务器。

当手机与PC处于同一局域网时,将手机代理设置为mitmproxy的地址,手机访问互联网的流量数据包将流经mitmproxy。mitmproxy将数据包转发至真实服务器,并将服务器返回的数据包再转发回手机,从而起到中间人作用,捕获所有request和response。此外,该过程可对接mitmproxy,利用Python直接处理抓取的request和response内容,例如解析response并存入数据库,完成数据解析与存储流程。

安装配置与证书信任设置

二、安装以及配置

pip install mitmproxy

若安装失败出现timeout报错,可尝试多次重试或添加--timeout参数指定超时秒数。

pip --timeout 10000 install mitmproxy

注意:Windows平台不支持mitmproxy的控制台界面,但可使用mitmdump和mitmweb。

这三个命令功能一致,均可加载自定义脚本,区别仅在于交互界面不同。

启动mitmproxy命令后,提供命令行界面,用户可实时查看发生的请求,并通过命令过滤请求、查看请求数据。

启动mitmweb命令后,提供Web界面,用户可实时查看发生的请求,并通过GUI交互过滤请求、查看请求数据。

启动mitmdump命令后,无界面显示,程序后台运行,因此无法提供过滤请求或查看数据的功能,需结合自定义脚本工作。

证书配置

运行mitmdump命令生成CA证书,在用户目录下的.mitmproxy目录中找到CA证书,如下图所示。

在Windows平台下安装证书

点击mitmproxy-ca.p12,出现导入证书引导页,如下图所示:

直接点击下一步,若无需设置密码,继续点击下一步。

接下来需选择证书存储区域,如下图所示。

选择第二个选项“将所有的证书都放入下列存储”,点击“浏览”按钮,选择证书存储位置为“受信任的根证书颁发机构”,点击“确定”,再点击“下一步”。

最后,若弹出安全警告,直接点击“是”按钮即可完成CA证书配置。

在Android平台下安装证书

在Android手机上,需将mitmproxy-ca-cert.pem文件发送至手机,点击证书会出现提示窗口。

若手机无法识别.pem文件,可将.cer文件复制到手机,点击安装证书。

输入证书名称(如mitmproxy),点击确定完成安装。

安卓手机还有一种安装证书的方法

命令行输入ipconfig查看本机IP,并输入mitmweb启动mitmproxy

可以看到


Web server listening at http://127.0.0.1:8081/
Proxy server listening at http://*:8080

因此可确定代理IP端口号为8080,在手机Wifi设置中手动代理,输入本机IP和端口号8080。此时,打开mitmproxy界面并操作手机,可查看手机请求信息:

在手机端打开http://mitm.it/,进入如下界面:(若未进入该界面,请检查手机端代理IP和端口号输入是否正确!)

选择第一个进行证书安装,网络不佳时页面可能无响应,多试几次即可进入证书安装界面。

成功安装证书后,前往 Settings > General > About > Certificate Trust Settings. 在“Enable full trust for root certificates”下,开启对mitmproxy证书的信任。

mitmdump脚本开发与实战应用

三、mitmdump的使用

mitmdump是mitmproxy的命令行接口,可对接Python处理请求,相比Fiddler和Charles更为便捷。无需手动截获和分析HTTP请求和响应,只需编写处理逻辑即可。它还能实现数据解析、存储等工作,均通过Python实现。

1、可使用命令启动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,即HTTP Flow对象,通过request属性获取当前请求对象。打印输出请求头,将User-Agent改为MitmProxy。运行后在手机端访问 http: //httpbin.org get 。

手机端返回结果的Headers即请求的Headers,User-Agent被修改为mitmproxy,PC控制台输出修改后Headers内容,其User-Agent内容正是mitmproxy。通过上述三行代码即可完成请求改写。

print()方法输出结果呈现在PC控制台,便于调试。

2、日志的输出

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()输出红色内容。

不同颜色对应不同级别输出,可将不同结果合理划分级别输出,更直观方便地查看调试信息。

3、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(请求链接)、请求头、请求cookies、请求host、请求方法、请求端口、请求协议等内容。

同时可对任意属性进行修改,如最初修改headers,直接赋值即可,例如修改请求URL,如下:‘


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

仅需简单脚本即可成功将请求修改为其他站点,通过这种方式修改和伪造请求变得容易。

此例表明,有时URL正确但内容非正确,需提高安全防范意识。

因此能轻松获取和修改request任意内容,如修改cookies、添加代理以规避反爬。

4、响应的使用

爬虫更关心响应内容,因response body是爬取结果。对于响应,mitmdump提供对应处理接口,即response()方法。


from mitmproxy import ctx 
def response(flow): 
response = flow.response 
info = ctx.log.info
inf(str(response.status_code))
info(str(response.headers)) 
info(str(response.cookies)) 
info(str(response .text)) 

打印输出响应状态码status_code、响应头headers、cookies、响应体text等属性,其中最重要的是text属性即网页源代码。

通过response()方法获取每个请求的响应内容,再进行响应信息提取和存储,即可完成数据爬取!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。