有些数据需要在手机应用中才能查看,没有网页版,所以学习移动端的爬虫是有必要的。
手机系统分为安卓和苹果两大系统,本次讲解主要以安卓手机为例
有安卓手机的可以使用手机,没有的可以使用模拟器,本次以夜神模拟器为例
必备电脑软件Fiddler:一款抓包工具
在fiddler中需要更改监听位置,打开fiddler点击工具->选项
点击HTTPS,将请求来源改为……from all processes
在模拟器的浏览器中输入主机IP:8888
回显示以下内容
点击下载fiddleRoot 证书
进行认证安装
打开雷电模拟器,在网络设置中找到wifi设置
长按已经连接的wifi名称,点击修改网络
注意:若是使用安卓手机,需要先获取root权限(手机有变成板砖的风险,建议使用配置为安卓7版本的手机)
代理选择手动
代理服务器主机名填写本机的ip,不知道本机ip的可以cmd输入ipconfig查看自己的ip,代理服务器端口填写为:8888(此为fiddler的端口号)。点击保存。
在对应用程序进行浏览时,需要打开fiddler软件,监听应用程序。
此外可以使用mitmproxy中间人代理攻击进行爬取 ,以下是简要介绍:
用于中间人攻击的代理首先会向正常的代理一样转发请求,保障服务端与客户端的通信,其次,会实时的查记录其截获的数据,或篡改数据,引发服务端或客户端的特定行为。
不同于fiddler或wireshark等抓包工具,mitmproxy不仅可以截获请求帮助开发者查看、分析,更可以通过自定义脚本进行二次开发,举例来说,利用fiddler可以过滤出浏览器对某个特定url请求,并查看分析其数据,但实现不了高度定制化的需求,类似与截获对浏览器对该url的请求,将返回内容置空,并将真实的返回内容存到某个数据库,出现异常数会发送邮件通知。而对于mitmproxy这样的需求可以通过载入自定义脚本轻松实现。
安装流程:
在pytharm的终端中输入以下内容:
pip install mitmproxy
可以通过输入以下内容在测试是否安装成功:
mitmweb --version
安装完成后,进入手机设置,将wifi 的代理服务器端口号改为8080(此为mitmproxy的端口号)
之后在终端中测试,查看是否能拦截手机端的网路请求 ,若不能进行拦截,则搜索mitmproxp.exe文件的位置,将其添加到系统环境变量中。
要启动mitmproxy用mitmproxy,mitmdump\mitmweb这三个命令中的任意一个即可,这三个命令一致,且都可以加载自定义脚本,唯一区别就是交互页面不同。
mitmproxy命令启动后,会提供一个命令行界面,用户可以实时看到发送的请求,并通过命令过滤请求,查看请求数据
mitmweb命令启动后,会提供一个web界面,用户可以实时看到发生的请求,并通过GUI交互来过滤请求,查看请求数据
mitmdump命令启动后,没有界面,程序默默运行,所以mitmdump无法提供过滤请求,查看数据功能,只能结合自定义脚本,默默工作。
脚本编写:
脚本编写需要遵循mitmproxy规定的套路
其一:
编写py文件,提供mitmproxy加载,文件中定义了若干函数,这些函数实现了某些mitmproxy提供的事件,mitmproxy会在某些事件发生时调用对应的函数,形如:
- import mitmproxy.http
- from mitmproxy import ctx
-
- request_num = 0
- response_num = 0
-
- #(Called when) 来自客户端的 HTTP 请求被成功完整读取。
- def request(flow: mitmproxy.http.HTTPFlow):
- global request_num
- request_num = request_num + 1
- ctx.log.info(f"监测到{request_num}个请求")
-
- #(Called when) 来自客户端的 HTTP 请求被成功完整读取。
- def response(flow: mitmproxy.http.HTTPFlow):
- global response_num
- response_num = response_num + 1
- ctx.log.info(f"监测到{response_num}个应答")
-
- # 在cmd任意位置输入以下命令
-
- mitmweb -s addons.py
其二 编写一个py文件供mitmproxy加载,文件定义了变量addons。addons是个数组,每个元素是一个类实例,这些类有若干方法,这些方法实现了某些mitmproxy提供的事件,mitmproxy会在某些事件发生时调用对应的方法,这些类,成为一个个addon,比如一个叫Counter的addon:
- import mitmproxy.http
- from mitmproxy import ctx
-
-
- class Counter:
- def __init__(self):
- self.num = 0
-
- def request(self, flow: mitmproxy.http.HTTPFlow):
- self.num = self.num + 1
- ctx.log.info("We've seen %d flows" % self.num)
-
-
- addons = [
- Counter()
- ]
- 这里强烈建议使用第二种套路,直觉上就会感觉第二种套路更为先进,使用会更方便也更容易管理和拓展。况且这也是官方内置的一些 addon 的实现方式。
-
- 我们将上面第二种套路的示例代码存为 addons.py,再重新启动 mitmproxy: