Charles 是一个网络抓包工具,我们可以用它抓取 APP 运行过程中产生的所有请求内容和响应内容,这和在浏览器开发者工具的 Network 面板中看到网页产生的内容是一样的道理
Charles , Fiddler 等都是非常强大的 HTTP 抓包软件,功能基本类似,本节我们选择 Charle 作为主要的移动端工具来分析 APP 的数据包,以便之后的数据爬取
本节目标
我们会以一个电影 APP 为例,利用 Charles 抓取这个APP 在运行过程中产生的网络数据包,然后查看具体的请求和响应内容
同时,我们会使用 python 改写抓取到的数据包中的请求,继而爬取 APP 数据
准备工作
Charles 运行在一个电脑上,运行时会在该电脑的 8888 端口开启一个代理服务,首先请确保已经正确安装好 Charles 并且开启了代理服务
然后准备一部 Android 手机或模拟器(系统版本最好在 7.0 以下),并让手机或模拟器的网络和 Charles 所在电脑的网络处于同一个局域网下(可以让模拟器通过虚拟网络与电脑连接,也可以让手机真机和电脑连接到同一个 WIFI )
之后设置好 Charles 代理和 Charles CA 证书, 在 Charles 中 开启 SSL 监听
另外需要在手机上下载 APP : https://app1.scrape.center 访问即可下载
注意: 为了方便,后面统一使用手机 指代 手机真机 或模拟器
Charles 安转和配置 : 写文章-CSDN创作中心
抓包原理
设置手机为 Charles 的代理服务地址,这样手机访问互联网的数据包就会先流经 Charles ,再由 Charles 转发给真正的服务器,同样服务器返回的数据包会先到达 Charles ,再由 Charles 转发给手机。
实战抓包
打开 CHarles
Charles 会一直监听手机产生的数据包,捕获的数据包将显示在界面的左侧,随着时间的推移,会捕获越来越多的数据包,左侧列表里的内容页越来越多
现在打开手机上下载的 App,会发现 Charles 已经捕获了对应的数据包,要设置好代理及安全证书,否则没有效果
在 APP 上不断下拉, Charles 会捕获这个过程中产生的所有网络请求,可以看到左侧的列表中有一个 https://app1,scrape.center , 在 App1 里下拉的时候会一直闪动,就表示当前 APP1 发出的获取电影数据请求被 Charles 捕获了
为了验证其正确性,点击上述链接下的一个条目
至此可以确定, https://app1,scrape.center 对应的接口就是获取电影数据的接口。这样我们就成功捕获了在下拉过程中产生的请求内容和响应内容
分析
现在分析一下捕获的请求内容和响应内容的详细信息。首先回到 Overview 选项卡,界面右侧上方显示了请求 URL ,响应状态码 Response Code 和请求方法 Method 等信息
接下来点击 Contents 选项卡,查看请求内容和响应内容详情,上半部分显示的是请求信息,下半部分显示的是响应信息,切换到 Headers 卡伊看到请求头,切换到 JSON Text 可以看到响应体
由于这个是 GET 请求,所以还要关注 GET 参数信息,切换到 Query String 选项卡即可查看
对于其他 APP ,同样可以使用本节的分析方式。如果能直接分析出请求 URL 和参数规律,就可以直接模拟发出的请求批量抓取
重发
Charles 还有一个强大的功能,是可以对捕获的内容加以修改并把修改后的请求发送出去,点击界面右侧上方的修改按钮,左侧就会出现一个以编辑图标为开头的接口,代表我们正在修改此接口对应的请求
可以修改请求参数中的某个字段,例如这里将 offset 字段的值由 0 修改为 10 ,然后点击界面下方的 Execute 按钮即可发送修改后的请求
可以发现左侧列表出现了对应的请求结果,点击 Contents 选项卡,查看响应内容,这次返回的是第二个列表页中的电影信息
有了重发功能,我们就可以方便的使用 Charles 做调试了
修改响应内容
除了修改请求内容 Charles 还可以修改响应内容,例如将响应内容修改为本地或远程的某个文件,这样就可以实现数据的修改和伪造了
怎么实现呢? 右键点击任意一个请求,可以看到出现的菜单中有 Map Remote 和 Map Local 两个选项,通过这两个选项就可以将响应内容修改为远程或本地文件以生成本地文件为例,可以先把当前的响应内容,也就是 JSON Text 的内容复制下来保存到本地文件,名为 data.json
然后修改其中的字段值,例如将第一条目的 name 值修改为 “霸王别姬2”, 保存修改
再在 Map Local 的配置中,选定 data.json 文件的保存路径,这样,我们就把 app1 的第一个请求--加载列表页成功修改成本地文件 data.json 内容了,接下来重新启动 app1
可以看到,第一个电影的名称变成了“霸王别姬2”,我们成功修改了响应内容
模拟爬取
现在我们已经成功完成了抓包操作, APP1 发出的所有请求一目了然,请求 URL 就是 https://app1.scrape.center/api/movie , 后面跟着两个请求参数 offset 和 limit . 显然, offset 就是偏移量, limit 就是一次的返回结果中包含的条目数量。 例如 offset 为 20 , limit 为10 ,代表返回 第 21-30 条电影的信息,另外,通过观察可以发现一共有 100 个电影,因此 offset 取 0, 10 ,20 ,..... 90 , limit 则恒为 10
接下来我们用python模拟一下请求,这里代码从简
import requestsBASE_URL = 'https://app1.scrape.center/api/movie?offset={offset}&limit=10' for i in range(0, 10):offset = i * 10url = BASE_URL.format(offset=offset)data = requests.get(url).json()print('data', data)
输出结果,中间省略一大堆
data {'count': 103, 'results': [{'id': 1, 'name': '霸王别姬', 'alias': 'Farewell My Concubine', 'cover': 'https://p0.meituan.net/movie/ce4da3e03e655b5b88ed31b5cd7896cf62472.jpg@464w_644h_1e_1c', 'categories': ['剧情', '爱情'], 'published_at': '1993-07-26', 'minute': 171, 'score': 9.5, 'regions': ['中国内地', '中国香港'], 'drama': '影片借一出《霸王别姬》的京戏,牵扯出三个人之间一段随时代风云变幻的爱恨情仇。段小楼(张丰毅 饰)与程蝶衣(张国荣 饰)是一对打小一起长大的师兄弟,两人一个演生,一个饰旦,一向配合天衣无缝,尤其一出《霸王别姬》,更是誉感到一切都失去了意义,为了生存,她和好友不得不沦为妓女。然而命运弄人,就在此时玛拉竟然再次遇到了罗伊。虽然为罗伊的生还兴奋不已,玛拉却因自己的失身陷入痛苦之中。感到一切难以挽回的玛拉潸然离开,独自来到两人最初相遇的地点——滑铁卢桥上…'}]}
这可以看到我们获取到了需要的内容