Python 爬虫抓包进阶:Charles+mitmproxy 中间人代理抓 HTTPS 数据包实战
·
前言
HTTPS 采用 SSL/TLS 加密传输,常规 Fiddler、浏览器开发者工具只能查看前端请求,无法直接拿到 APP / 小程序加密接口原始报文;mitmproxy 实现中间人劫持 SSL 证书解密 HTTPS 流量,自动捕获请求头、加密参数、Cookie、接口密文,是 APP 逆向、小程序爬虫抓包核心工具。本章落地 mitmdump 脚本二次开发、证书部署、移动端 / 模拟器抓包、请求实时篡改、自动保存抓包数据,对接前面 JS 逆向、接口加密爬虫工程。
本文所需依赖官方文档超链接:
一、HTTPS 中间人抓包原理
1.1 加密与劫持逻辑
- 客户端与目标服务器建立 SSL 握手,正常场景证书由 CA 机构签发;
- 配置手机 / 模拟器代理指向 mitmproxy 服务,客户端访问 HTTPS 域名;
- mitmproxy 下发自签根证书,伪装目标域名证书完成握手,双向解密收发报文;
- 明文请求经过中间人解析后再转发至真实服务器,实现全量 HTTPS 明文抓包。
1.2 适用场景
APP 爬虫抓包、微信小程序接口捕获、动态接口加密参数实时采集、请求参数篡改调试。
二、环境安装
bash
运行
# 安装mitmproxy套件(mitmproxy/mitmdump/mitmweb)
pip install mitmproxy==10.3.0
- mitmweb:带网页可视化抓包面板;
- mitmdump:无界面脚本化运行,生产环境首选。
三、证书安装关键步骤
- 启动任意一次 mitmdump,目录
~/.mitmproxy/生成全套证书; - 把
mitmproxy-ca-cert.pem发送到手机,安卓安装证书至用户证书,iOS 描述文件安装并开启信任; - 手机 WIFI 代理填写本机 IP+mitm 默认端口 8080。
四、模块 1:基础抓包脚本(保存全部请求到本地 JSON)
新建capture_all.py
python
运行
from mitmproxy import http
import json
import os
SAVE_DIR = "./mitm_capture/"
os.makedirs(SAVE_DIR,exist_ok=True)
def response(flow: http.HTTPFlow):
"""请求响应结束触发,存储接口数据"""
# 过滤非目标域名,按需修改关键词
target_key = "api.goods.com"
if target_key not in flow.request.pretty_url:
return
data = {
"url": flow.request.pretty_url,
"method": flow.request.method,
"req_header": dict(flow.request.headers),
"req_body": flow.request.text,
"resp_code": flow.response.status_code,
"resp_body": flow.response.text
}
# 文件名去特殊字符
filename = flow.request.pretty_url.split("/")[-1].replace("?","_") + ".json"
with open(os.path.join(SAVE_DIR,filename),"w",encoding="utf-8") as f:
json.dump(data,f,ensure_ascii=False,indent=2)
print(f"已捕获接口:{flow.request.pretty_url}")
启动抓包命令:
bash
运行
mitmdump -s capture_all.py -p 8080
五、模块 2:中间人动态篡改请求参数(逆向调试神器)
修改请求入参、新增 sign 签名、替换 Cookie,绕过前端参数校验:
python
运行
from mitmproxy import http
def request(flow: http.HTTPFlow):
# 匹配需要篡改的接口
if "api/getprice" in flow.request.pretty_url:
# GET参数修改
if flow.request.method == "GET":
flow.request.query["page"] = "1"
flow.request.query["timestamp"] = "1750000000"
# POST JSON参数篡改
elif flow.request.method == "POST":
import json
req_json = json.loads(flow.request.text)
req_json["userid"] = "999999"
flow.request.text = json.dumps(req_json)
# 自定义添加请求头Cookie
flow.request.headers["Cookie"] = "sessionid=mitm_test_ck123"
六、模块 3:实时推送抓包接口至 Redis(对接分布式爬虫)
捕获接口 URL 与加密参数实时入 Redis 任务队列,爬虫自动消费:
python
运行
import redis
from mitmproxy import http
rds = redis.Redis(host="127.0.0.1",port=6379,db=0,decode_responses=True)
TASK_KEY = "dist:crawl:task_queue"
def response(flow: http.HTTPFlow):
if "api/goods/list" in flow.request.pretty_url:
url = flow.request.pretty_url
rds.lpush(TASK_KEY,url)
print(f"抓包推送任务至Redis:{url}")
配合前文 Redis 分布式爬虫,APP 上新数据自动生成抓取任务。
七、mitmweb 可视化调试(新手调试优选)
启动命令:
bash
运行
mitmweb -p 8080
自动打开浏览器可视化面板,实时筛选域名、查看请求报文、断点篡改参数。
八、模拟器抓包配置(雷电 / 夜神模拟器)
- WIFI 代理设置:IP 为电脑局域网 IP,端口 8080;
- 模拟器内安装 mitmproxy 证书;
- 启动 APP 自动抓取全部 HTTPS 接口。
九、常见异常与排错表
表格
| 故障 | 解决方案 |
|---|---|
| HTTPS 访问提示证书不安全 | 重装证书,iOS 开启证书全信任,安卓 13 + 需系统证书挂载 |
| 部分 APP 抓包直接无网络 | APP 启用 SSL Pinning 证书锁定,后续章节讲解证书绕过 |
| 抓不到小程序接口 | 微信自带 SSL 校验,配置系统级证书或 hook 绕过 |
| 端口占用 | -p 更换监听端口,如 mitmdump -s xx.py -p8888 |
十、结合逆向链路落地流程
- mitmproxy 抓包拿到加密接口 URL、参数、sign 生成规则;
- F12/JS 逆向定位前端加密函数,解混淆还原算法;
- Python 复刻 AES/RSA/MD5 签名,构造密文对接爬虫请求;
- 抓到新接口自动推送 Redis,分布式集群自动抓取。
十一、本章总结
mitmproxy 中间人抓包核心价值:解密 HTTPS 原始报文、实时篡改参数、自动捕获 APP / 小程序接口;调试阶段用 mitmweb 可视化,生产爬虫自动化用 mitmdump + 脚本落地,抓包数据落地本地 / Redis 实现爬虫任务自动化。后续拓展:SSL Pinning 绕过、frida+mitm 联动 APP 脱壳抓包、抓包数据自动解析提取密钥与盐值。
更多推荐


所有评论(0)