• 关于app爬虫的环境准备


    摘要

    有些数据需要在手机应用中才能查看,没有网页版,所以学习移动端的爬虫是有必要的。

    手机系统分为安卓和苹果两大系统,本次讲解主要以安卓手机为例

    有安卓手机的可以使用手机,没有的可以使用模拟器,本次以夜神模拟器为例

    必备电脑软件Fiddler:一款抓包工具

    fiddler设置

    在fiddler中需要更改监听位置,打开fiddler点击工具->选项

    点击HTTPS,将请求来源改为……from all processes

    获取认证

    在模拟器的浏览器中输入主机IP:8888

    回显示以下内容

    点击下载fiddleRoot 证书

    进行认证安装

    网络设置

    打开雷电模拟器,在网络设置中找到wifi设置

    长按已经连接的wifi名称,点击修改网络

    注意:若是使用安卓手机,需要先获取root权限(手机有变成板砖的风险,建议使用配置为安卓7版本的手机)

    代理选择手动

    代理服务器主机名填写本机的ip,不知道本机ip的可以cmd输入ipconfig查看自己的ip,代理服务器端口填写为:8888(此为fiddler的端口号)。点击保存。

    在对应用程序进行浏览时,需要打开fiddler软件,监听应用程序。

    mitmproxy(中间人代理攻击)

    此外可以使用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会在某些事件发生时调用对应的函数,形如:

    1. import mitmproxy.http
    2. from mitmproxy import ctx
    3. request_num = 0
    4. response_num = 0
    5. #(Called when) 来自客户端的 HTTP 请求被成功完整读取。
    6. def request(flow: mitmproxy.http.HTTPFlow):
    7. global request_num
    8. request_num = request_num + 1
    9. ctx.log.info(f"监测到{request_num}个请求")
    10. #(Called when) 来自客户端的 HTTP 请求被成功完整读取。
    11. def response(flow: mitmproxy.http.HTTPFlow):
    12. global response_num
    13. response_num = response_num + 1
    14. ctx.log.info(f"监测到{response_num}个应答")
    15. # 在cmd任意位置输入以下命令
    16. mitmweb -s addons.py

    其二 编写一个py文件供mitmproxy加载,文件定义了变量addons。addons是个数组,每个元素是一个类实例,这些类有若干方法,这些方法实现了某些mitmproxy提供的事件,mitmproxy会在某些事件发生时调用对应的方法,这些类,成为一个个addon,比如一个叫Counter的addon:

    1. import mitmproxy.http
    2. from mitmproxy import ctx
    3. class Counter:
    4. def __init__(self):
    5. self.num = 0
    6. def request(self, flow: mitmproxy.http.HTTPFlow):
    7. self.num = self.num + 1
    8. ctx.log.info("We've seen %d flows" % self.num)
    9. addons = [
    10. Counter()
    11. ]
    12. 这里强烈建议使用第二种套路,直觉上就会感觉第二种套路更为先进,使用会更方便也更容易管理和拓展。况且这也是官方内置的一些 addon 的实现方式。
    13. 我们将上面第二种套路的示例代码存为 addons.py,再重新启动 mitmproxy:

  • 相关阅读:
    每日一题day5-1636. 按照频率将数组升序排序
    一些碎碎念以及类和对象零碎知识点补充
    linux
    Ajax入门及jQuery库对Ajax的封装
    汇智知了堂携手西华大学共探鸿蒙生态发展之路
    HTML+CSS个人静态网页设计
    提高 Web 开发效率的10个VS Code扩展插件,你知道吗?
    【数字IC/FPGA】Verilog中的递归调用
    pytest文档81 - 如何管理Captured logging日志
    hbase和aerospike基础概念
  • 原文地址:https://blog.csdn.net/li2437948121/article/details/139812565