Python爬取应用「英语流利说」的配音视频数据(第一次这么粉一个人)

一、故事起源

程序猿有时候很痛苦,遇到问题解决不了就睡不着,也找不到人倾诉,只能通过失眠来解脱,那天长夜漫漫,我却无心睡眠,就拿起手机继续刷朋友圈,发现了睡前故事这个信息:


就手贱点进去一看,妈呀顿时酥了,只能用无限循环表达我的心情。其实这部动画我没看过,不知道原始的配音是什么样的,但是就这个配音真的太赞了,英语太好听了,其实吧我是非常崇拜英语口语流利的人!好了就这样在无限循环下呼呼的进入睡眠了,第二天醒来我在想这东西我得珍藏呀,有的人说直接收藏链接在微信中呗?其实这种方式不靠谱,因为假如有一天这个配音app倒闭了数据丢失,或者作者把作品删除了,我该怎么办?所以就直接把视频弄下来保存本地珍藏才是正解。


二、数据协议分析

好了前面的故事说完了,下面进入正题吧,本文的重点是如何把这个app中某个作者的配音作品都爬取到本地,首先我们知道这个app叫做「英语流利说」不多说了,直接下载安装,然后通过搜索中找到我粉的这个作者,然后进入他的专辑:


然后发现有很多作品呀,所以就点进去查看:


然后点击配音作品查看详细信息:


不过在我的意料之中,这个视频是不支持下载的,因为这个app关心版权问题。那么问题就是我们怎么爬取这个视频保存到本地呢?这个其实以前我写过一篇文章:Python爬取今日头条视频;大家都知道突破口就是抓包。不多说了直接连接Fiddler进行抓包,可惜的是遇到这个错误:


说来巧了,我之前做应用因为我们服务器用了自己家的证书所以我在调试程序就出现这个问题,连提示信息都一样,所以看到这问题我很敏感直接断定这个app的服务器用了自家的证书,所以我们连接Fiddler抓包就提示错误,这里的原因大致是这样的:Fiddler抓包https的时候我们都知道需要安装Fiddler自己的证书,这个证书肯定没有去认证过也就是Android手机系统中不认这个证书的。而这个app的服务器肯定购买了认证的证书,Android手机系统中内置了一些根证书,就是为了验证后续的证书。这个app的证书是被这些根证书认证过了。我们在使用系统默认的网络请求其实都是需要认证证书的,而有的app用到了https请求,但是我们还可以用Fiddler抓包成功,那是因为这些app的服务器肯定没有购买证书,所以客户端就添加代码信任所有的证书,所以这么看https的安全性就没有任何意义了。那么有的同学好奇为什么这些app要这么干呢?因为我曾经在一家公司做东西的时候就遇到这样的问题,就是从购买证书到服务器部署成功这个过程有很多艰难过程的。有的公司开始没有用https,最后迁移用到https,整个过程很费劲的。所以很多公司没办法就先曲线救国让客户端先信任所有的证书。


上面说了关于为什么我们连接Fiddler,也安装了Fiddler证书还是没有抓取到这个app的数据:


所以大家以后要是遇到这类问题一定要第一想到这个原因,一看443端口就是https,你安装证书了却还抓不到包那么很有可能就是证书问题,既然现在知道问题了,我们该怎么解决这类问题呢?其实这个问题解决方案有两个:

第一、使用Xposed拦截系统的证书校验功能,这个网上有大神给出了hook模块代码,可以去github上搜JustTrustMe项目代码即可,就一个简单类,导入Xposed中自己编译即可。

第二、反编译app,找到网络请求模块,因为系统默认是校验证书的,所以我们需要修改smali让其信任所有证书,一般通过连接或者全局搜HttpClient等类信息定位到地方,然后修改smali代码即可,信任所有证书的代码网上也有。

通过这两种方式可以看到,第一种方式最简单,第二种方式需要反编译修改smali代码还是有点麻烦,但是第一种操作的前置条件很多,第二种修改之后可以给很多人用。不过本文肯定用第一种,原因很简单因为我们的目的是能够成功抓包看数据,而不是二次打包使用。所以不解释直接下载JustTrustMe模块代码编译:


代码这里就不分析了,就是hook系统的关键类修改值即可:


然后安装模块运行即可,然后就可以愉快的抓包了,我们首先通过搜索作者信息:


发现请求参数中有一个query字段就是携带搜索作者名的值,搜索有结果会返回作者信息,其中id值最关键,是用于后面获取作者的作品信息:


这里应用没有把作者id作为参数传递上去,而是拼接到url中,请求成功之后可以发现所有的作品都有了,依然是作品中的id值关键,后续用于请求作品信息:


这样就可以看到视频原始地址了,所以到这里我们就分析完了,来总结一下流程吧:

第一步:我们通过搜索接口:/api/v1/topics/search/allquery=xxxx... 获取作者信息,拿到id值。

第二步:用第一步获取到的作者id通过接口:/api/v1/users/[作者id值]/video_works?pageSize=20...拼接url获取作者所有作品信息,保存所有作品的id值。

第三步:用第二步的所有作品id值,通过接口:/api/v1/video_works/[作品id]?appVer=...拼接url获取作品的详细信息,拿到视频的原始地址。进行下载即可。

下面就可以用Python进行爬数据即可,需要注意的是这里都是https请求,需要用urllib2库以及设置信任所有证书,不然会报错的,代码也是分三步进行:

第一步:通过搜索作者名获取作者的id值



第二步:用第一步获取的作者id值,获取作者的所有视频id值信息



第三步:通过第二步的所有作品id值,获取对应每个视频的原始地址信息



第四步:解析出视频原始地址,直接下载视频即可



好了,代码很简单的,下面直接运行python即可:


运行完了之后,可以查看本地保存视频:


好了,就这样我们成功的把作者的所有作品都爬到本地了,这下就可以珍藏了。只要以后失眠了就翻出来看看就好了。我不追星,这个作者是我第一次这么粉的人,因为他的英语口语太好听了。不得不赞,不过我还是要矜持,不能太花痴哈哈哈。


严重声明

本文的意图只有一个就是通过分析app抓包技术来满足自己的心愿,如果有人利用本文知识和技术进行非法操作进行牟利,带来的任何法律责任都将由操作者本人承担,和本文作者无任何关系,最终还是希望大家能够秉着学习的心态阅读此文。鉴于安全问题,样本和Python源码都去编码美丽小密圈自取!微信扫一下进入小密圈:



总结

本文主要因为我的一个目的去分析了一个app的数据请求然后用Python爬取数据保存本地的过程,本文的重点在于一些app服务器做了证书校验工作,所以即使你安装了Fiddler证书也是抓不到他的https请求,所以这时候我们需要安装Xposed的JustTrustMe模块,拦截系统证书信任就可以愉快的抓取到数据包了。如果有感兴趣的同学可以扩展把这个功能做到手机端也是可以的,借助上面的三个接口,输入作者名就获取作品列表,然后可以播放和下载视频。

《Android应用安全防护和逆向分析》

点击立即购买:京东  天猫 

更多内容:点击这里

关注微信公众号,最新技术干货实时推送

编码美丽技术圈
微信扫一扫进入我的"技术圈"世界
扫一扫加小编微信
添加时请注明:“编码美丽”非常感谢!

阅读更多

扫码向博主提问

尼古拉斯_赵四

博客专家

非学,无以致疑;非问,无以广识
去开通我的Chat快问
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiangwei0910410003/article/details/79367213
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