当前位置: 首页 > news >正文

App 爬虫抓包与数据采集实战——mitmproxy + Fiddler

很多数据只在 App 上有,网页版要么没有要么做了反爬。这一篇讲怎么抓 App 的包、怎么解析接口、怎么用 Python 自动化采集。

一、抓包原理

App 和服务器通信走 HTTP/HTTPS 协议,抓包就是在中间截获请求和响应。

App → 抓包工具 → 服务器 ↓ 记录请求数据(URL、参数、请求头、响应)

两种抓包方式:

方式工具适用场景难度
代理抓包Fiddler、Charles简单,新手首选
中间人代理mitmproxy可编程、可自动化⭐⭐

二、Fiddler 抓包——快速上手

1. 设置 Fiddler

  1. 打开 Fiddler → Tools → Options → HTTPS
  2. 勾选Capture HTTPS CONNECTs
  3. 勾选Decrypt HTTPS traffic
  4. 弹出证书安装提示,点 Yes

2. 手机连接代理

  1. 手机和电脑连同一个 Wi-Fi
  2. 手机 Wi-Fi 设置 → 代理 → 手动
  3. 填入电脑的 IP 和 Fiddler 端口(默认 8888)
  4. 手机浏览器访问http://电脑IP:8888,下载安装 Fiddler 根证书

3. 开始抓包

手机上操作目标 App,Fiddler 里就能看到所有 HTTP 请求。关注这几个信息:

URL → 接口地址 Method → GET/POST Headers → Cookie、Token、User-Agent Body → 请求参数 Response → 返回数据(JSON 格式)

找接口的技巧:在 Fiddler 里按接口域名筛选,排除广告 SDK、统计 SDK 等无关请求。

三、mitmproxy——Python 自动化抓包

Fiddler 适合手动分析,mitmproxy 适合写脚本自动化处理。

1. 安装

pipinstallmitmproxy

启动:

mitmweb# 启动带 Web 界面的代理,默认端口 8080

浏览器打开http://127.0.0.1:8081就能看到实时请求。

2. 手机配置

和 Fiddler 一样,手机 Wi-Fi 代理设为电脑 IP:8080,访问mitm.it安装证书。

3. 编写拦截脚本

# capture.pyfrommitmproxyimporthttpimportjsondefrequest(flow:http.HTTPFlow):"""拦截请求"""url=flow.request.pretty_url# 只关注目标接口if"api.target.com"inurl:print(f"[请求]{flow.request.method}{url}")print(f"[请求头]{dict(flow.request.headers)}")ifflow.request.method=="POST":print(f"[请求体]{flow.request.text}")defresponse(flow:http.HTTPFlow):"""拦截响应"""url=flow.request.pretty_urlif"api.target.com"inurl:print(f"[响应]{url}")data=flow.response.textprint(f"[响应数据]{data[:500]}")# 只打印前 500 字符

运行:

mitmweb-scapture.py

4. 自动保存数据到文件

# save_data.pyfrommitmproxyimporthttpimportjsonimportosfromdatetimeimportdatetimeclassAppDataCollector:def__init__(self):self.data_file=f"app_data_{datetime.now().strftime('%Y%m%d_%H%M%S')}.jsonl"self.results=[]defresponse(self,flow:http.HTTPFlow):url=flow.request.pretty_url# 过滤目标接口if"/api/product/list"inurl:try:data=json.loads(flow.response.text)# 提取商品列表products=data.get("data",{}).get("list",[])forpinproducts:item={"id":p.get("id"),"name":p.get("name"),"price":p.get("price"),"sales":p.get("sales"),"crawl_time":datetime.now().isoformat()}self.results.append(item)# 实时写入文件withopen(self.data_file,"a",encoding="utf-8")asf:f.write(json.dumps(item,ensure_ascii=False)+"\n")print(f"已采集{len(products)}条商品数据")exceptExceptionase:print(f"解析失败:{e}")addons=[AppDataCollector()]
mitmweb-ssave_data.py

