网易云音乐爬虫实战——肖战《红梅赞》下评论数据挖掘与分析

前言

这个学期终于结束,空余时间慢慢多了。正逢最近肖战余温又起,不如拿网易云练练手,蹭蹭这波热度。让我们本着科学的精神,用python爬虫和数据可视化来分析一下,究竟是怎样一首翻唱能在不到三个月内获得网易云评论100万+的成就。
本文以2020年7月1日0:00-23.59网易云歌曲“肖战 《红梅赞》”下评论进行分析。

本章工具

  • pycharm编译器
  • python3.7环境
  • 来自Binaryify的网易云音乐API这里是他的GitHub主页
  • 重要第三方库:requests、pandas、pyecharts等

这里重点感谢一下Binaryify的API,应该是目前最优秀的网易云音乐API,功能非常强大且相比于官方API不容易被封

数据挖掘部分

1.获取歌曲评论

最开始用的官方API:http://music.163.com/api/v1/resource/comments/R_SO_4_1439975538,但是因为网易云的反爬虫机制,会出现以下错误在这里插入图片描述
然后就找到了Binaryify开发的NeteaseCloudMusicApi,这里再次感谢Binaryify的开发与维护。
官方文档

# 获取URL
def get_url(Offset):
    url = 'http://localhost:3000/comment/music?id=1439975538&offset=' + str(Offset * 20) + '&limit=20'
    return url

# 获取评论
def get_20_imf(now_url):
    r = requests.get(now_url, headers=headers)
    # 评论信息
    result = r.json()['comments']
    # 用户ID
    user_ID = [n['user']['userId'] for n in result]
    # 用户名
    user_name = [n['user']['nickname'] for n in result]
    # 评论时间
    content_time = [n['time'] for n in result]
    # 评论内容
    content = [n['content'] for n in result]
    # 点赞数
    like_count = [n['likedCount'] for n in result]
    imf = pd.DataFrame({
        'userID': user_ID,
        'user_name': user_name,
        'content_time': content_time,
        'content': content,
        'like_count': like_count
    })
    return imf

#存入本地csv文件
HMZ = pd.DataFrame()
for i in range(60):  # 每次最多60页
    url = get_url(i)
    imf = get_20_imf(url)
    HMZ = HMZ.append(imf, ignore_index=True)
    print(i)
    # 休眠一秒
    time.sleep(1)
HMZ.to_csv('D:\\HMZ7.csv', sep=',', header=True, index=True)

在这里插入图片描述
顺利爬取评论信息,对部分格式进行处理

def IdTrans(userID):
    """ID去小数点变字符串"""
    userID = str(int(userID))
    return userID
data_hmz['userID'] = data_hmz['userID'].apply(lambda x: IdTrans(x))

def likedTrans(like_count):
    """点赞数去小数点"""
    like_count = int(like_count)
    return like_count
data_hmz['like_count'] = data_hmz['like_count'].apply(lambda x: likedTrans(x))

def timeTrans(content_time):
    """时间变为时分秒格式"""
    second = float(content_time / 1000)
    timeArray = time.localtime(second)
    content_time = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
    return content_time
data_hmz['content_time'] = data_hmz['content_time'].apply(lambda x: timeTrans(x))

处理过后:
在这里插入图片描述
最终合并7月1日当天评论信息数据共2717条。

2.根据ID获取用户信息

从上文得到的评论信息提取‘userId’字段,获取用户的公开数据。这里用到另一个接口:在这里插入图片描述
主要代码:

