Python笔记:使用代理方式抓取App的数据操作案例

不想你离开。 提交于 2020-01-29 18:17:06

概述

  • App的爬取相比Web端爬取更加容易,反爬中能力没有那么强,而且响应数据大多都是JSON形式,解析更加简单。
  • 在APP端若想查看和分析内容那就需要借助抓包软件,常用的有:Filddler、Charles、mitmproxy、Appium等。
  • mitmproxy是一个支持HTTP/HTTPS协议的抓包程序,类似Fiddler、Charles的功能,只不过它通过控制台的形式操作。
  • Appium是移动端的自动化测试工具,类似于前面所说的Selenium、利用它可以驱动Android、iOS等设备完成自动化测试。

关于Charles

  • Charles是一个网络抓包工具,可以完成App的抓包分析,能够得到App运行过程中发生的所有网络请求和响应内容。
    • 官方网站:https://www.charlesproxy.com
    • 下载链接:https://www.charlesproxy.com/download
  • Charles主要功能:
    • 支持SSL代理,可以截取分析SSL的请求。
    • 支持流量控制。可以模拟慢速网络以及等待时间(latency)较长的请求。
    • 支持AJAX调试,可以自动将json或xml数据格式化,方便查看。
    • 支持AMF调试,可以将Flash Remoting 或 Flex Remoting信息格式化,方便查看。
    • 支持重发网络请求,方便后端调试。
    • 支持修改网络请求参数。
    • 支持网络请求的截获并动态修改。
    • 检查HTML,CSS和RSS内容是否符合W3C标准。

Charles的运行原理

  • 首先Charles运行在自己的PC上,Charles运行的时候会在PC的8888端口开启一个代理服务,这就是一个HTTP/HTTPS的代理。
  • 确保手机和PC在同一个局域网内,我们可以使用手机模拟器通过虚拟网络连接,也可使用手机真机和PC通过无线网连接。
  • 设置手机代理为Charles的代理地址,这样手机访问互联网的数据包就会流经Charles,Charles再转发这些数据包到真实的服务器,同理相反也是如此。

Charles 配置

  • 实现手机和电脑连接到同一个局域下,有两种:①、电脑通过网线连接。②、电脑直接使用wifi

    • 第①种配置较为复杂,需要电脑共享Wifi,手机在连接此wifi,具体可自行搜索方案,不同系统下的配置不同,Mac下需要在系统偏好设置/共享中设置
    • 第②种只需要保证手机连接上同一个wifi即可(保证在同一网段上)
  • 代理设置:基于实现了手机与电脑在同一局域网下进行Charles的代理配置

    • 首先查看电脑的打开Charles代理是否开启,具体操作是:Proxy -> Proxy Settings , 打开代理设置界面, 设置代理端口为:8888(默认端口).
    • 打开手机的网络配置,并设置使用代理配置即可

Charles 证书配置

  • 证书(SSL证书)配置是为了抓取HTTPS协议的信息包
  • 电脑端安装证书
    • 因各个系统安装方式不一样,此处举2个例子
    • Windows系统下:
      • 首先打开Charles,点击Help->SSL Proxying->Install Charles Root Certificate,即可进入证书安装界面。
      • 点击 “安装证书” 按钮,就会打开证书导入向导。
      • 点击 “下一步” 按钮,此时需要选择证书存储区域“将所有证书放入下列存储”->点击"浏览"->选择“受信任的证书颁发机构”->“确定”->“下一步”->完成。
    • Mac系统下:
      • 首先打开Charles,点击Help->SSL Proxying->Install Charles Root Certificate,即可进入证书安装界面。
      • 接下来,找到Charles的证书并双击,将 “信任” 设置为 “始终信任”即可 。
    • 配置完成后最好重启下Charles客户端软件!
  • 手机端安装证书:
    • 此处只举例iOS系统,不再使用安卓机做说明
    • 在网络配置和代理开启的情况下,若是你的手机是IOS系统,可以按照下面的操作进行证书配置。
    • 在手机浏览器上打开chls.pro/ssl后,便会打开证书安装页面,点击安装即可。
    • 点击“设置”->“通用”->“关于本机”->“证书信任设置”,设置开启即可。
    • 注意:最好使用系统自身的Safari浏览器
    • 注意:每个iOS版本系统安装证书方式可能不一样,可能会让先下载描述文件,然后在设置中查看描述文件里安装,之后再开启该证书,具体使用请自行摸索,比较简单
    • 注意:在Mac系统下的钥匙串中将该证书设置为始终信任

