Python抓取QQ音乐歌单并分析

学了python也有一段时间了,对于爬虫,后端的框架也有一些了解,可是都是在学习的时候跟着别人写的,感受都不是本身的知识同样。我去年就给网易云音乐提了一个建议,就是经过播放量或者一个受欢迎程度来排序,然而确定是没有管个人,随着网易云音乐的版权问题,如今又开始使用QQ音乐了,固然它依然没有这个功能。因此就只有本身动手解决了~html

目的

首先抓取这些歌单,一是为了让本身在没有歌听的时候从播放量高的歌单里选一些来听二是本身动手抓取一下数据,并简单的分析,熟悉技术。因此我须要知道至少须要歌单名歌单播放次数,以后再分析都是什么类型的时候须要标签,可是这个不必定准确,因此也就加上去仅供参考。最终须要的数据就有:python

class QQMusicItem(Item):
    # 歌单名
    songSheet = Field()
    # 做者
    authorName = Field()
    # 播放次数
    playTimes = Field()
    # 建立时间
    createTime = Field()
    # 标签
    tags = Field()
    # 介绍
    introduce = Field()
复制代码

爬取QQ音乐歌单

首先给出源码,下文中就再也不贴代码,由于爬取数据的代码没什么复用行,并且实现方式多种多样,主要是实现思想。下文中就以解决踩到的坑为线索来实现目的。git

打开QQ音乐网页版的分类歌单界面,乍一看,一分析网页源码,看到下图:github

playlist_item

找到这里我觉得和普通的爬取数据同样,直接看其标签的内容就能抓去完成了,是的不踩一下坑都不知道有多深。是的显然失败了,一条数据都没有。打印一下访问的网页,查找一下这个class的名字,发现竟然没有,是的我就这样掉坑里了。编程

那么看来它就是使用动态填充的,那么它确定就调用了接口,请求数据,那么就去找,在检查里的network中找啊找,最终找到了它:json

playlist_api

这个接口的寻找不知道技巧,请知道的不吝赐教后端

到这里获得了大部分数据,歌单名,做者名,播放次数,建立时间都有了。也就是说,只有标签和介绍没有,这个数据经过每一项点进详情里边就能发现,此次我聪明了,没有再直接写,先去找获取详情的接口,毕竟qq音乐这种大厂的产品确定是技术统一的,这里的数据确定也是填充的,功夫不负有心人,让我找到了~api

detailinfo

是的从这个数据里边就找到了标签和介绍。bash

看着短短的几句话,就找到了,其实这个过程我不知道技巧,因此仍是耗费了很多时间,也是由于不熟悉吧。框架

而后就是分页获取所有歌单数据,既然每一页它是调的接口就更容易了,我在第二页去查看第二页请求数据的接口,和第一页的比较,发现其实就是最后两个参数(sin(开始)和ein(结束))引发的变化。在观察这个接口的参数的过程当中发现他的rnd这个参数是在变化的,因此在请求每页的数据的时候这三个参数是须要动态改变的。

而后我就从新编码,获取数据,处理数据编程json字符串格式,再转为字典,而后遍历获取到须要的数据。写完执行发现接口访问不了,这时候想起来多是header须要加参数,再去看那个数据,避免错误就把几乎全部的参数都加上了,其中我以为referer比较重要。对于referer每一页的接口都是能够来自歌单首页,可是对于详情来源就是详情页,参数带有歌单的id,这个id正好能够从每页的每一项的数据中拿到,因此动态改变就好了,最后删掉一些不是很重要的参数,例如这里我只删除了loginUin。

而后写上代码,通过调试,终于成功了。

最后我把它保存成一个csv文件,经过播放量排序,截取前20,获得了下图

rank

到这里数据的爬取工做已经完成。

分析数据

数据拿到后,在上边已经简单的处理了如下数据,就是看看播放次数前20的歌单。

接着我想看看播放次数的大体分布状况,例如播放5000万次以上有多少,1000万,500万,100万,50万,10万以上以及10万如下,都有多少。而后绘制成柱状图,看看是什么状况。

是的,对于这个数据的处理,就用到了numpy和pandas以及matplotlib。通过分析得出下图结果:

播放次数分析

播放次数分析

很直观的看到高于500万播放次数的歌单是少数的。按比例来看的话,能明显看到10万如下的歌单有2300多个,仍是比较多的,以后再进一步分析这2300多个歌单的建立时间的分布,这里就不继续分析了。

标签分析

对于标签什么的,如下我就想到了使用词云,就能直观的看到哪些词出现的次数多。歌单都主要是什么类型的比较受欢迎。编码后获得以下结果:

标签分析

可能直接这样看能大概知道哪些多,可是仍是不是很能分得很细,我又排了个序,下边列出降序排列前十的标签~

[('流行', 1834), ('英语', 1669), ('国语', 1386), ('电子', 723), 
('日语', 552), ('民谣', 369), ('ACG', 347), ('影视', 337), 
('治愈', 337), ('韩语', 330)]
复制代码

先就分析这么多,等有空再分析一下建立时间的分布状况。

再来一次源码

不当之处请不吝赐教~

最后再推广一下个人博客,才写不久,以前的文章大多都是从以前个人简书上迁移过去的。以后也会不按期更新Android、Java、Python相关技术。

相关文章
相关标签/搜索