Python脚本爬虫App抓包配置全攻略:从零搭建移动端数据采集环境
目录导读
- 核心概念与准备 – 什么是App抓包?为什么需要配置?
- 抓包工具选择与安装 – Charles/mitmproxy/Fiddler哪家强?
- HTTPS证书配置 – 避免加密流量“白抓”的关键步骤
- Python脚本集成 – 如何让爬虫自动接管抓包数据
- 模拟器与真机配置 – Android/iOS双平台实战
- 常见问题与问答 – 证书不信任、流量缺失、性能优化
- 实战案例 – 抓取某购物App商品列表的完整流程
核心概念与准备
Q:为什么爬虫需要抓包?
App的数据通常通过HTTP/HTTPS协议传输,但开发者常采用加密、签名或反爬机制,抓包能让你像调试工具一样“看见”App发送的每个请求参数、Header和响应数据,从而逆向构造爬虫逻辑。

核心三要素:
- 代理服务器:充当客户端与服务器的中间人(如Charles监听8888端口)
- SSL解包:安装自签名证书,解密HTTPS流量(否则只能看到密文)
- 流量重定向:让App的请求强制经过你的代理
必备条件:
- 一台电脑(Mac/Win/Linux均可)
- 一部手机或模拟器(Android/iOS)
- 同一局域网(手机代理指向电脑IP)
抓包工具选择与安装
| 工具 | 优势 | 适用场景 | 下载命令 |
|---|---|---|---|
| mitmproxy | 纯Python生态,完美配合代码 | 自动化深度定制 | pip install mitmproxy |
| Charles | 图形化界面易上手 | 快速分析+手动调试 | 官网下载(30天试用) |
| Fiddler | Windows友好,脚本扩展丰富 | 遗留系统兼容 | 官网免费版 |
推荐组合:
- 初学者用Charles观察流量结构
- 进阶直接用mitmproxy-python脚本实现全自动抓取(如
mitmdump -s script.py)
HTTPS证书配置(最易踩坑环节)
1 电脑端证书安装
以mitmproxy为例:
# 启动mitmproxy mitmproxy -p 8888 # 浏览器访问 mitm.it 下载对应系统证书 # Windows双击安装 → 选择“受信任的根证书颁发机构”
2 Android设备证书配置
注意:Android 7+ 默认不信任用户证书,需root或adb安装
- 非root方法:使用Magisk模块“Move Certificates”
- 快速方案:用低版本Android模拟器(如Android 6)跳过证书锁定
- 实测可靠:在开发者选项→证书安装导入mitmproxy生成的
.pem文件
3 iOS证书配置
- Safari访问
mitm.it→安装描述文件→通用→关于本机→证书信任设置→启用
Q:安装了证书为何还是抓不到HTTPS?
检查:1) 是否安装了电脑端/手机端双证书 2) App是否使用了SSL Pinning(需额外Hook技术,如Xposed+JustTrustMe)
Python脚本集成(让爬虫自动接管数据)
1 mitmproxy脚本基础架构
# demo.py
from mitmproxy import http
def request(flow: http.HTTPFlow):
# 拦截所有请求
if "api.example.com" in flow.request.pretty_host:
print(f"捕获请求: {flow.request.url}")
# 可修改请求头、添加参数
def response(flow: http.HTTPFlow):
# 解析响应JSON
if "product_list" in flow.request.path:
data = flow.response.get_text()
# 保存到本地或直接入库
with open("products.json", "a") as f:
f.write(data + "\n")
运行:mitmdump -s demo.py -p 8888
2 多线程与性能优化
from mitmproxy import ctx
import threading
class Crawler:
def __init__(self):
self.lock = threading.Lock()
self.counter = 0
def response(self, flow):
with self.lock:
self.counter += 1
if self.counter % 100 == 0:
ctx.log.info(f"已处理{self.counter}条数据")
3 实战:自动翻页抓取
许多App的分页参数藏在请求体中,脚本需动态解析:
def request(flow):
if "/page" in flow.request.url:
# 提取已抓取页码,自动增加
curr_page = int(flow.request.query["page"])
flow.request.query["page"] = str(curr_page + 1)
模拟器与真机配置双平台
Android模拟器(推荐夜神/雷电)
- 设置代理:WLAN长按→修改网络→手动代理→输入电脑IP+端口8888
- 安装证书:浏览器访问
mitm.it下载→设置→安全→从SD卡安装 - 验证:访问
httpbin.org/get应返回代理服务器信息
iOS真机配置(非越狱)
- 设置→无线局域网→当前网络→HTTP代理→手动
- 注意:iOS 14+需在Safari输入
mitm.it后手动在“设置→通用→VPN与设备管理”安装
Q:真机抓包速度极慢怎么办?
可能是CPU解码导致的瓶颈,建议:
- 关闭不必要的流量拦截(如图片、视频)
- 使用
--set block_global=false参数避免捕获非目标域名
常见问题与问答
Q1:抓包时App提示“网络异常”或“SSL错误”
→ 原因:证书未正确安装,或App内置了SSL Pinning。
→ 解决:尝试使用Riru-justtrustme(Magisk模块)或Frida脚本绕过。
Q2:每次启动都要手动配置代理太麻烦?
→ 方案:用ADB命令自动设置模拟器代理:
adb shell settings put global http_proxy 192.168.1.100:8888
Q3:Python爬虫抓包后如何解决签名验证?
→ 逆向分析App的签名算法(通常为MD5+盐值),在Python中复现:
import hashlib sign = hashlib.md5((params + secret_key).encode()).hexdigest()
Q4:抓包数据乱码或格式混乱
→ 检查响应编码:flow.response.encoding = 'utf-8'或使用zlib.decompress()解压。
实战案例:抓取某电商App商品列表
目标:通过移动端接口获取首页推荐商品(免登录)
步骤:
- 启动mitmdump并加载脚本:
mitmdump -s shop.py - 模拟器打开App,观察终端输出
- 发现关键接口:
https://api.xxx.com/v2/homepage/recommend(Headers含x-auth: token) - 在脚本中添加:从响应中解析
code=200时的data.items,并保存为CSV - 循环翻页:修改请求体中的
page字段(需先逆向找出翻页逻辑)
最终脚本片段:
def response(flow):
if "recommend" in flow.request.url:
json_data = json.loads(flow.response.get_text())
if json_data["code"] == 200:
for item in json_data["data"]["items"]:
writer.writerow([item["id"], item["title"], item["price"]])
配置Python爬虫App抓包的核心在于三步:工具选型→证书渗透→脚本自动化,其中证书安装的坑最多(尤其Android),而mitmproxy的Python接口能让你完全掌控流量,抓包只是桥梁,真正的价值在于从海量请求中提取出稳定的数据管道,建议先在模拟器上验证流程,再迁移到真机环境,同时准备好处理签名校验、限频等反爬手段。