解决Charles中HTTPS代理的乱码问题

  • 首先要确保电脑端手机端都把证书安装好了
  • 然后在Proxy –> SSL Proxying Setting 中
    • 勾选 Enable SSL Proxying
    • 之后Add一个Host为*,Port为443的Location
    • 备注:这里的Host可为空,不填写即可
    • 点击OK, 重启下Charles就可大功告成了!!!

使用Charles进行抓包与后续的程序抓包

  • 手机运行App访问要爬取的平台信息,使用Charles抓包分析。
  • 知道了请求和响应的具体信息,通过分析得到请求的URL地址和参数的规律,直接使用程序模拟即可批量爬取。

关于mitmproxy

  • mitmproxy是一个支持HHTP/HTTPS协议的抓包程序,类似Fiddler、Charles的功能,只不过世它通过控制台的形式操作。
  • mitmproxy还有两个关联组件:
    • mitmdump:它是mitmproxy的命令行接口,利用它我们可以对接Python脚本,用Python实现监听后的处理。
    • mitmweb: 它是一个Web程序,通过它我们可以清楚观察mimproxy捕获的请求。

mitmproxy的功能:

  • 拦截HTTP和HTTPS请求和响应
  • 保存HTTP会话进行分析
  • 模拟客户端请求,模拟服务器返回响应
  • 利用反向代理将流量转发给指定的服务器
  • 支持Mac和Linux上的透明代理
  • 利用Python对HTTP请求和响应进行实时处理

mitmproxy的安装和配置

1 ) 安装

  • $pip3 install mitmproxy

2 ) 配置

  • 配置手机和PC处于同一局域网下(参考Charles的相关说明)
  • 打开手机的网络配置,并设置使用代理配置,端口监听 8080
  • 配置mitmproxy的CA证书
    • 对于mitmproxy来说,如果想要截获HTTPS请求,就需要设置CA证书,而mitmproxy安装后就会提供一套CA证书,只要客户信任了此证书即可
    • 首先运行启动mitmdump,就会在此命令下产生CA证书,我们可以从用户目录下的.mitmproxy目录下看到
      • 打开一终端(最好重新打开一个终端)启动mitmdump
        $ mitmdump
        Proxy server listening at http://*:8080
        
      • 切换到该目录查看证书
        $ cd ~/.mitmproxy/
        $ ls
        mitmproxy-ca-cert.cer	mitmproxy-ca-cert.pem	mitmproxy-ca.pem
        mitmproxy-ca-cert.p12	mitmproxy-ca.p12	mitmproxy-dhparam.pem
        # 在此处使用open . 命令 打开 访达 (mac 系统下)
        $ open .
        
      • 文件说明
        • mitmproxy-ca.pem PEM格式的证书私钥
        • mitmproxy-ca-cert.pem PEM格式证书,适用于大多数非Windows平台
        • mitmproxy-ca-cert.p12 PKCS12格式的证书,适用于大多数Windows平台
        • mitmproxy-ca.p12 PKCS12格式的证书,windows下安装的证书
        • mitmproxy-ca-cert.cer 与mitmproxy-ca-cert.pem相同(只是后缀名不同),适用于大部分Android平台
        • mitmproxy-dhparam.pem PEM格式的秘钥文件,用于增强SSL安全性
  • 在Mac系统下双击mitmproxy-ca-cert.pem即可弹出秘钥串管理页面,找到mitmproxy证书,打开设置选项,选择始终信任
  • mitmproxy-ca-cert.pem文件发送到iPhone手机上,点击安装就可以了(在iOS上通过AirDrop隔空投送共享过去即可)
  • 在iphone上安装CA证书,一些系统版本可能会先下载描述文件,在设置里找到对应的描述文件进行安装(Android手机直接复制文件点击安装即可)
  • 在IOS手机上,点击“设置” - > “通用” - > “关于本机” - > “证书信任设置”,设置开启 (注:不同系统版本使用不同的处理方式即可)

mitmproxy的使用

1 ) 运行

  • 运行 mitmproxy 命令就会打开一个监听窗口, 此窗口就会输出一个App请求中的信息 $mitmproxy
  • 注意:之前生成证书的mitmdump命令需要关闭,否则可能会冲突
  • 打开手机点击天猫,浏览商品,就可以看到各种GET/POST请求了

