爬取网易云音乐评论并使用词云展示

最近听到一首很喜欢的歌,许薇的《我以为》,评论也很有趣,遂有想爬取该歌曲下的所有评论并用词云工具展示。

我们使用chrome开发者工具,发现歌曲的评论都隐藏在以 R_SO_4 开头的 XHR 文件中

接下来思路就很明确,拿到该文件,解析该文件的 json 数据,拿到全部评论。

我们可以看到该文件有两个用JS加密的参数 params 和 encSecKey ,关于这两个加密参数,参考了知乎用户的解答:https://www.zhihu.com/question/36081767 。

步骤:

1.导入必要的模块:

from Crypto.Cipher import AES
from wordcloud import WordCloud
#需加入下面两句话,不然会报错:matplotlib: RuntimeError: Python is not installed as a framework
import matplotlib
matplotlib.use(‘TkAgg‘)
import matplotlib.pyplot as plt
import base64
import requests
import json
import codecs
import time
import jieba

注:本人使用MacOS,在该环境下会报错,加入:

import matplotlib
matplotlib.use(‘TkAgg‘)

2.写入请求头:

headers = {
    ‘Host‘:‘music.163.com‘,
    ‘Origin‘:‘https://music.163.com‘,
    ‘Referer‘:‘https://music.163.com/song?id=28793052‘,
    ‘User-Agent‘:‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36‘
}

3.解析 params 和  encSecKey 这两个参数:

# 第一个参数
# first_param = ‘{rid:"", offset:"0", total:"true", limit:"20", csrf_token:""}‘
# 第二个参数
second_param = "010001"
# 第三个参数
third_param = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
# 第四个参数
forth_param = "0CoJUm6Qyw8W8jud"

# 获取参数
def get_params(page): # page为传入页数
    iv = "0102030405060708"
    first_key = forth_param
    second_key = 16 * ‘F‘
    if(page == 1): # 如果为第一页
        first_param = ‘{rid:"", offset:"0", total:"true", limit:"20", csrf_token:""}‘
        h_encText = AES_encrypt(first_param, first_key, iv)
    else:
        offset = str((page-1)*20)
        first_param = ‘{rid:"", offset:"%s", total:"%s", limit:"20", csrf_token:""}‘ %(offset,‘false‘)
        h_encText = AES_encrypt(first_param, first_key, iv)
    h_encText = AES_encrypt(h_encText, second_key, iv)
    return h_encText

# 获取 encSecKey
def get_encSecKey():
    encSecKey = "257348aecb5e556c066de214e531faadd1c55d814f9be95fd06d6bff9f4c7a41f831f6394d5a3fd2e3881736d94a02ca919d952872e7d0a50ebfa1769a7a62d512f5f1ca21aec60bc3819a9c3ffca5eca9a0dba6d6f7249b06f5965ecfff3695b54e1c28f3f624750ed39e7de08fc8493242e26dbc4484a01c76f739e135637c"
    return encSecKey

# 解密过程
def AES_encrypt(text, key, iv):
    pad = 16 - len(text) % 16
    text = text + pad * chr(pad)
    encryptor = AES.new(key, AES.MODE_CBC, iv)
    encrypt_text = encryptor.encrypt(text)
    encrypt_text = base64.b64encode(encrypt_text)
    encrypt_text = str(encrypt_text, encoding="utf-8") #注意一定要加上这一句,没有这一句则出现错误
    return encrypt_text

4.获取 json 数据并抓取评论:

# 获得评论json数据
def get_json(url, params, encSecKey):
    data = {
         "params": params,
         "encSecKey": encSecKey
    }
    response = requests.post(url, headers=headers, data=data)
    return response.content

