App 的爬取相比 Web 端爬取更加容易,反爬虫能力没有那么强,并且数据大可能是以 JSON形式传 输的,解析更加简单。在 Web 端,咱们能够经过浏览器的开发者工具监听到各个网络请求和响应过程, 在 App 端若是想要查看这些内容就须要借助抓包软件。经常使用的抓包软件有 WireShark、Filddler、Charles、 mitmproxy、 AnyProxy 等,它们的原理基本是相同的。 咱们能够经过设置代理的方式将手机处于抓包 软件的监昕之下,这样即可以看到 App 在运行过程当中发生的全部请求和响应了,至关于分析 Ajax 一 样。 若是这些请求的 URL、参数等都是有规律的,那么总结出规律直接用程序模拟爬取便可,若是它 们没有规律,那么咱们能够利用另外一个工具 mitmdump 对接 Python 脚本直接处理 Response。 另外, App 的爬取确定不能由人来完成,也须要作到自动化,因此咱们还要对 App 进行向动化控制, 这里用 到的库是 Appium。 api
Charles 是一个网络抓包工具,咱们能够用它来作 App 的抓包分析,获得 App 运行过程当中发生的 全部网络请求和响应内容,这就和 Web 端浏览器的开发者工具 Network 部分看到的结果一致。 相比 Fiddler来讲, Charles 的功能更强大,并且跨平台支持更好。 因此咱们选用 Charles做为主要 的移动端抓包工具,用于分析移动 App 的数据包,辅助完成 App 数据抓取工做。浏览器
本节咱们以京东 App 为例,经过 Charles 抓取 App 运行过程当中的网络数据包,而后查看具体的 Request 和 Response 内容,以此来了解 Charles 的用法。请确保已经正确安装 Charles 并开启了代理服务,手机和 Charles 处于同一个局域网下, Charles 代理和 CharlesCA 证书设置好。服务器
原理网络
肯先 Charles 运行在本身的 PC 上, Charles 运行的时候会在 PC 的 8888 端口开启一个代理服务, 这个服务其实是一个 HTTP/HTTP 的代理。
确保手机和 PC 在同一个局域网内,咱们可使用于机模拟器经过虚拟网络链接,也可使用手 机点机和 PC 经过无线网络链接。 设置手机代理为 Charles 的代理地址,这样手机访问互联网的数据包就会流经 Charles, Charles 再 转发这些数据包到真实的服务器,服务器返回的数据包再由 Charles 转发回手机, Charles 就起到中间 人的做用,全部流量包均可以捕捉到,所以全部 HTTP 请求和响应均可以捕获到。 同时 Charles 还有 仅力对请求和响应进行修改。并发
抓包 app
初始状态下 Charles 的运行界面如图工具
Charles 会一直监听 PC 和手机发生的网络数据包,捕获到的数据包就会显示在左侧,随着时间的 推移,捕获的数据包愈来愈多, 左侧列表的内容也会愈来愈多。
能够看到,图中左侧显示了 Charles 抓取到的请求站点,咱们点击任意一个条目即可以查看对应 请求的详细信息,其中包括 Request、 Response 等内容。 接下来清空 Charles 的抓取结果, 点击左侧的扫帚按钮便可清空当前捕获到的全部请求。 而后点 占第二个监听按钮,确保监昕按钮是打开的,这表示 Charles 正在监听 App 的网络数据流。测试
这时打开手机京东,注意必定要提早设置好 Charles 的代理并配置好 CA 证书,不然没有效果。 打开任意一个商品,如 iPhone,而后打开它的商品评论页面,spa
不断上拉加载评论,能够看到 Charles 捕获到这个过程当中京东 App 内发生的全部网络请求,如图 3d
左侧列表会出现一个api.m.jd.com的连接,并且不停的山东,颇有可能就是当前app发出的获取评论数据的请求被Charles捕获到了。咱们点击将其展开,继续上拉刷新评论。随着上拉的进行,此处又会出现一个个的网络请求,这时新出现的数据包请求肯定就是获取评论数据的请求。
为了验证肯定性,咱们点击查看其中一个条目的详情信息。切换到contents选项卡,这时咱们发现一些JSON数据,核对一下结果,其中有commentdata的字段,其内容和咱们在App中看到的评论内容一致。
分析
如今分析这个请求的和响应的详细信息。首先能够回到Overview选项卡上,上方显示了请求的URL,接着是响应状态码,请求方式等,如图
这个结果和本来在WEB浏览器开发者工具内捕获到的结果形式是一致的
接着点击content选项卡,查看请求和响应的详细信息
上半部分是Request的信息,先半部分是Response的信息。好比针对Request咱们切换到Headers选项卡便可看到Request的Headers的信息。针对Response的,咱们切换到JSON TEXT的选项卡,便可看到Response的Body信息,而且该内容已经被格式化。
因为这个请求是 POST请求,咱们还须要关心 POST 的表单信息, 切换到 Form选项卡便可查看, 如图
这样咱们就成功抓取App 中的评论接口 的请求和响应,而且能够查看Response返回的 JSON数据。
至于其余 App,咱们一样可使用这样的方式来分析。 若是咱们能够直接分析获得请求的 URL 和参数的规律,直接用程序模拟便可批量抓取。
重发
Charles 还有一个强大功能,它能够将捕获到的请求加以修改并发送修改后的请求。 点击上方的修 改按钮,左侧列表就多了一个以编辑图标为开头的连接, 这就表明此连接对应的请求正在被咱们修改, 如图
咱们能够将Form中的某个字段进行删除,好比这里将partner字段进行删除,而后点击Remove,这时咱们已经对原来请求携带的FormData作了修改,而后点击下方的Execute按钮便可执行修改后的请求,如图
左侧列表再次出现了接口的请求结果,内容仍然不变
能够看出删除某些字段,并无带来什么影响,因此这个字段是可有可无的。
有了这个功能,咱们能够方便的使用Charles来作调试,能够经过修改参数、接口等来测试不一样请求的响应状态,就能够知道哪些参数是必要的,那些是没必要要的,以及参数分别有什么规律,最后能够获得一个最简单的接口和参数形式以供程序模拟调用使用
结语
以上内容即是经过 Charles 抓包分析 App 请求的过程。 经过 Charles,咱们成功抓取 App 中流经的 网络数据包,捕获原始的数据,还能够修改原始请求和从新发起修改后的请求进行接口测试。 知道了请求和响应的具体信息,若是咱们能够分析获得请求的 URL 和参数的规律, 直接用程序 模拟便可批量抓取,这固然最好不过了。 可是随着技术的发展, App 接口每每会带有密钥,咱们并不能直接找到这些规律,那么怎么办呢?咱们将了解利用 Charles 和 mitmdump 直接对接 Python 脚本实时处理抓取到的 Response 的 过程。