手机滑动 App 商品列表,数据自动保存到本地。

四、App 爬虫的常见问题

1. 证书校验(SSL Pinning)

很多金融类、支付类 App 做了证书绑定,装了代理证书也无法抓包。

解决方案:

# 方案一:用 Android 模拟器 + Xposed 框架# 安装 JustTrustMe 模块,绕过证书校验# 方案二:用 Frida 动态注入(更通用)pipinstallfrida-tools frida-U-fcom.target.app-lbypass_ssl.js
// bypass_ssl.js(Frida 脚本示例)Java.perform(function(){vartrustManager=Java.use('javax.net.ssl.X509TrustManager');// 覆盖证书校验方法,直接通过trustManager.checkServerTrusted.implementation=function(){// 什么也不做,跳过校验};});

2. 请求签名

App 的接口参数往往经过加密或签名,直接模拟请求会失败。

# 分析签名生成逻辑# 常见情况:把所有参数按字典序排序 + 拼接密钥 + MD5defgenerate_sign(params,secret_key="xxx"):"""模拟 App 的签名算法"""sorted_keys=sorted(params.keys())raw="&".join([f"{k}={params[k]}"forkinsorted_keys])raw+=secret_keyreturnhashlib.md5(raw.encode()).hexdigest()

更省事的做法:用 mitmproxy 拿到完整的请求,直接用 Python 的 requests 复现。

3. 请求头补全

App 发起的请求通常有固定特征,缺了某个头就会返回 403。

