说明:本学习笔记主要参考:Python3网络爬虫开发实战一书
常用的抓包软件有WireShark、Charles、Fildder、mitmproxy、AnyProxy等。
原理:通过设置代理的方式将手机处于抓包软件的监听之下,获取APP运行的过程中发生的所有请求及响应,如果请求的URL及参数有规律,用程序模拟爬取即可。如果没有,可以利用mitmdump对接Python脚本直接处理Response,还可以利用APPium 进行自动化爬取控制。
一、Charles
下载地址:https://www.charlesproxy.com/download/
证书配置:SSL证书是为了通过HTTPS协议,Charles客户端和手机都要同时转有SSL证书。
mac
Help-ssl proxying - install charles root certificate
选择始终信任。
设置手机证书配置
先开启Charles代理,proxy-proxy settings
将手机同电脑连在同一个局域网下面。
查看本机IP地址,终端输入:ifconfig
安卓手机如何设置代理参考:https://blog.csdn.net/songzi1228/article/details/89950109
设置好代理后,charles界面会有提示,点击allow即可。
下面就是在手机上安装ssl证书
我的手机是一加7pro,在手机浏览器上打开chls.pro/ssl下载即可,不过直接安装不了。
可以从设置-安全与锁屏-加密与凭据-从存储设备中安装-左上角点击进去oneplus 7 pro-搜索charles,按提示安装即可。
下面试着监听下京东APP的信息。
第一个清空列表信息,第二个启动监听,红色状态是:监听中
如果遇到出来的response乱码,可以设置
proxy-ssl proxy settings - add
Host:填*表示所有网站都抓
Port:443
点击OK,就不再乱码了。
打开手机京东APP,搜索华为,点开9xpro ,获取评论信息
成功获取到。
overview;里面显示了请求的接口URL,响应状态status code , 请求方式method
contents:里面显示的请求和响应的详细信息
这个按钮还可以对URL链接进行修改,重发请求,这样就能知道哪些参数字段是无关紧要的。
但是APP接口往往会带有迷药,并不能直接找到这里面的规律,可以利用Charles和mitmproxy直接对接python脚本实现实时处理抓取到的response
二、mitmproxy
两个关联组件:
mitmdump:命令行接口,利用它对接python脚本。
mitmweb:web程序,观察mitmproxy捕获的请求
mitmproxy配置安装 mac 版本
终端输入:brew install mitmproxy
终端输入:mitmdump 即可产生CA证书
进入用户目录,查看证书
cd ~
cd .mitmproxy
open ./
即可查看CA证书
证书说明:
mitmproxy-ca-cert.cer:与mitmproxy-ca-cert.pem相同,只是改变了后缀,适用部分andriod平台
mitmproxy-ca-cert.p12:PKCS12格式的证书,适用Windows 平台
mitmproxy-ca-cert.pem:使用大多数非Windows平台
mitmproxy-ca.p12:
mitmproxy-ca.pem:PEM格式的证书
mitmproxy-dhparam.pem:
mac端双击mitmproxy-ca-cert.pem进行配置即可,形式参考前面证书配置过程。
然后在把mitmproxy-ca-cert.cer证书发送到我的手机端进行配置,形式参考前面配置过程(我的手机是安卓版本),如果是苹果择选择mitmproxy-ca.pem。
mitmproxy 功能说明:
拦截HTTP和HTTPS的请求和响应
保存HTTP回话并进行分析
模拟客户端发送请求,模拟服务器返回响应
利用反向代理将流量转发给指定的服务器
支持mac和Linux上的透明代理
利用python对HTTP请求和响应进行实时处理
mitmproxy抓包原理
mitmproxy 会在pc端的8080端口运行,然后开启一个代理服务,手机和 PC 在同一个局域网内,设置代理为 mitmproxy 的代理地址,这样手机在访问互联网的时候流量数据包就会流经 mitmproxy, mitmproxy 再去转发这些数据包到真实的服务器,服务器返回数据 包时再由 mitmproxy 转发回手机,这样 mitmproxy 就相当于起了中间人的作用,抓取到所有 Request 和 Response ,另外这个过程还可以对接 mitmdump ,抓取到的 Request 和 Response 的具体内容都可以 直接用 Python 来处理,比如得到 Response 之后我们可以直接进行解析,然后存入数据库,这样就完 成了数据的解析和存储过程。
设置代理
终端运行:mitmproxy
会在8080端口运行一个代理服务,如下图
接下来把手机和PC链接在同一局域网下面,设置方法参考前面Charles设置方式。
mitmproxy使用
前面设置好证书后,mitmproxy就已经开始工作了
210/210代表一共发升了210个请求,当前箭头所指的是第210个请求。按回车即可进入请求的详情页面。
每个请求开头都有一个GET或POST , 这是各个请求的请求方式。 紧接的是请求的 URL。 第二行 开头的数字就是请求对应的响应状态码, 后面是响应内容的类型 , 如 text/html 代表网页文档、 image/gif 代表图片。 再往后是响应体的大小和响应的时间
在列表界面,按回车进入详情界面。
在详情界面,按q,返回列表界面。
在列表界面,按G跳到最新一个请求。
在列表界面,按g跳到第一个请求。
在列表界面,按d删除当前选中的请求,按D恢复刚才删除的请求。
三、mitmdump的使用
mitmdurnp 是 mitmproxy 的命令行接口, 同时还可以对接 Python 对请求进行处理,有了它我们可以不用手动截获利分析 HTTP 请求和响应,只需要写好请求和响应的处理逻辑即可。它还可以实现数据的解析、存储等士作, 这些过程都可以通过 Python 实现。
mitmdump -w outfile 截获数据并保存在outfile中
mitmdump -s scripy.py 使用-s参数指定一个脚本来处理获取的数据
from mitmproxy import ctx def request(flow): # flow.request.headers['User-Agent'] = 'MitmProxy' # print(flow.request.headers) # ctx.log.info(str(flow.request.headers)) # info方法输出内容为白色 # ctx.log.warn(str(flow.request.headers)) # warn方法输出内容为黄色 # ctx.log.error(str(flow.request.headers)) # error方法输出内容为红色 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(request.scheme) info(str(request.port))
四、Appium
Appi um 是一个跨平台移 动端向动化测试 工具,可以非常便捷地为 iOS 和 Android 平台创建自动化测试用例。 它可以模拟 App 内部的各种操作 , 如点击、滑动、 文本输入等, 只要我们手工操 作的 动作 Appium 都可以完成。 在前面我们了解 过 Selenium , 它是一个网页端 的向动化测试工 具。 Appium 实际上继承了 Se lenium, Appi um 也是利用 W巳bDriver 来实现 App 的向动化测试。 对 iOS 设备来说, Appium 使用 UIAutomation 来实现驱动 。 对于 Android 来说, 它使用 UiAutomator 和 Selendroid 来实现 驱动 。
下载地址:https://github.com/appium/appium-desktop/releases/tag/v1.13.0
安装对应电脑版本即可
打开软件,如图:
Android 开发环境配置
下载和配置 Android SDK ,推荐直接安装 Android Studio。地址:https://developer.android.com/studio/index.html?hl=zh-cn
添加环境变量,参考:https://blog.csdn.net/jlminghui/article/details/81204352
启动APP
两种方式:内置驱动器来打开APP,另外一种是利用python程序
启动Appium,点击start server,即可看到欢迎页面
用手机通过数据线和电脑相连接,同时打开USB调试功能(我手机是一加7pro,打开方式参考:https://www.jb51.net/shouji/674653.html)
打开后,电脑终端输入:adb devices -l
如出现上面结果,择说明PC已经正确链接手机了。
接下来用点击Appium上右上角的放大镜按钮
会出现一个配置界面
启动APP时要配置desired capabilities参数,分别为
点击启动后,会出现下面页面
点击下APP中登陆按钮,中间的APP source部分就会有高亮部分,点击高亮部分代码,右边的selected element 下面的tap send keysclear 即可使用