记不清这是实战第几篇了,你看看就知道了。。。
最近发现一首很火的歌,瞬间让你感受到浓浓的青春懵懂感,这就是王广允的《好喜欢你》。说实话,爬这种爱意浓浓的歌曲似乎不是我们这种单身XX应有的想法,但是还是想体会一下那些青春岁月里的小幸福,话不多说,代码走起来。
本来想这里直接贴上歌曲的链接,但是由于版权问题,大家可以去网易云自行听取哈。
我们这次爬取的信息主要是评论点赞前十的数据,并据此进行数据可视化操作,生成词云。
一、请求分析
我们首先打开网易云音乐的官网,进入《好喜欢你》的播放页面,然后按F12或者审查元素获取控制台信息。
我们这里通过浏览器中的歌曲的id来获取评论的链接,这是一个非常快捷的方式,我之前尝试过很多的方法,感觉都太麻烦了,这个方式简单,大家以后爬取都可以按照这种方式进行。
接着就是确定是通过get还是post的方式来提交数据的,我们发现Headers里面显示是Post方式:
涉及到表单的提交,一般都会附带敏感信息,例如cookie,所以这里我们就需要检查一下有没有参数遗漏了:
我们在Headers底下发现有一个Rorm Data里面包含两个参数params和encSecKey,待会我们提交的时候需要带上这两个参数。如果你爬过类似的网站,你就会猜测这个可能就是标识歌曲信息和个人信息的一个加密数据,实际上这个就是那样的。本篇并不打算去介绍如何去破解这个加密算法,我打算可能下一篇来介绍一下这个破解过程。
一般爬取的时候,我们首先会预览一下数据信息,就控制台下面的preview,发现服务器返回的数据格式是json,所以我们等下就需要把数据转换成json格式:
看到没有,这些数据是非常具有规律的,然后就可以开始书写代码了。
通常我们需要在headers里面添加一些host,referer,user-agent等,这是防止被网站识别出爬虫而被限制访问。
二、代码书写
1import requests
2import json
3
4 # 获取歌曲评论的url
5url = 'https://music.163.com/weapi/v1/resource/comments/R_SO_4_1320098098?csrf_token=cfb7c24b770cd1cad7f7bf6c9bcb6f29'
6
7 # 因为是post提交,采用MD5或者其他算法加密过,但是我们可以直接使用加密后的数据,用于浏览器识别身份(关于如何破解这个加密数据,下一篇介绍)
8headers = {
9'Host': 'music.163.com',
10'Origin': 'https://music.163.com',
11'Referer': 'https://music.163.com/song?id=1320098098',
12'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)'
13 ' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
14}
15
16User_Data = {
17 'params': 'ilXGpo53YAlLd7+0UutKIXmODpUQWhXl1lvPU2a7Y8vOIsFvIr/Q5QYpaSvXRgMU47q5Aa9gJkmY5KM2jS+l5gaIAzf/OmVy6ud71TFl'
18 'fyELQADIGNGSbW8PNXvNyWvPMjEImTtIxrvoOgFlLF429Tbpd/XAAnh6aQu23+hKxThzLBZhO0jdOLLgNAvm87McNgiaVfCQ+1eYws4kn5i+8jR/P/UPt9wdIM8G8qx1xmw=',
19 'encSecKey': '79c3d0f6664de1758c3ae2c3c7c9dabbb61c2a46b79fa0a8d40a842361c6ddd94d2e21594219bf98b9e4ff124fa3f5046b'
20 '1dfa60f38c35fc5511f1be314ed0bcac69a7867f2870ba01b8af7ee0900a588759b5aad499565aa45e379589a42ba150fa5e'
21 'df4afb0442f063ab212d9eb9376b4ca99f282d9520653fd808176a5e0f'
22}
23
24 # 通过post方式来提交数据
25response = requests.post(url, headers=headers, data= User_Data)
26
27# 转换成json格式便于后面数据的提取
28data = json.loads(response.text)
29hotcomments = []
30for hotcomment in data['hotComments']:
31 item ={
32 'nickname': hotcomment['user']['nickname'],
33 'content': hotcomment['content'],
34 'likedCount': hotcomment['likedCount']
35 }
36 hotcomments.append(item)
37
38 # 获取评论的用户名称,内容,以及对应的点赞数
39nickname_list = [content['nickname']for content in hotcomments]
40content_list = [content['content']for content in hotcomments]
41likedCount_list = [content['likedCount']for content in hotcomments]
三、数据可视化
这里我使用了pyecharts这个开源库,它是百度Echarts对Python的实现,挺好用的。使用它需要安装一些依赖包,关于pyecharts的安装我就不介绍了,直接贴上实现数据图表的代码:
1from pyecharts import Bar
2# 图表展示
3bar = Bar('评论中点赞数显示图')
4bar.add('点赞数',nickname_list,likedCount_list, is_stack=True, mark_line=['min', 'max'], mark_point=['average'] )
5bar.render()
代码是不是很少,它会在当前的目录下面生成一个render.html文件,你用浏览器打开就是这样:
接下来便是生成词云了,这里也是贴上实现词云的代码:
1from wordcloud import WordCloud
2import matplotlib.pyplot as plt
3# 词云展示
4content_text = " ".join(content_list)
5wordcloud = WordCloud(font_path=r"F:\字体\21\YGY20070701.ttf",max_words=200).generate(content_text)
6plt.figure()
7plt.imshow(wordcloud,interpolation='bilinear')
8plt.axis('off')
9plt.show()
代码也是比较少的,系统会生成一个图片。如果你使用pycharm这个IDE,你就会看到这样类似的图片:
关于pyecharts和词云的使用,我后面会有相应的文章进行介绍,大家后续关注就可以了。
最后我把点赞前十的评论都给贴出来,大家好好感受一下:
1、阴天雨天晴天,都不如你和我聊天。
2、我高中同学,上课坐在后面喜欢听歌 喜欢戴墨镜在学校里穿梭 喜欢耍酷 走到哪都是一道风景!学校每次演出 他都会参与 每次出场都会响起一阵女生崇拜的尖叫声。毕业后经常会在综艺选秀节目看到他的身影 当时会觉得他可能会成为一个大明星。时至今日 他现在的成就 和他的努力成正比 。
3、有本事你就照顾好自己,不然就老老实实地让我来照顾你一辈子。
4、不是在撩你,是真的想和你在一起。 也不是一点点喜欢你,是好喜欢好喜欢你。
5、我会在每一分钟的60秒每一个小时的60分钟每一天的24小时每一个星期的7天每一个月的31天每一年的365天想你,但是表白找不到人怎么办? 啊哈。
6、我试过一个人回家,我也试过一个人吃饭,一个人低头学习,一个人拿行李箱。可以亲爱的,因为你我认识了更多志同道合又惺惺相惜的人啊,你是我口袋里的男朋友,我多想有一天,自己很努力很优秀,只要静静的看着在台上闪闪发光的你就好了,一路披荆斩棘,也谢谢你这么优秀[爱心],这次换我们来保护你了。
7、今天是分手的第23天,我得心情不是很美妙。我选择忘记,重新开始,你昨晚缺还来找我!大胆!扰乱我的心神! 虽然我是个卖jia表的,但是你不能瞧不起我啊!。
8、阴天雨天晴天,都不如我这里的PT鞋。
9、我是同性恋,我超喜欢我的同桌。虽然大家都不认可,可我始终相信我们一定可以在一起的。郑浩!我爱你!
10、我还喜欢你,并不只是说说而已。希望你以后不要再遇到我这样的人,敏感 总爱瞎想 胆小怕事 懦弱 又不能让你快乐 也不能让你喜欢我 你很累吧 但是又希望你遇到像我这样的人 因为这样的人真的真的好喜欢你啊[哀伤]。
看到这里,我想说你们尽管秀,能伤害到我,就算我输,毕竟单身多年也是凭实力的。。。。。