网易云音乐评论 可视化分析

您所在的位置:网站首页 音乐的可视化是什么 网易云音乐评论 可视化分析

网易云音乐评论 可视化分析

2024-07-12 17:22| 来源: 网络整理| 查看: 265

       之前已经用python获取了网易云音乐的评论数据,下一步的工作就是数据分析了。一般数据分析无非是采用(统计)数字、图或者表的形式来展现数据之中隐含的信息。其中图和表显然是最直观的了。所以这里我使用可视化的方法即用图形来展示从评论中挖掘到的各种信息。

        可视化的工具有很多,比如常见的有excel还有一些专门的绘图软件,各个编程语言当然也有很多可视化的包或者库,比如统计上使用很多的R语言就有很多可视化的库,我最喜欢的就是ggplot2了,我使用R语言主要用于数据的清洗以及可视化,其丰富的包(package)大大简化了数据分析的工作量,而且可以绘制非常复杂、精美的图表,以后有机会可以给大家专门介绍一下。python中可视化的库也很多,最著名的的莫过于matplotlib了,这是一个面向对象的绘图库,很多方面的用法和matlab类似(从matlab的绘图风格借鉴而来),由于我以前使用过一段时间的matlab,所以上手还是比较快,其他的还有seaborn(据说是对matplotlib的改进和封装,使用起来更加方便,没用过,有时间再研究下)、pygraph等。但是使用最广泛的还是matplotlib。javascript有Echarts(百度的)等,这个我还没接触过,是一个可以网页上进行可视化的函数库,据说很棒。其他的当然还有特别多,这里我就不一一列举了。有兴趣的小伙伴可以自行去查阅资料。这里我决定使用matplotlib,主要是因为最近主要接触的就是python,但是数据可视化方面的库用的不多,刚好可以拿这次的数据来练练手,其次我接触过matlab,相信对matplotlib入手会更快一点。

         这次主要分析的有以下几个方面:1、一首歌曲评论数目随时间变化的趋势,比如每天的评论数变化,每月的评论数变化等等。2、一首歌曲点赞数目分布的情况,比如0-10赞有多少个,占多少比例,1000赞以上占多大比例等等。3、热门评论词云的制作,主要想通过词云,将文本挖掘的结果可视化,可以看出哪些是高频词汇等。4、一首歌曲评论者的基本信息的情况展示,比如评论者的地区分布,年龄分布、累计听歌数目分布、动态分布、粉丝数分布等等。通过这些信息,可以直观看出一首歌曲被哪些地区、哪些年龄段的人所喜爱,以及听歌的人具有什么的特点等等。

     好了,废话不多说了,直接上图吧。

         首先来看一些歌曲评论数随时间的变化。

图 1

图 2

图 3

图 4

图 5

         上面的5张图我分别选取了5首不同的歌曲,有华语歌曲也有英文歌曲,有的起止时间很长(从13年就开始),也有的起止时间很短(从最近几个月才开始)。总的来说可以分为两种模式,一种是开始一段时间评论数很少,后来逐渐呈现爆发式地增长,前面三首歌《同桌的你》、《七里香》、《All Too Well》都是这种模式,而后面两首歌《不要再孤单》、《stay》则是恰好相反,歌曲刚刚出来的那几天评论数猛增,后面评论数逐渐下降,之后趋于平稳。通过分析,其实也很好理解,第一种模式的歌曲,往往都是早期曲库中就存在的歌曲(也可以称之为“老歌”),那个时候网易云音乐才刚刚出来,用户数目还很少,所以这些歌曲每天的评论数很少(没记错的话网易云应该是12、13年左右才出来的吧),后来网易云一路走红,直至现在号称有2亿用户,由于用户基数大,所以这些经典的老歌自然评论数猛增了,可以想见,这种评论爆发式增长和网易云音乐用户的增长趋势应该是基本一致的。而至于第二种模式,出现这种模式的歌曲往往都是比较新的歌曲,而且往往伴随着影视剧的火热突然火起来,比如《不要再孤单》就是电影的主题曲,电影刚上映的那段时间,歌随影热,评论数自然爆发式增长,后来这段热潮过去了,评论数自然就降下来了(当然这种歌曲应该以网络歌曲居多,只是某一段时间特别火,不黑,我觉得真正的经典评论数应该不会大起大落,比如《晴天》、《see you again》等)。当然我只是分析了两种典型的评论随时间变化的模式,实际肯定不止这两种模式,大家可以自行去探索。

           