# 抓取某一首歌的前100页评论
def get_all_comments(url,page):
    all_comments_list = [] # 存放所有评论
    for i in range(page):  # 逐页抓取
        params = get_params(i+1)
        encSecKey = get_encSecKey()
        json_text = get_json(url,params,encSecKey)
        json_dict = json.loads(json_text)
        for item in json_dict[‘comments‘]:
            comment = item[‘content‘] # 评论内容
            comment_info = str(comment)
            all_comments_list.append(comment_info)
        print(‘第%d页抓取完毕!‘ % (i+1))
        #time.sleep(random.choice(range(1,3)))  #爬取过快的话,设置休眠时间,跑慢点,减轻服务器负担
    return all_comments_list

5.使用结巴分词过滤停用词并用 wordcloud 生成词云:

#生成词云
def wordcloud(all_comments):
    # 对句子进行分词,加载停用词
    # 打开和保存文件时记得加encoding=‘utf-8‘编码,不然会报错。
    def seg_sentence(sentence):
        sentence_seged = jieba.cut(sentence.strip(), cut_all=False)  # 精确模式
        stopwords = [line.strip() for line in open(‘stopwords.txt‘, ‘r‘, encoding=‘utf-8‘).readlines()]  # 这里加载停用词的路径
        outstr = ‘‘
        for word in sentence_seged:
            if word not in stopwords:
                if word != ‘\t‘:
                    outstr += word
                    outstr += " "
        return outstr
    for line in all_comments:
        line_seg = seg_sentence(line)  # 这里的返回值是字符串
        with open(‘outputs.txt‘, ‘a‘, encoding=‘utf-8‘) as f:
            f.write(line_seg + ‘\n‘)

    data = open(‘outputs.txt‘, ‘r‘, encoding=‘utf-8‘).read()
    my_wordcloud = WordCloud(
        background_color=‘white‘,  #设置背景颜色
        max_words=200,  #设置最大实现的字数
        font_path=r‘SimHei.ttf‘,  #设置字体格式,如不设置显示不了中文
    ).generate(data)
    plt.figure()
    plt.imshow(my_wordcloud)
    plt.axis(‘off‘)
    plt.show()  # 展示词云

注意编码格式为 ‘utf-8‘ 。

6.定义主函数并设置函数出口:

def main():
    start_time = time.time()  # 开始时间
    url = "https://music.163.com/weapi/v1/resource/comments/R_SO_4_28793052?csrf_token="  # 替换为你想下载的歌曲R_SO的链接
    all_comments = get_all_comments(url, page=2000)  # 需要爬取的页面数
    wordcloud(all_comments)
    end_time = time.time()  # 结束时间
    print(‘程序耗时%f秒.‘ % (end_time - start_time))

if __name__ == ‘__main__‘:
    main()

运行过程如下(个人爬取了《我以为》的前2000页的评论):

生成词云:

完整代码已上传至 github:https://github.com/weixuqin/PythonProjects/tree/master/wangyiyun

原文地址:https://www.cnblogs.com/weixuqin/p/8905867.html

时间: 2024-10-29 19:05:52

爬取网易云音乐评论并使用词云展示的相关文章

python3.基础爬取网易云音乐【超详细版】

简单学习了python爬虫之后,我们就可以嘿咻嘿咻了...因为平时就是用网易云听的歌,也喜欢看歌里的评论,所以就爬网易云音乐评论吧! 正式进入主题 首先还是去找目标网页并开始分析网页结构,如下 上面的三个箭头都是所要找的数据,分别是评论用户,评论和点赞数,都可以用正则表达式找出来,接下来继续找怎样找到下一页的数据,还是用开发者工具,但是当点击下一页的时候,网页的url没有变,说明网页是动态加载,所以就不能在当前网页找数据了,应该在他的xhr文件里找,所以点入network看看,然后也点击下一页一

python爬取网易云音乐歌曲评论信息

网易云音乐是广大网友喜闻乐见的音乐平台,区别于别的音乐平台的最大特点,除了"它比我还懂我的音乐喜好"."小清新的界面设计"就是它独有的评论区了------各种故事汇,各种金句频出.我们可以透过歌曲的评论数来判断一个歌者的市场分量和歌曲的流行度.言归正传,如果我们想要简单爬取指定歌曲的评论内容来做词云或者其他相关数据分析,有没有容易上手的好方法呢? 首先,我们打开网易云音乐的网页版:https://music.163.com/,随便选择一首歌曲,如林志炫版本的<

