- A+
《我们》这首歌是《后来的我们》中的主题曲,网易云音乐上线当天便席卷千万+播放量,现如今光是网易云上面的评论就马上突破了10万条。
于是今天恋习Python来抓取一下歌曲的热门评论。并做成图表、词云来展示,看看相对于这首歌最让人有感受的评论内容是什么。
一、抓数据
要想做成词云图表,首先得有数据才行。于是需要一点点的爬虫技巧。
基本思路为:抓包分析、加密信息处理、抓取热门评论信息
1.抓包分析
我们首先用浏览器打开网易云音乐的网页版,http://music.163.com/#/album?id=38296010
进入陈奕迅《我们》歌曲页面,可以看到下面有评论。接着F12进入开发者控制台(审查元素)。
一个人自学很有可能因为动力不足而中途放弃,可以尝试加入一个或几个适合自己的网络群体(QQ、 微信、 社区等),寻找志同道合的学习伙伴,相互交流、相互促进.如果大家想要学习交流欢迎给我私信,私信关键词: 01.系统坚持到关键词会自动发送。
接下来就要做的是,找到歌曲评论对应的url,并分析验证其数据跟网页现实的数据是否吻合,步骤如下图:
通过歌曲id轻松找到评论所在的链接
查看hreaders的信息,发现浏览器使用的是POST的方式进行的请求
具体字段如上图,会发现表单中需要填两个数据,名称为params和encSecKey。后面紧跟的是一大串字符,换几首歌会发现,每首歌的params和encSecKey都是不一样的,因此,这两个数据可能经过一个特定的算法进行加密过的
服务器返回的和评论相关的数据为json格式的,里面含有非常丰富的信息(比如有关评论者的信息,评论日期,点赞数,评论内容等等),其中hotComments就是我们要找的热门评论,总共15条
那我们的思路就很清晰了,只需要分析这个api并模拟发送请求,获取json进行解析就好了。
2.加密信息处理
然后经过我的测试,直接把浏览器上这俩数据拿过来就可以。但是要想真正的解决这个加密处理,还需要有点加解密的只是存储。关于这两个参数如何解密,强大的知乎上其实已经有答案的了,感兴趣的朋友可以进去看一下
如何爬网易云音乐的评论数?(https://www.zhihu.com/question/36081767)
我们在这里就只需要用我们这种偷懒的办法就可以完成需求了。这里我就使用这么个临时的方法好了,而且对于不同的歌曲是可以重用的,待会我们可以验证一下。
3.抓取热门评论信息
代码块如下:
在获得相关评论数据后,我们将其做成图表与词云图,将让人看起来更直观。
接下来需要在自己电脑上安装需要相关的安装包: pyecharts(图表包)、matplotlib(绘图功能包)、 WordCloud(词云包)
其中,pyecharts 是一个用于生成 Echarts 图表的类库。 Echarts 是百度开源的一个数据可视化 JS 库,主要用于数据可视化,同时pyecharts 兼容 Python2 和 Python3。安装非常简单,只需:
关于WordCloud(词云包)安装过程中出现问题,可以看看我之前这篇文章:
手把手|教你将Windows环境下Python中安装wordcloud的雷排除掉(https://zhuanlan.zhihu.com/p/33507393)
接下来就是代码的实现,利用之前获得评论用户名和对应的点赞数,将其制作成图表图:
由此可以看出,获得最高赞数(95056)评论是:
@鱼大叔Uncle:后来的我,离开了他,永远的离开了他,十年的感情不过寥寥几句话。后来的我,嫁给了一个很普通的人,没有他的浪漫,却有不一样的温暖。
大多数赞数为20000-30000之间,最低都达到7000+,(基本与网页里评论中数据吻合)。
最后,我们将所有的热门评论内容,制作成词云图展示出来,代码块如下:
结果图:
从图中可以看出,很多人感慨,后来只有你我,再无我们。
注明:所有数据,是属于当时所爬取的数据。
文末知识点扩展①:
昨天在Python学习群里有位路人甲问了个Python函数中关于形参和实参一个很基础的问题,虽然很基础,但是对于很多小白来说不一定简单,反而会被搞得稀里糊涂。人生苦短,我用Python。
为了解答大家的这个疑惑,小编在此举个栗子,希望大家能够彻底的理解实参和形参在Python中的用法。
首先,大家一起看个栗子。
这个函数的输出值是多少?很多人会回答7,其实程序运行之后,其答案是6,点解呢?
为什么在这里形参的数值并不改变实参的数值?
这里需要给大家普及一个Python中的基础,在python中,string(字符串), tuples(元组), 和number(数值)是不可更改的对象,而list(列表),dict(字典)等则是可以修改的对象。
也就是说,这里形参的数值对于外部的实参的数值(number类型,不可变)来说是没有任何关系的,他们虽然是同一个名字,但是其指向对象是不一样的。所以当在程序最后进行打印a输出值的时候,其输出仍然是6。
下面这个栗子我们来看看可变的对象,以list(列表)作为实验对象。
这个函数的输出值是多少?很多人会回答[1,2],其实程序运行之后,其答案是[2,1]。
与第一个栗子刚刚相反,这里形参的数值调用把实参改变了。因为本例中参数传递的是列表,其是可更改的对象,在函数内部经过系列赋值变化之后,所以在程序运行之后其输出值产生了变化。
山重水复疑无路,柳暗花明又一村。这道题经常会被招聘公司和企业拿去作为面试题,考察面试狗的Python基础知识,希望大家好好参详,日后碰到类似的问题加以注意,少走弯路!
文末知识点扩展②:浅谈Python内置对象类型——数字篇(附py2和py3的区别之一)
Python是一门面向对象的编程设计语言,程序中每一样东西都可以视为一个对象。Python内置对象可以分为简单类型和容器类型,简单类型主要是数值型数据,而容器类型是可以包含其他对象类型的集体,如序列、元组、映射等。
在简单类型对象中,Python的数值数据包括整型(int)、长整型(long)、浮点型(float)、复数(complex)及布尔型(bool)等。在容器类型对象中,序列是指元素按顺序存储的一类对象,主要包括字符串(string)、列表(list)、元组(tuple)等类型。映射是通过键来访问值的一种结构,Python中唯一的映射结构就是字典(dict)对象。除了简单类型和容器类型对象之外,还有一种特殊的对象为None,是指空对象。
所有的对象都有数据属性和内置的方法。对象的方法就是我们经常说的函数,用于执行操作,作用于对象上。对象的属性和方法都可以通过点操作符(.)来调用。
今天小编就带大家了解一下Python内置对象中的简单类型对象,即数字类型。Python中的数值可以是各种数,包括整数、长整数、浮点数、复数、布尔类型数等等。前天小编写了一篇文章,关于如何在交互式环境中执行Python程序,下图是部分实例,先感受一下数字类型对象。
一、常量
Python中的数字常量支持多种格式,我们常见的常量是整型和浮点型。其实Python中也支持科学计数法,常常用科学计数法来表示浮点数,如1.2e-3或1.2E-3表示1.2*10的-3次方。除了默认的十进制数之外,还可以使用二进制、八进制、十六进制来表示常数,不过要在这些数字前边添加前缀以便和十进制数进行区分,二进制、八进制、十六进制的前缀分别是0b、0、0x。Python中的数字常量还支持复数和分数形式,但是在分数运算的时候有个地方需要注意,看下图的例子。
小伙伴是不是感觉到有点儿懵逼?在py2中整数除法运算的结果仍然为整数,是取整,而不是四舍五入噢。当参与运算的数中有一个为浮点数的时候,Python会自动将另一个数字隐性的转换为浮点数,因此在第二个运算中得到的结果为浮点数。在py3中,除法的意义就和我们平时见到的除法是一致的了,而不是取整。换句话说,除法的除数和被除数在py3中都先做了浮点数转换,然后相除,最终得到的商是浮点数。
Python的运算中还有双斜杠//,也是代表除法,这个除法可以得到最大整数商,这种除法模式也叫floor除法。在py2中就支持这种模式,当两个整数相除,结果只得到商的整数部分。%代表取余运算符,可以得到余数部分。如下图所示:
二、分数
分数包括分子和分母两个部分。在Python中,函数Fraction(x, y)表示分数x/y。在使用该函数之前,需要导入分数模块fractions,分数构建之后,就可以在表达式中使用了。当然,也可以将浮点数字符串转换为分数,如下图所示:
三、布尔型
布尔型对象只有两个值,即对(True)和错(False)。对于空数据类型,其布尔值均为False。一般来说,布尔型数值用在条件判断中比较多,其通常会作为程序的分支或者循环的测试条件来使用。
四、复数
复数是由有理数部分和无理数部分构成。其中有理数部分称为实部,该部分可有可无;而无理数部分称为虚部,该部分是必需需要的,虚部的后缀一般用j或者J表示。复数也支持常数中的四则运算等,复数之间运行的结果仍为复数,如下图所示:
数字是最基本的数值类型,不论哪种编程语言都离不开它。希望小伙伴们都好好掌握,在分数运算部分尤其要注意掌握py2和py3版本中的不同,这个知识点在面试题中经常会碰到,其实这个部分也算是两个版本的区别之一。
我是一名Python开发者,一直对Python的热爱从未减少,希望你在Python的路上走的越来越好,越来越远,关注菜鸟学Python头条号,分享更多学习资源和乐趣。