图 6

图 7

                前面5张图都是使用折线图来展示的,图6使用的是柱状图。我们来看下图7,图7展示的最近一段时间比较火的李玉刚的歌曲《刚好遇见你》的评论数随时间的分布,让人感到奇怪的是,中间从大约1月23日到3月24日的每天的评论量竟然是0!这怎么可能呢?难道真的是这样么?当然不是。我解释一下原因,这是程序本身的bug,我在抓取评论数过10W的歌曲的过程中发现,我最终看似抓取了全部的评论,但是实际上在去除重复之后,我只得到了部分的数据,每次大概只能得到2W到3W左右的数据,其他的数据就缺失了。至今我也没能解决这个问题,个人觉得是服务器做了什么限制,如果有朋友知道该怎么解决这个问题,望能不吝赐教!

      除了可以从宏观上看一首歌曲每天或者每月的评论数分布之外,我们还可以将不同的歌曲评论随时间变化放到一起对比,或者将一首歌曲每月的评论数放在一起进行对比。

图 8

图 9

图 10

                   图 8 就展示了四首不同的歌曲在某一个时间段评论数目随时间变化,图9展示了《同桌的你》从16年8月到17年3月这8个月的时间里每月评论数的分布情况,图10则是《越长大越孤单》从16年4月到17年3月这12个月的每月评论数分布。其实,这种图形很容易做出,因为我已经将绘图函数做了封装,可以设置自定义参数字典,来生成自己想要的不同的图形,也可以选择绘制图形的种类、颜色以及绘制的时间段、时间间隔等,在文末我会说明这一点。

       接下来,看一下评论点赞数目的分布情况。

图 11

图 12

    图10和图11展示的点赞数目分布我去除了10赞以下的,原因是我发现一首歌曲绝大部分的点赞数目(超过99%)都是10赞以下的,这也与我们的常识相一致,所以为了方便我就直接去除了。通过上面的两张图我们可以看出,红色区域面积最大,即100赞到1000占据了全部10赞以上评论的绝大部分,其次是10到100赞,然后是1000赞到10000赞,最少的是1W赞以上,我发现大部分歌曲基本都是呈现这个规律,所以只在这里简单提一下,就不做详细分析了。

           接下来分析歌曲热门评论的词云展示,其实python的词云,我之前的一篇随笔也有提到过,使用wordcloud(绘制词云)和jieba(中文分词)即可。这里就不细说了。直接看图吧。

图 13 《不要再孤单》词云

图 14   周杰伦热门50首歌曲热门评论词云

 

图 15 Taylor Swift 热门歌曲热门评论词云

    从以上的词云中还是可以看出一首歌曲或者一位歌手,评论区中出现频率最高的是哪些词的。比如杰伦 的热门评论中反复出现的词就有周杰伦、青春、喜欢、女朋友、故事等等,一股青春怀旧风扑面而来啊。哈哈,其他有意思的大家自己去分析吧。

    最后,我想重点来分析一下,一首歌曲的评论者个人信息具有什么样的特点。我将这些特点放在一张图中,通过多张饼图来展示了,见下。

图 16

图 17

图 18

图 19

图 20

图 21

