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

一、故事开端

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

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

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

大约消耗 "7.6M" 流量


二、数据协议分析

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

第一步:我们首先通过搜索接口搜索作者名称/api/v1/topics/search/all?query=x... 获取作者信息,拿到id值

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

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


三、Python爬取数据

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

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

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


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

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


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

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


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

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


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

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

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

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

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

大约消耗"2.88M"流量


严重说明

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


四、总结

本文主要因为我的一个目的去分析了一个app的数据请求然后用Python爬取数据保存本地的过程,本文的重点在于一些app服务器做了证书校验工作,所以即使你安装了Fiddler证书也是抓不到他的https请求,所以这时候我们需要安装Xposed的JustTrustMe模块,拦截系统证书信任就可以愉快的抓取到数据包了。当然如果感兴趣可以利用上面的知识在手机端开发一个工具,这样只要搜索作者名字然后就获取视频列表展示,你可以观看和下载保存,这个就留给有兴趣的人做吧。


手机查看文章不方便,可以网页看

http://www.wjdiankong.cn



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

点击查看图书详情

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


长按下面??二维码,关注编码美丽


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


编码美丽小密圈

小密圈中汇集众神分享技术,所有源码、工具、**样本、插件都汇集在小密圈中

---点击立即进入小密圈---


天若有情天亦老,我为逆向续一秒!猛戳下方"阅读原文",购买安全逆向图书!

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