- App的爬取相比Web端爬取更加容易,反爬中能力没有那么强,而且响应数据大多都是JSON形式,解析更加简单。
- 在APP端若想查看和分析内容那就需要借助抓包软件,常用的有:Filddler、Charles、mitmproxy、Appium等。
- mitmproxy是一个支持HTTP/HTTPS协议的抓包程序,类似Fiddler、Charles的功能,只不过它通过控制台的形式操作。
- Appium是移动端的自动化测试工具,类似于前面所说的Selenium、利用它可以驱动Android、iOS等设备完成自动化测试。
- Charles是一个网络抓包工具,可以完成App的抓包分析,能够得到App运行过程中发生的所有网络请求和响应内容。
- Charles主要功能:
- 支持SSL代理,可以截取分析SSL的请求。
- 支持流量控制。可以模拟慢速网络以及等待时间(latency)较长的请求。
- 支持AJAX调试,可以自动将json或xml数据格式化,方便查看。
- 支持AMF调试,可以将Flash Remoting 或 Flex Remoting信息格式化,方便查看。
- 支持重发网络请求,方便后端调试。
- 支持修改网络请求参数。
- 支持网络请求的截获并动态修改。
- 检查HTML,CSS和RSS内容是否符合W3C标准。
- 首先Charles运行在自己的PC上,Charles运行的时候会在PC的8888端口开启一个代理服务,这就是一个HTTP/HTTPS的代理。
- 确保手机和PC在同一个局域网内,我们可以使用手机模拟器通过虚拟网络连接,也可使用手机真机和PC通过无线网连接。
- 设置手机代理为Charles的代理地址,这样手机访问互联网的数据包就会流经Charles,Charles再转发这些数据包到真实的服务器,同理相反也是如此。
-
实现手机和电脑连接到同一个局域下,有两种:①、电脑通过网线连接。②、电脑直接使用wifi
- 第①种配置较为复杂,需要电脑共享Wifi,手机在连接此wifi,具体可自行搜索方案,不同系统下的配置不同,Mac下需要在系统偏好设置/共享中设置
- 第②种只需要保证手机连接上同一个wifi即可(保证在同一网段上)
-
代理设置:基于实现了手机与电脑在同一局域网下进行Charles的代理配置
- 首先查看电脑的打开Charles代理是否开启,具体操作是:Proxy -> Proxy Settings , 打开代理设置界面, 设置代理端口为:8888(默认端口).
- 打开手机的网络配置,并设置使用代理配置即可
- 证书(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系统下的钥匙串中将该证书设置为
始终信任
- 首先要确保电脑端手机端都把证书安装好了
- 然后在Proxy –> SSL Proxying Setting 中
- 勾选 Enable SSL Proxying
- 之后Add一个Host为
*
,Port为443
的Location - 备注:这里的Host可为空,不填写即可
- 点击OK, 重启下Charles就可大功告成了!!!
- 手机运行App访问要爬取的平台信息,使用Charles抓包分析。
- 知道了请求和响应的具体信息,通过分析得到请求的URL地址和参数的规律,直接使用程序模拟即可批量爬取。
- mitmproxy是一个支持HHTP/HTTPS协议的抓包程序,类似Fiddler、Charles的功能,只不过世它通过控制台的形式操作。
- mitmproxy还有两个关联组件:
- mitmdump:它是mitmproxy的命令行接口,利用它我们可以对接Python脚本,用Python实现监听后的处理。
- mitmweb: 它是一个Web程序,通过它我们可以清楚观察mimproxy捕获的请求。
- 拦截HTTP和HTTPS请求和响应
- 保存HTTP会话进行分析
- 模拟客户端请求,模拟服务器返回响应
- 利用反向代理将流量转发给指定的服务器
- 支持Mac和Linux上的透明代理
- 利用Python对HTTP请求和响应进行实时处理
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安全性
- 打开一终端(最好重新打开一个终端)启动mitmdump
- 在Mac系统下双击
mitmproxy-ca-cert.pem
即可弹出秘钥串管理页面,找到mitmproxy证书,打开设置选项,选择始终信任
- 将
mitmproxy-ca-cert.pem
文件发送到iPhone手机上,点击安装就可以了(在iOS上通过AirDrop隔空投送共享过去即可) - 在iphone上安装CA证书,一些系统版本可能会先下载描述文件,在设置里找到对应的描述文件进行安装(Android手机直接复制文件点击安装即可)
- 在IOS手机上,点击“设置” - > “通用” - > “关于本机” - > “证书信任设置”,设置开启 (注:不同系统版本使用不同的处理方式即可)
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 | 进入编辑模式 |
- 使用命令启动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 )其他替代方案?
- 可以分析京东接口的数据
- 根据请求和响应的数据模拟请求
- 延时加载处理,当然这种方式也不在赘述了,脱离了本次使用代理抓包的初衷,具体参考前面文章即可