如何用Python网络爬虫爬取网易云音乐歌词

前几天小编给大家分享了数据可视化分析,在文尾提及了网易云音乐歌词爬取,今天小编给大家分享网易云音乐歌词爬取方法. 本文的总体思路如下: 找到正确的URL,获取源码: 利用bs4解析源码,获取歌曲名和歌曲ID: 调用网易云歌曲API,获取歌词: 将歌词写入文件,并存入本地. 本文的目的是获取网易云音乐的歌词,并将歌词存入到本地文件.整体的效果图如下所示: 基于Python网易云音乐歌词爬取 赵雷的歌曲 本文以民谣歌神赵雷为数据采集对象,专门采集他的歌曲歌词,其他歌手的歌词采集方式可以类推,下图展示

python爬取网易云音乐歌单音乐

在网易云音乐中第一页歌单的url:http://music.163.com/#/discover/playlist/ 依次第二页:http://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=35 依次第三页:http://music.163.com/#/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8

xpath+多进程爬取网易云音乐热歌榜。

用到的工具,外链转换工具 网易云网站直接打开源代码里面并没有对应的歌曲信息,需要对url做处理, 查看网站源代码路径:发现把里面的#号去掉会显示所有内容, 右键打开的源代码路径:view-source:https://music.163.com/#/discover/toplist?id=3778678 去掉#号后:view-source:https://music.163.com/discover/toplist?id=3778678 资源拿到了,开始写代码: import requests

爬取网易云音乐(包括歌词和评论)

# http://music.163.com/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=35 # http://music.163.com/discover/playlist/?order=hot&cat=%E5%85%A8%E9%83%A8&limit=35&offset=70 from urllib import request,parse import pym

网易云音乐评论爬虫(2):歌曲的全部评论

用过网易云音乐听歌的朋友都知道,网易云音乐每首歌曲后面都有很多评论,热门歌曲的评论更是接近百万或者是超过百万条.现在我就来分享一下如何爬取网易云音乐歌曲的全部评论,由于网易云音乐的评论都做了混淆加密处理,因此我们需要深入了解它的加密过程之后才能爬取到网易云音乐歌曲的全部评论. 加qq群813622576或vx;tanzhouyiwan免费领取Python学习资料 一,首先分析数据的请求方式 网易云音乐歌曲页面的URL形式为https://music.163.com/#/song?id=歌曲id号

抓取网易云音乐歌曲热门评论生成词云

前言 抓数据 抓包分析 加密信息处理 抓取热门评论内容 词云 词云运行效果 总结 前言 网易云音乐一直是我向往的"神坛",听音乐看到走心的评论的那一刻,高山流水.于是今天来抓取一下歌曲的热门评论.并做成词云来展示,看看相对于这首歌最让人有感受的评论内容是什么. 做成词云的好处就是直观以及美观, 其他的我也想不出来有什么了. 抓数据 要想做成词云,首先得有数据才行.于是需要一点点的爬虫技巧. 抓包分析 加密信息处理 抓取热门评论内容 抓包分析 使用Chrome控制台.我们可以轻松的找到评

使用爬虫抓取网易云音乐热门评论生成好玩的词云

互联网爬虫是一个很有意思的技术,借由爬虫,我们可以做到很多好玩的事情--这其中就包括爬取评论. 词云就是个更好玩的技术,通过技术方法分析词语出现频率,生成可视化的图形,将文字内容用图形呈现,想想就很意思. 这次,我们就试着把这两个技术结合起来吧. 前言 网易云音乐一直是我向往的"神坛",听音乐看到走心的评论的那一刻,高山流水.于是今天来抓取一下歌曲的热门评论.并做成词云来展示,看看相对于这首歌最让人有感受的评论内容是什么. 做成词云的好处就是直观以及美观, 其他的我也想不出来有什么了.