mitmproxy 使用笔记
零、背景
我之前写过关于 charles 的使用笔记,为什么现在又要来写同类型的 mitmproxy 工具呢?下面我会娓娓道来他比 charles 多出的强大功能。
一、介绍
mitmproxy
是一个支持 HTTP 和 HTTPS 的抓包程序, 类似 Fiddle、Charles , 只不过它通过 CMD 的形式操作。
mitmproxy 还有两个关联组件:
一个是 mitmdump
,它是 mitmproxy 的命令行接口,利用它可以对接 Python 脚本,实现监听后的处理;
另一个是 mitmweb
,它是一个Web 程序,通过它以清楚地观察到 mitmproxy 捕获的请求。(跟 charles 差不多)
二、安装与配置
1、安装
(1)方法一:通过 pip 安装
pip3 install mitmproxy
会自动附带安装 mitmdump 和mitmweb。
(2)方法二:通过 brew 安装
brew install mitmproxy
2、配置
抓 HTTPS 需要配置 CA 证书。
(1) 电脑端(以 mac 为例)
运行起 mitmdump
命令。
然后找到 ~/.mitmproxy/mitmprox-ca-cert.pem
文件,双击,弹出 Keychain Access窗口,找到名为 mitmproxy 的 CA 证书,选择 Always Trust。
(2) 手机端(以 Android 为例)
同样将 ~/.mitmproxy/mitmprox-ca-cert.pem
文件发送给手机,在手机端打开后,填入证书名和点击确认按钮,如下图:
三、使用
下面的例子都以爬手机端为例,记得让手机和 PC 处于同一个局域网。
1、mitmproxy
1、命令行运行 mitmproxy
命令,会启动一个代理,默认监听 8080 端口。
2、手机设置里修改网络的代理设置:
3、现在就可以在命令行里查看经过的网络请求了
4、也可查看请求的具体详情:
5、还有编辑、重发功能
2、mitmweb
可以理解成界面版的 mitmproxy。
略。
3、mitmdump
上面介绍的功能其实 Fiddle、 Charles 也有,那么mitmproxy 的优势何在哪?
这就要提到 mitmdump
了,有了它我们可以直接对接 Python 脚本对请求进行处理。比如对数据的解析、存储、修改等。
示例 demo:
from mitmproxy import ctx
def request(flow):
# 获取
request = flow.request
# 修改
request.headers['User-Agent'] = 'MitmProxy'
# 日志输出
print(request.host)
ctx.log.info(request.host) # 颜色同上
ctx.log.warn(request.host) # 颜色:黄
ctx.log.error(request.host) # 颜色:红
def response(flow):
response = flow.response
ctx.log.info(str(response.status_code))
详细文档:https://mitmproxy.readthedocs.io/en/v2.0.2/mitmdump.html
4、拓展 —— httpbin.org
通过 mitmdump 对 request 做了修改,想要看修改后达成的效果,推荐客户端去访问这个网址:http://httpbin.org/get 即可知晓。
四、坑
1、爬的成功率不高,失败的会报错 :Cannot establish TLS with client……
会是 https 抓不到的问题?但我的电脑和手机端的 CA 证书都装了呀,费解。
解决方案:待解决
参考资料
《python 3 网络爬虫开发实践》