def get_user(user_id):
    # 获取用户信息
    data = {}
    url = 'http://localhost:3000/user/detail?uid=' + str(user_id)
    response = requests.get(url=url, headers=headers)
    js = json.loads(response.text)
    if js['code'] == 200:
    	# 性别
        data['gender'] = js['profile']['gender']
        if int(js['profile']['birthday']) < 0:
            # 年龄
            data['age'] = 0
        else:
            data['age'] = (2020 - 1970) - (int(js['profile']['birthday']) // (1000 * 365 * 24 * 3600))
            if int(data['age']) < 0:
                data['age'] = 0
        # 省份
        data['city'] = js['profile']['province']
        # 签名
        data['sign'] = js['profile']['signature']
    else:
        data['gender'] = '无'
        data['age'] = '无'
        data['city'] = '无'
        data['sign'] = '无'
    return data

用户信息:
在这里插入图片描述
用户信息爬取完成,共515条用户信息。这也意味着7月1日当天产生的2717条评论来自于515名网易云用户,人均5.3条评论。

数据分析部分

1.评论数时间分布

评论热度按小时分布画出折线图:


data_hmz['content_time'] = pd.to_datetime(data_hmz['content_time'])
hmzHour = data_hmz.content_time.dt.hour
hour_num = hmzHour.value_counts().sort_index()
hs = [str(h) for h in hour_num.index.tolist()]

# 折线图
line1 = (Line(init_opts=opts.InitOpts(width='1350px', height='350px'))
         .add_xaxis(hs)
         .add_yaxis('热度', hour_num.values.tolist(), label_opts=opts.LabelOpts(is_show=False))
         .set_global_opts(title_opts=opts.TitleOpts(title='评论数时间(按小时分布)'), visualmap_opts=opts.VisualMapOpts(max_=350))
         .set_series_opts(linestyle_opts=opts.LineStyleOpts(width=3)))
line1.render()

在这里插入图片描述
可以发现评论的时间主要集中在晚上8点到12点,并且呈现出比较明显的三级分布:

  • 0时-8时:低
  • 8时-20时:中,平均每小时评论数100条左右
  • 20时-24时:高,平均每小时300条左右

可以看出此歌受众者很多有睡前(20-24时)听歌的习惯,休息时间(0-8时)、工作与学习时间(8-20时)听歌频率较少。

2.评论内容词云

这里用到jieba库进行中文分词,wordcloud库绘制词云图片:

ata_hmz = pd.read_csv('data_hmz.csv')
cList = data_hmz.content.value_counts().sort_index().index.tolist()
text = " ".join(cList)

# 用jieba中文分词
jieba.load_userdict("dict.txt")
wordlist_jieba = jieba.lcut(text, cut_all=True)
wl_space_split = " ".join(wordlist_jieba)
# 绘图
my_wordcloud = wordcloud.WordCloud(background_color='white',
                                   width=1000,
                                   height=700,
                                   font_path='msyh.ttc',
                                   max_words=2000,
                                   scale=20,
                                   # 优化虚词
                                   stopwords={'什么','我们','你们','不是','就是','自己'})
my_wordcloud.generate(wl_space_split)
my_wordcloud.to_file('词云.png')

在这里插入图片描述
观察词云图片,大部分词应该出自肖战粉丝之口,如“哥哥”、“粉丝”、“加油”、“顺利”等。也有部分负面词语:“举报”、“抵制”、“讨厌肖战”、以及最近获得的金“扫帚”奖等

3.年龄分布柱状图

绘图分析年龄分布情况:

# 分箱
age_num['age_cut'] = pd.cut(age_num.age, bins=[10, 15, 20, 25, 30, 35, 40, 45])

# 分组汇总
age_cut_num = age_num.groupby('age_cut')['num'].sum()

# 绘图
bar1 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px'))
bar1.add_xaxis(age_cut_num.index.astype('str').tolist())
bar1.add_yaxis("数量", age_cut_num.tolist(), category_gap='20%')
bar1.set_global_opts(title_opts=opts.TitleOpts(title='评论用户年龄分布'),
                     visualmap_opts=opts.VisualMapOpts(max_=180),
                     toolbox_opts=opts.ToolboxOpts())
bar1.render()

在这里插入图片描述
在这里插入图片描述
年龄分布情况有点让我吃惊,高达74%的用户年龄无法查看——或是为了保护隐私,或是因为网易云社区风气,或是没有设置这些信息。
在已知的年龄信息中可以看到,主要年龄集中在(15,20]区间内,说明主要受众是15-20岁学生群体。另一个有趣的信息是频数第一的年龄为30岁,(25,30]区间也是肖战粉丝的主力军,难道这就是妈妈粉的由来?[/滑稽]

4.性别分布饼图

将性别数据绘成饼图:

pie1 = Pie(init_opts=opts.InitOpts(width='1200px',height='600px'))
pie1.add("",
         [*zip(['女', '未知', '男'],gender_percent.values)],
         radius=["40%", "65%"])
pie1.set_global_opts(title_opts=opts.TitleOpts(title='评论用户性别分布'),
                     legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"),
                     toolbox_opts=opts.TitleOpts())
pie1.set_series_opts(label_opts=opts.LabelOpts(formatter="{b} : {c}%"))
pie1.set_colors(['#D7655A', '#FFAF34', '#3B7BA9', '#EF9050', '#6FB27C'])
pie1.render()

在这里插入图片描述
性别分布比较明显,女性比例达55%,男性则不到20%,还有约25%用户没有公开性别信息。

综上,评论用户以15-20岁女性为主,男女比例约为11:4,评论中粉丝发言比例很高,语言较积极。所以,肖战凉了这个结论现在还为时尚早。

5.热评分析

在这里插入图片描述
肖战翻唱《红梅赞》版本下热评可谓魔幻。
15条热评全部发表在4月13日歌曲发布的7分钟内,且全部为高度赞扬的正面评价,共收获184.1万点赞。
其中4条热评甚至发表于歌曲发布3分钟内,而歌曲时长却大于3分钟。这意味着歌还没有播放完评论就已经发出,并且成为了点赞数最多的15条评论之一。

结语

说到红梅赞,这首闫肃作词的爱国歌曲,曾经是歌剧《江姐》的主题歌。5天前的6月27日,《烈火中永生》中江姐的扮演者于蓝奶奶永远地离开了我们。
在这个流量至上的时代,希望这种“流量焦点”的粉丝,能多去了解歌曲背后的故事,而不是单纯盲目地追求明星与流量、数据。
最后,本文仅为一次对网易云音乐的python爬虫实战,不针对任何人或事件,请勿上升高度。

  • 15
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
【资源说明】 基于LSTM的网易云音乐评论分析python源码+使用说明+数据集+模型.zip 基于LSTM的网易云音乐评论分析python源码+使用说明+数据集+模型.zip 基于LSTM的网易云音乐评论分析python源码+使用说明+数据集+模型.zip 数据仓库与数据挖掘课程设计。基于自然语言处理的歌曲评论情感分析,通过爬虫爬取网易云音乐歌曲评论,并通过LSTM模型分析音乐评论的情感分布。 依赖 ``` pip3 install -r requirements.txt ``` 组成 * webspider.py 爬虫 * statistic.py 统计评论情感分布 * wordcloud 词云 运行 训练LSTM模型,使用的数据集在`nlp/data/`目录下: ``` cd nlp python3 lstm.py ``` 爬取网易云歌曲评论: ``` python3 webspider.py ``` 用LSTM评价歌曲评论: ``` python3 statistic.py ``` 对歌曲评论绘制词云: ``` python3 wordcloud.py ``` 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
根据引用内容和,通过使用Python爬虫数据分析工具,可以对网易云音乐上的评论进行情感分析。具体步骤如下: 1. 使用Pycharm编译器和Python3.7环境来进行开发。 2. 使用Binaryify的网易云音乐API来获取评论数据。可以通过API接口获取评论用户ID、昵称、位置、评论内容、点赞数、用户头像地址和评论时间等信息。 3. 通过分析评论数据,可以进行中文分词、命名实体识别、关键词提取、句法分析、文本向量化、情感分析以及舆情分析等数据处理和应用。 4. 对评论进行情感分析可以了解用户对肖战红梅赞》的评论情感倾向。可以使用自然语言处理技术,如情感词典、机器学习模型等方法,将评论文本分类为正面、负面或中性情感。这样可以统计出正面评论、负面评论以及中性评论的数量,并分析用户的情感倾向。 以上就是关于如何通过Pycharm编译器、Python爬虫和数据可视化工具进行网易云音乐评论的情感分析的步骤。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [网易云音乐爬虫实战——肖战红梅赞》下评论数据挖掘分析](https://blog.csdn.net/JAVA_wangyi/article/details/107068244)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Python爬虫网易云音乐数据爬取(十五)](https://blog.csdn.net/weixin_42555080/article/details/90105330)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值