headers={"User-Agent":"Mozilla/5.0 (Linux; Android 13; Xiaomi 13) AppleWebKit/537.36","Content-Type":"application/json; charset=utf-8","Accept-Encoding":"gzip","x-app-version":"3.2.1","x-device-id":"sn-xxxxxxxxxxxx","Authorization":"Bearer xxxxxx"# Token 一般在登录后获取}

4. 参数加密(抓包也看不到原文)

现在的 App 很多把参数放在加密的 body 里,抓包看到的是乱码。

# 逆向分析加密算法(用反编译工具)# jadx-gui 反编译 APK,搜索 "encrypt"、"sign"、"MD5" 等关键词# 或者用更简单的方法:hook 加密函数# Frida 脚本 hook 加密方法,在运行时输出明文参数

五、App 爬虫全流程示例

以抓取某电商 App 商品列表为例:

# 步骤一:用 mitmproxy 分析接口# 找到商品列表接口 /api/v2/product/list# 参数:page、page_size、category_id# 签名算法:md5(page + page_size + category_id + secret)# 步骤二:在 Python 中复现importrequestsimporthashlibimporttimeclassAppSpider:def__init__(self,token=None):self.session=requests.Session()self.session.headers.update({"User-Agent":"Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36","x-app-version":"4.5.0","Authorization":f"Bearer{token}"iftokenelse"",})defgenerate_sign(self,params):"""复现 App 的签名算法"""secret="your_secret_key"# 通过反编译 APK 得到sorted_keys=sorted(params.keys())raw="&".join([f"{k}={params[k]}"forkinsorted_keys])+secretreturnhashlib.md5(raw.encode()).hexdigest()defget_products(self,category_id,page=1):url="https://api.target.com/v2/product/list"params={"page":page,"page_size":20,"category_id":category_id,"timestamp":int(time.time()),}params["sign"]=self.generate_sign(params)resp=self.session.get(url,params=params)ifresp.status_code==200:returnresp.json()else:print(f"请求失败:{resp.status_code}{resp.text}")returnNonedefcrawl_all(self,category_id,max_pages=50):"""翻页采集所有商品"""all_products=[]forpageinrange(1,max_pages+1):data=self.get_products(category_id,page)ifnotdata:breakproducts=data.get("data",{}).get("list",[])ifnotproducts:print(f"第{page}页没有数据,采集结束")breakall_products.extend(products)print(f"第{page}页,已采集{len(all_products)}条")time.sleep(1)# 不要太快returnall_products# 使用spider=AppSpider(token="your_token")results=spider.crawl_all(category_id="手机")

六、App 爬虫 vs Web 爬虫

对比项Web 爬虫App 爬虫
数据格式HTML 解析麻烦通常是 JSON,解析简单
反爬方式IP 封禁、验证码签名校验、SSL Pinning
接口变更频率相对稳定版本更新可能改动大
数据完整度可能缺少 App 专有数据数据更全(如推荐算法数据)
上手难度简单,requests 就行需要抓包和逆向

建议:优先考虑 Web 爬虫,Web 拿不到或太难拿了再考虑 App 爬虫。

总结

App 爬虫的核心流程就四步:

装代理证书 → 抓包分析接口 → 识破签名算法 → 用代码复现请求

遇到 SSL Pinning 就上 Frida,遇到加密就用反编译工具分析 APK。但也要注意——App 爬虫比 Web 爬虫更靠近灰色地带,采集数据时注意合规性,不要采集用户隐私信息。


💡 觉得有用的话,点赞 + 关注【张老师技术栈】吧!每周更新 Java/Python/爬虫 实战干货,不让你白来。

http://www.gsyq.cn/news/1596040.html

相关文章:

  • 碧蓝航线Live2D资源提取:从游戏到创意作品的桥梁探索
  • 仙工智能:“机器人大脑第一股”上市,“卖大脑”却靠“卖身体”,错位模式能走多远?
  • Java RSA数字签名实战:从原理到API安全与软件验签应用
  • 市场耐磨的撕碎机刀片销售厂家有哪些
  • 10月开源硬件项目精选:ESP32-C6与STM32H743应用解析
  • MyBatis-Plus 高级用法实战——分页、条件构造器、乐观锁、逻辑删除
  • Sunshine游戏串流:如何构建跨平台自托管游戏中心
  • 小白 程序员 6 个低门槛 AI 副业,零基础也能月入 2w+
  • 如何快速解决联发科设备变砖问题:终极修复方案
  • Scrapy-Redis 分布式爬虫实战——从单机到集群
  • Apache Dubbo:企业级微服务框架的标杆
  • 360互联网安全大会聚焦智能体威胁,“中国版Mythos”能否破网络安全困局?
  • LinkSwift:九大网盘直链解析工具,开启高速下载新体验
  • Windows PDF处理终极方案:Poppler预编译包完整指南
  • 设计数据密集型应用第2版:2025-2026出版新书的《人月神话》引用(4)
  • 夏天总疲惫乏力、容易累、爱出汗的人,常喝这杯茶,养出元气满满好状态~
  • 终极无广告体验:SpotifyPremium桌面版完整配置指南
  • ts3380,G3000,ix6780,MG3640,ix6700,ix6800,G5080,TS8380,ts8220报错5B00,P07,E08,1700,5b02废墨垫清零,亲测可用
  • 鸿蒙语音识别的 Flutter ↔ ArkTS 完整调用链:权限申请、引擎生命周期与结果回传的时序问题
  • 进销存软件不一定贵,但要看这几点
  • 告别链接失效烦恼:百度网盘秒传脚本完全指南
  • 中医药现代化研究,国自然申请书怎么写才能中?
  • 一台高配置图形工作站带10人SolidWorks画图的实施方案是怎样的
  • 用你自己的签名,打你自己
  • 微信会话存档亿级数据处理:基于 RSA 混合解密与 Flink 的流式架构实战
  • C#工业相机开发从零到一:图像采集与显示的工程化实战
  • 从CTF实战解析SQL注入:绕过过滤与联合查询攻防
  • Python+Selenium自动化测试:Chrome Driver版本管理全流程实现
  • 天行健与优胜劣汰:两种文明范式的哲学比较及其现代启示
  • LSR包胶技术深度解析:金属包胶、塑料包胶到底怎么做?