图 22

     图 16 到 图 22 展示了不同的歌手(有中有外,有老有少)以及不同的歌曲(老歌和新歌)评论者多方面的信息分布。通过对比不难发现如下的规律。周杰伦粉丝主要还是以90后和95后为主,这二者之和超过80%。周杰伦、Taylor Swift、Bruno Mars 这三位歌手评论者累计听歌在1000到10000之间的人数(1000-10000算是累计听歌较多)占比要显著高于其他几个歌手,粉丝人数在10-100以及100-1000的比例也是如此,这几位都可以称得上时下的歌坛巨星,评论者的听歌数目以及粉丝人数可以在一定程度上反映出对音乐的喜爱程度以及对音乐的鉴赏力吧(不黑)。TFboys评论者中00后的比例高达25%,为列举的所有歌手中最高,其他歌手00后的比例均不超过10%,不过考虑到tf是美少男组合,这也就可以说的通了。刘德华歌曲的评论者中80后以及80前的比例之和近20%,而其他歌手这一数字基本在7%左右,这在一定程度上可以说明刘天王的粉丝最多的还是而立之后的中年人啊。再来看地区,一眼望去,无论是歌手还是歌曲,地区分布的前五中都出现了一个共同的身影,那就是北京市东城区,看来网易云上有相当一部分用户都是来自北京市东城区啊,不过考虑到北京市是我国的文化中心,许多明星、歌手均在北京定居,还有网易云上推荐的一些音乐人很多都在北京(东城区),这点就不难理解了。多次出现的地区还有广州市、成都市等等,这些都是经济较发达的地区,也是文化产业特别是音乐产业发达的地区(广州主要是粤语歌,而且离香港也很近,成都民谣应该很丰富(猜测))。这么一考虑,这些结果就不难理解了。当然,可以挖掘的其他信息还有很多,比如还有动态的分布等等,还可以按照音乐的类别进行对比等等,如果有兴趣,大家可以自己去完成这个工作。

      到这里,其实评论数据的可视化就差不多结束了。其实我做得很粗糙,很多分析也纯属我个人的臆测,大家随便看看就好。最后我还有几点要补充的。

                 在这次写代码的过程中,我一开始觉得应该写不了几行应该就把数据可视化搞定了,没想到最终还花了我挺长的时间,加到一起代码有七八百行,当然,很多东西都是可以精简的,我懒得去弄了。我将绘图的几个函数抽象了出来,可以通过简单地配置参数字典(settings)传入函数来配置自己想要的图形,比如可以控制要绘制散点图还是柱状图,控制颜色、时间间隔等等,只需要更改相应的参数字典就可以了。主要有两个类,一个是NetCloudCrawl类,主要用于歌曲评论数的抓取,还有一个是NetCloudProcessor,主要用于生成相关文件以及绘制可视化图形。几个主要的函数如下:1 create_all_necessary_files(song_id,song_name) 这个函数可以自动完成评论数据的抓取(包括热门评论)、保存到文件,生成必要的统计txt文件,生成词云等。只需要传入歌曲id(song_id)以及歌曲名字(song_name)即可。2 plot_comments(song_name,settings)函数,用于绘制基本的评论或者点赞图形,settings为参数字典,用于控制绘图方式以及呈现结果。3 sub_plot_comments(song_names_list,settings,row,col)用于在一张图中绘制多个歌曲的评论分布,song_names_list 为歌曲名字列表,settings 为绘图参数字典,row为子图行数,col为子图列数。  4 draw_wordcloud 用于绘制词云  5 sub_plot_months 用于在一张图中绘制某一首歌曲在某几个月(按月绘制)中的评论分布。6 sub_plot_commenters_info 用于绘制歌曲评论者的各项信息分布 。 还有三个 测试函数,分别是 sub_plot_months_test、subplot_test、plot_comments_test 直接调用相应的绘图函数,可以方便地在其中配置参数字典,然后直接调用测试函数即可绘制图形。所以绘制图形其实只有简单的两步:第一步,确定歌曲名称以及id(直接去网易云音乐上找相应歌曲链接即可,?id= 后面的数字就是歌曲id),然后调用create_all_necessary_files 生成所需要的文件;第二步:调用相应的绘图函数,一般只需要传入歌曲名字以及参数字典即可。

           最后还是附上全部的代码如下:

NetCloud_spider3.py 1 #!/usr/bin/env python2.7 2 # -*- coding: utf-8 -*- 3 # @Time : 2017/3/28 8:46 4 # @Author : Lyrichu 5 # @Email : [email protected] 6 # @File : NetCloud_spider3.py 7 ''' 8 @Description: 9 网易云音乐评论爬虫,可以完整爬取整个评论 10 部分参考了@平胸小仙女的文章(地址:https://www.zhihu.com/question/36081767) 11 post加密部分也给出了,可以参考原帖: 12 作者:平胸小仙女 13 链接:https://www.zhihu.com/question/36081767/answer/140287795 14 来源:知乎 15 ''' 16 from Crypto.Cipher import AES 17 import base64 18 import requests 19 import json 20 import codecs 21 import time 22 import os 23 24 # 定义抓取评论类NetCloudCrawl 25 class NetCloudCrawl(object): 26 def __init__(self): 27 # 头部信息 28 self.headers = { 29 'Host':"music.163.com", 30 'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0", 31 'Accept-Language':"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", 32 'Accept-Encoding':"gzip, deflate", 33 'Content-Type':"application/x-www-form-urlencoded", 34 'Cookie':"_ntes_nnid=754361b04b121e078dee797cdb30e0fd,1486026808627; _ntes_nuid=754361b04b121e078dee797cdb30e0fd; JSESSIONID-WYYY=yfqt9ofhY%5CIYNkXW71TqY5OtSZyjE%2FoswGgtl4dMv3Oa7%5CQ50T%2FVaee%2FMSsCifHE0TGtRMYhSPpr20i%5CRO%2BO%2B9pbbJnrUvGzkibhNqw3Tlgn%5Coil%2FrW7zFZZWSA3K9gD77MPSVH6fnv5hIT8ms70MNB3CxK5r3ecj3tFMlWFbFOZmGw%5C%3A1490677541180; _iuqxldmzr_=32; vjuids=c8ca7976.15a029d006a.0.51373751e63af8; vjlast=1486102528.1490172479.21; __gads=ID=a9eed5e3cae4d252:T=1486102537:S=ALNI_Mb5XX2vlkjsiU5cIy91-ToUDoFxIw; vinfo_n_f_l_n3=411a2def7f75a62e.1.1.1486349441669.1486349607905.1490173828142; [email protected]|1489375076|1|study|00&99|null&null&null#hub&420100#10#0#0|155439&1|study_client|[email protected]; NTES_CMT_USER_INFO=84794134%7Cm155****4439%7Chttps%3A%2F%2Fsimg.ws.126.net%2Fe%2Fimg5.cache.netease.com%2Ftie%2Fimages%2Fyun%2Fphoto_default_62.png.39x39.100.jpg%7Cfalse%7CbTE1NTI3NTk0NDM5QDE2My5jb20%3D; usertrack=c+5+hljHgU0T1FDmA66MAg==; Province=027; City=027; _ga=GA1.2.1549851014.1489469781; __utma=94650624.1549851014.1489469781.1490664577.1490672820.8; __utmc=94650624; __utmz=94650624.1490661822.6.2.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; playerid=81568911; __utmb=94650624.23.10.1490672820", 35 'Connection':"keep-alive", 36 'Referer':'http://music.163.com/', 37 'Upgrade-Insecure-Requests':"1" 38 } 39 # 设置代理服务器 40 self.proxies= { 41 'http:':'http://180.123.225.51', 42 'https:':'https://111.72.126.116' 43 } 44 # offset的取值为:(评论页数-1)*20,total第一页为true,其余页为false 45 # first_param = '{rid:"", offset:"0", total:"true", limit:"20", csrf_token:""}' # 第一个参数 46 self.second_param = "010001" # 第二个参数 47 # 第三个参数 48 self.third_param = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7" 49 # 第四个参数 50 self.forth_param = "0CoJUm6Qyw8W8jud" 51 self.encSecKey = "257348aecb5e556c066de214e531faadd1c55d814f9be95fd06d6bff9f4c7a41f831f6394d5a3fd2e3881736d94a02ca919d952872e7d0a50ebfa1769a7a62d512f5f1ca21aec60bc3819a9c3ffca5eca9a0dba6d6f7249b06f5965ecfff3695b54e1c28f3f624750ed39e7de08fc8493242e26dbc4484a01c76f739e135637c" 52 53 # 获取参数 54 def get_params(self,page): # page为传入页数 55 first_key = self.forth_param 56 second_key = 16 * 'F' 57 iv = "0102030405060708" 58 if(page == 1): # 如果为第一页 59 first_param = '{rid:"", offset:"0", total:"true", limit:"20", csrf_token:""}' 60 h_encText = self.AES_encrypt(first_param, first_key,iv) 61 else: 62 offset = str((page-1)*20) 63 first_param = '{rid:"", offset:"%s", total:"%s", limit:"20", csrf_token:""}' %(offset,'false') 64 h_encText = self.AES_encrypt(first_param, first_key, iv) 65 h_encText = self.AES_encrypt(h_encText, second_key, iv) 66 return h_encText 67 68 # 解密过程 69 def AES_encrypt(self,text, key, iv): 70 pad = 16 - len(text) % 16 71 text = text + pad * chr(pad) 72 encryptor = AES.new(key, AES.MODE_CBC, iv) 73 encrypt_text = encryptor.encrypt(text) 74 encrypt_text = base64.b64encode(encrypt_text) 75 return encrypt_text 76 77 # 获得评论json数据 78 def get_json(self,url, params, encSecKey): 79 data = { 80 "params": params, 81 "encSecKey": encSecKey 82 } 83 response = requests.post(url, headers=self.headers, data=data,proxies = self.proxies) 84 return response.content 85 86 # 抓取热门评论,返回热评列表 87 def get_hot_comments(self,url): 88 hot_comments_list = [] 89 hot_comments_list.append(u"用户ID 用户昵称 用户头像地址 评论时间 点赞总数 评论内容\n") 90 params = self.get_params(1) # 第一页 91 json_text = self.get_json(url,params,self.encSecKey) 92 json_dict = json.loads(json_text) 93 hot_comments = json_dict['hotComments'] # 热门评论 94 print("共有%d条热门评论!" % len(hot_comments)) 95 for item in hot_comments: 96 comment = item['content'] # 评论内容 97 likedCount = item['likedCount'] # 点赞总数 98 comment_time = item['time'] # 评论时间(时间戳) 99 userID = item['user']['userId'] # 评论者id 100 nickname = item['user']['nickname'] # 昵称 101 avatarUrl = item['user']['avatarUrl'] # 头像地址 102 comment_info = unicode(userID) + u" " + nickname + u" " + avatarUrl + u" " + unicode(comment_time) + u" " + unicode(likedCount) + u" " + comment + u"\n" 103 hot_comments_list.append(comment_info) 104 return hot_comments_list 105 106 # 抓取某一首歌的全部评论 107 def get_all_comments(self,url): 108 all_comments_list = [] # 存放所有评论 109 all_comments_list.append(u"用户ID 用户昵称 用户头像地址 评论时间 点赞总数 评论内容\n") # 头部信息 110 params = self.get_params(1) 111 json_text = self.get_json(url,params,self.encSecKey) 112 json_dict = json.loads(json_text) 113 comments_num = int(json_dict['total']) 114 if(comments_num % 20 == 0): 115 page = comments_num / 20 116 else: 117 page = int(comments_num / 20) + 1 118 print("共有%d页评论!" % page) 119 for i in range(page): # 逐页抓取 120 params = self.get_params(i+1) 121 json_text = self.get_json(url,params,self.encSecKey) 122 json_dict = json.loads(json_text) 123 if i == 0: 124 print("共有%d条评论!" % comments_num) # 全部评论总数 125 for item in json_dict['comments']: 126 comment = item['content'] # 评论内容 127 likedCount = item['likedCount'] # 点赞总数 128 comment_time = item['time'] # 评论时间(时间戳) 129 userID = item['user']['userId'] # 评论者id 130 nickname = item['user']['nickname'] # 昵称 131 avatarUrl = item['user']['avatarUrl'] # 头像地址 132 comment_info = unicode(userID) + u" " + nickname + u" " + avatarUrl + u" " + unicode(comment_time) + u" " + unicode(likedCount) + u" " + comment + u"\n" 133 all_comments_list.append(comment_info) 134 print("第%d页抓取完毕!" % (i+1)) 135 return all_comments_list 136 137 138 # 将评论写入文本文件 139 def save_to_file(self,list,filename): 140 with codecs.open(filename,'a',encoding='utf-8') as f: 141 f.writelines(list) 142 print("写入文件成功!") 143 144 # 抓取歌曲评论 145 def save_all_comments_to_file(self,song_id,song_name): 146 start_time = time.time() # 开始时间 147 url = "http://music.163.com/weapi/v1/resource/comments/R_SO_4_%d/?csrf_token=" % song_id 148 if(os.path.exists(song_name)): 149 filename = u"%s/%s.txt" % (song_name,song_name) 150 else: 151 os.mkdir(song_name) 152 filename = u"%s/%s.txt" % (song_name,song_name) 153 all_comments_list = self.get_all_comments(url) 154 self.save_to_file(all_comments_list,filename) 155 end_time = time.time() #结束时间 156 print(u"抓取歌曲《%s》耗时%f秒." % (song_name,end_time - start_time)) NetCloud_comments_plot.py 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2017/3/29 9:07 4 # @Author : Lyrichu 5 # @Email : [email protected] 6 # @File : NetCloud_comments_plot.py 7 ''' 8 @Description: 9 对抓取来的网易云评论数据进行简单的可视化分析 10 ''' 11 from NetCloud_spider3 import NetCloudCrawl 12 import requests 13 import matplotlib.dates as mdates 14 from pylab import * 15 mpl.rcParams['font.sans-serif'] = ['SimHei'] # 防止无法显示中文 16 import matplotlib.pyplot as plt 17 from datetime import datetime 18 import re 19 import time 20 import pandas as pd 21 import codecs 22 import jieba 23 from wordcloud import WordCloud 24 from scipy.misc import imread 25 from os import path 26 import os 27 28 29 class NetCloudProcessor(NetCloudCrawl): 30 # 读取评论文本数据,返回一个列表,列表的每个元素为一个字典,字典中包含用户id,评论内容等 31 def read_comments_file(self,filename): 32 list_comments = [] # 评论数据列表 33 with open(filename,'r') as f: 34 comments_list = f.readlines() # 读取文本,按行读取,返回列表 35 del comments_list[0] # 删除首个元素 36 comments_list = list(set(comments_list)) # 去除重复数据 37 count_ = -1 # 记录评论数 38 for comment in comments_list: 39 comment = comment.replace("\n","") # 去除末尾的换行符 40 try: 41 if (re.search(re.compile(r'^\d+?'),comment)): # 如果以数字开头 42 comment_split = comment.split(' ',5) # 以空格分割(默认) 43 comment_dict = {} 44 comment_dict['userID'] = comment_split[0] # 用户ID 45 comment_dict['nickname'] = comment_split[1] # 用户昵称 46 comment_dict['avatarUrl'] = comment_split[2] # 用户头像地址 47 comment_dict['comment_time'] = int(comment_split[3])# 评论时间 48 comment_dict['likedCount'] = int(comment_split[4])# 点赞总数 49 comment_dict['comment_content'] = comment_split[5] # 评论内容 50 list_comments.append(comment_dict) 51 count_ += 1 52 else: 53 list_comments[count_]['comment_content'] += comment # 将评论追加到上一个字典 54 except Exception,e: 55 print(e) 56 list_comments.sort(key= lambda x:x['comment_time']) 57 print(u"去除重复之后有%d条评论!" % (count_+1)) 58 return (count_+1,list_comments) # 返回评论总数以及处理完的评论内容 59 60 # 将网易云的时间戳转换为年-月-日的日期函数 61 # 时间戳需要先除以1000才能得到真实的时间戳 62 # format 为要转换的日期格式 63 def from_timestamp_to_date(self,time_stamp,format): 64 time_stamp = time_stamp*0.001 65 real_date = time.strftime(format,time.localtime(time_stamp)) 66 return real_date 67 68 69 # 统计相关数据写入文本文件 70 def count_comments_info(self,comments_list,count_,song_name): 71 x_date_Ym = [] # 评论数按年月进行统计 72 x_date_Ymd = [] # 评论数按年月日进行统计 73 x_likedCount = [] # 点赞总数分布 74 for i in range(count_): 75 time_stamp = comments_list[i]['comment_time'] # 时间戳 76 real_date_Ym = self.from_timestamp_to_date(time_stamp,'%Y-%m') # 按年月进行统计 77 real_date_Ymd = self.from_timestamp_to_date(time_stamp,'%Y-%m-%d') # 按年月日统计 78 likedCount = comments_list[i]['likedCount'] # 点赞总数 79 x_date_Ym.append(real_date_Ym) 80 x_date_Ymd.append(real_date_Ymd) 81 x_likedCount.append(likedCount) 82 x_date_Ym_no_repeat = [] 83 y_date_Ym_count = [] 84 x_date_Ymd_no_repeat = [] 85 y_date_Ymd_count = [] 86 x_likedCount_no_repeat = [] 87 y_likedCount_count = [] 88 # 年月 89 for date_ in x_date_Ym: 90 if date_ not in x_date_Ym_no_repeat: 91 x_date_Ym_no_repeat.append(date_) 92 y_date_Ym_count.append(x_date_Ym.count(date_)) 93 # 年月日 94 for date_ in x_date_Ymd: 95 if date_ not in x_date_Ymd_no_repeat: 96 x_date_Ymd_no_repeat.append(date_) 97 y_date_Ymd_count.append(x_date_Ymd.count(date_)) 98 99 for likedCount in x_likedCount: 100 if likedCount not in x_likedCount_no_repeat: 101 x_likedCount_no_repeat.append(likedCount) 102 y_likedCount_count.append(x_likedCount.count(likedCount)) 103 # 将统计的数据存入txt文件 104 with open(u"%s/comments_num_by_Ym.txt" % song_name,"w") as f: 105 f.write("date_Ym comments_num\n") 106 for index,date_Ym in enumerate(x_date_Ym_no_repeat): 107 f.write(x_date_Ym_no_repeat[index] + " " + str(y_date_Ym_count[index]) + "\n") 108 print(u"成功写入comments_num_by_Ym.txt!") 109 with open(u"%s/comments_num_by_Ymd.txt" % song_name,"w") as f: 110 f.write("date_Ymd comments_num\n") 111 for index,date_Ymd in enumerate(x_date_Ymd_no_repeat): 112 f.write(x_date_Ymd_no_repeat[index] + " " + str(y_date_Ymd_count[index]) + "\n") 113 print(u"成功写入comments_num_by_Ymd.txt!") 114 with open(u"%s/likedCount.txt" % song_name,"w") as f: 115 f.write("likedCount count_num\n") 116 for index,likedCount in enumerate(x_likedCount_no_repeat): 117 f.write(str(x_likedCount_no_repeat[index]) + " " + str(y_likedCount_count[index]) + "\n") 118 print(u"成功写入likedCount.txt!") 119 # 得到处理过的x_date 和 count 统计信息 120 def get_xdate_ycount(self,count_file_name,date_type,min_date_Ym,max_date_Ym,min_date_Ymd,max_date_Ymd): 121 with open(count_file_name,'r') as f: 122 list_count = f.readlines() 123 # comment_or_like = list_count[0].replace("\n","").split(" ")[1] # 判断是评论数还是点赞数 124 # song_name = count_file_name.split("/")[0] # 歌曲名字 125 del list_count[0] 126 x_date = [] 127 y_count = [] 128 for content in list_count: 129 content.replace("\n","") 130 res = content.split(' ') 131 if(date_type == '%Y-%m-%d'): 132 if(int("".join(res[0].split("-"))) >= int("".join(min_date_Ymd.split("-"))) and int("".join(res[0].split("-"))) = int("".join(min_date_Ym.split("-"))) and int("".join(res[0].split("-"))) = int("".join(min_date_Ymd.split("-"))) and int("".join(res[0].split("-"))) = int("".join(min_date_Ym.split("-"))) and int("".join(res[0].split("-")))


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3