Python爬虫学习笔记8:APP的爬取

说明:本学习笔记主要参考: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 keys\clear 即可使用

 

 

posted @ 2019-08-14 17:14  zheng1076  阅读(3256)  评论(0编辑  收藏  举报