2 )各种操作指南

按键说明
q退出(相当于返回键,可一级一级返回)
d删除当前(黄色箭头)指向的链接
D恢复刚才删除的请求
G跳到最新一个请求
g跳到第一个请求
C清空控制台(C是大写)
i可输入需要拦截的文件或者域名(逗号需要用\来做转译,如:taobao.com)
a放行请求
A放行所有请求
?查看界面帮助信息
^ v上下箭头移动光标翻页
enter查看光标所在列的内容
tab分别查看 Request 和 Response 的详细信息
/搜索body里的内容
esc退出编辑
e进入编辑模式

mitmdump的使用

  • 使用命令启动mitmproxy,并将截获的数据保存到指定文件中,命令如下:$mitmdump -w outfile (这种不太推荐因为会太多, 要写最好拦截一些信息去写)
  • 使用指定命令截获的数据,如指定处理脚本文件为script.py. $mitmdump -s script.py
    # script.py 文件脚本
    from mitmproxy import ctx
    def request(flow):
        # 修改 Request 请求头 进行日志输出
        flow.request.headers['User-Agent'] = 'MitmProxy'
        info = ctx.log.info
        info(str(flow.request.headers))
        ctx.log.warn(str(flow.request.headers))
        ctx.log.error(str(flow.request.headers))
    
        info(flow.request.url)
        # info(str(flow.request.headers))
        # info(str(flow.request.cookies))
        # info(flow.request.host)
        # info(flow.request.method)
        # info(str(flow.request.port))
        # info(flow.request.scheme)
        print(flow.request.method,":",flow.request.url)
    
        # 其实在这里我们会编写程序进行信息爬取
        # TODO
    
    def response(flow):
        # 修改 Response 请求头 进行日志输出
        info = ctx.log.info
        # info(flow.response.url)
        # info(str(flow.response.headers))
        # info(str(flow.response.cookies))
        info(str(flow.response.status_code))
        # info(str(flow.response.text))
    
  • 打开手机,进入天猫,开始浏览,然后命令行窗口上就会疯狂输出信息,我们在script中编写的脚本代码同时会被调用
  • 或者我们使用更专业的方式来测试
    • 运行手机浏览器访问:http://httpbin.org/get 进行测试

使用自动化应用程序模拟手机操作并抓包的案例分析

1 )任务

  • 爬取京东商城的电脑商品并将数据存储到数据库中

2 )分析

  • 使用图形界面工具(Charles)或命令行工具(mitmproxy或mitmdump)进行接口数据分析

3 )代码实现

仅供参考

import json, pymongo
from mitmproxy import ctx

# 连接MongoDB数据库 jddb, 选择集合 shop
client = pymongo.MongoClient('localhost')
db = client['jddb']
collection = db['shop']

def response(flow):
    protocol1 = 'http://'
    protocol2 = 'https://'
    url = 'api.m.jd.com/client.action?functionId=search'
    if flow.request.url.startswith(protocol1 + url) or flow.request.url.startswith(protocol2 + url):
        text = flow.response.text
        data = json.loads(text)
        shops = data.get('wareInfo)
        for shop in shops:
            item = {
                'spuId': shop.get('spuId'),
                'wname': shop.get('wname'),
                'price': shop.get('jdPrice'),
                'reviews': shop.get('reviews')
            }
            ctx.log.info(str(item))
            # 写入MongoDB数据库 注意要考虑到数据库的一些连接、关闭处理等,此处不再赘述
            # collection.insert(data)

4 )测试运行

  • $mitmdump -s script.py
  • 进入京东 搜索 笔记本电脑 关键词或其他关键词并进行浏览翻页操作

5 ) 引入自动化测试工具模拟手机操作如:连续下滑翻页操作

  • 关于Appium,请访问:http://appium.io/
  • 这个东西特别大,安卓、iOS需要下载各种模拟器镜像
  • 具体配置使用案例可在网络上查找,比较麻烦,下载的东西也较多,此处不做赘述

6 )其他替代方案?

  • 可以分析京东接口的数据
  • 根据请求和响应的数据模拟请求
  • 延时加载处理,当然这种方式也不在赘述了,脱离了本次使用代理抓包的初衷,具体参考前面文章即可
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!