python3爬取网易云音乐《我们》全部评论

article/2025/9/30 3:47:18

伴随着《后来的我们》的上映,这首歌的评论也是一路暴涨。如今让我们趁着这波秋风(虽然已经有点晚了),把这首歌的评论爬下来。虽然之前还打算做出词云可视化出来······然而,还是太懒了
之前爬过豆瓣《霸王别姬》的影评做过这个了,就不想做了QAQ

首先非常感谢之前大佬们贡献,没有他们,我肯定爬不下来这个的。其次这首歌一共12万条评论,但是实际上这部分代码只爬到630页也就是1万多条评论就报了一个错误,但是可以进行改进以得到所有评论。

参考文章链接:https://www.jianshu.com/p/87c022b19669
https://www.zhihu.com/question/36081767
https://blog.csdn.net/qq_28304687/article/details/78678851

  • 分析网页
    打开PC端,搜索《我们》这首歌,打开开发者模式,选择Network

image.png

接下来我们来看一下返回正文,也就是Preview内容都包含了什么

image.png

事先声明一下:作者本次程序直接拿到了json格式的Comment的全部内容,并未对其进行进一步的解析。
接下来我们看一下此次post请求所需要的各种参数:

image.png

parmas和encSecKey是经过加密算法产生的两个参数,幸运的是我们并不是很需要懂它的加密原理,已经有不少的大佬解析过网易云音乐的加密原理了。我们直接拿过来用就可以了。

#如果想要详细了解这部分内容的话,请参考https://www.zhihu.com/question/36081767
也可以参照这个完整的项目,不过是python2写的:https://blog.csdn.net/qq_28304687/article/details/78678851

这里贴一下得到这两个参数的代码:

# 首先生成长度为16的随机字符串作为密钥secKeydef createSecretKey(self,size):return (''.join(map(lambda xx: (hex(ord(xx))[2:]), str(os.urandom(size)))))[0:16]
 # 然后进行aes加密def aesEncrypt(self,text, secKey):pad = 16 - len(text) % 16#print("leix")#print(type(text))#print(type(pad * chr(pad)))if isinstance(text,bytes):#print("type(text)=='bytes'")text=text.decode('utf-8')text = text + str(pad * chr(pad))encryptor = AES.new(secKey, AES.MODE_CBC, '0102030405060708')ciphertext = encryptor.encrypt(text)ciphertext = base64.b64encode(ciphertext)return ciphertext
# 再进行rsa加密def rsaEncrypt(self,text, pubKey, modulus):text = text[::-1]#rs = int(text.encode('hex'), 16) ** int(pubKey, 16) % int(modulus, 16)rs = int(codecs.encode(text.encode('utf-8'),'hex_codec'), 16) ** int(pubKey, 16) % int(modulus, 16)return format(rs, 'x').zfill(256)
# 将明文text进行两次aes加密获得密文encText,因为secKey是在客户端上生成的,所以还需要对其进行RSA加密再传给服务端def encrypted_request(self,text):modulus = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'nonce = '0CoJUm6Qyw8W8jud'pubKey = '010001'text = json.dumps(text)secKey = self.createSecretKey(16)encText = self.aesEncrypt(self.aesEncrypt(text, nonce), secKey)encSecKey = self.rsaEncrypt(secKey, pubKey, modulus)data = {'params': encText,'encSecKey': encSecKey}return data

到这里我们需要的最难拿到的的参数就已经得到了
其他需要的参数还有headers,这个直接赋值headers里的就行了,还有一个offset偏移量的参数,来限制显示不同页的评论。参数可以这样得到

    # 偏移量def get_offset(self, offset):if offset == 0:text = {'rid': '', 'offset': '0', 'total': 'true', 'limit': '20', 'csrf_token': ''}else:text = {'rid': '', 'offset': '%s' % offset, 'total': 'false', 'limit': '20', 'csrf_token': ''}return text

这次我们是真的拿到了所有参数,可以向网页发出request请求,然后拿到我们想要的网页内容了。
请求是这样发出的:

    def get_post_req(self, url, data):try:req = requests.post(url, headers=self.headers, data=data)print("已连接上网易云音乐")except Exception as e:print (url)print(e)if(req==""):print("什么都没有抓取到")else:#print(req.json())#这里我们就得到了所有的json格式的评论了,并把它写进了txt文本with codecs.open(filename, 'a', encoding='utf-8') as f:f.writelines(req.text)print("----------------")return req.json()

接下来只需要把得到的json格式的网页源码进行解析就可以了,用re正则表达式匹配也好,用beautifulsoup解析也行,都不是很难。

下面就贴出本次的全部代码吧:

# -*-coding:utf-8-*-
'author:guoya'
import os
import time
import json
import base64import requestsimport codecs
from Crypto.Cipher import AES
class CommentCrawl(object):'''评论的API封装成一个类,直接传入评论的API,再调用函数get_song_comment()和get_album_comment()即可分别获取歌曲和专辑的评论信息 '''def __init__(self,comment_url):self.comment_url = comment_urlself.headers = {"Referer":"http://music.163.com/song?id=551816010","User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36",}# 生成长度为16的随机字符串作为密钥secKeydef createSecretKey(self,size):return (''.join(map(lambda xx: (hex(ord(xx))[2:]), str(os.urandom(size)))))[0:16]# 进行aes加密def aesEncrypt(self,text, secKey):pad = 16 - len(text) % 16#print("leix")#print(type(text))#print(type(pad * chr(pad)))if isinstance(text,bytes):#print("type(text)=='bytes'")text=text.decode('utf-8')text = text + str(pad * chr(pad))encryptor = AES.new(secKey, AES.MODE_CBC, '0102030405060708')ciphertext = encryptor.encrypt(text)ciphertext = base64.b64encode(ciphertext)return ciphertext# 进行rsa加密def rsaEncrypt(self,text, pubKey, modulus):text = text[::-1]#rs = int(text.encode('hex'), 16) ** int(pubKey, 16) % int(modulus, 16)rs = int(codecs.encode(text.encode('utf-8'),'hex_codec'), 16) ** int(pubKey, 16) % int(modulus, 16)return format(rs, 'x').zfill(256)# 将明文text进行两次aes加密获得密文encText,因为secKey是在客户端上生成的,所以还需要对其进行RSA加密再传给服务端def encrypted_request(self,text):modulus = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'nonce = '0CoJUm6Qyw8W8jud'pubKey = '010001'text = json.dumps(text)secKey = self.createSecretKey(16)encText = self.aesEncrypt(self.aesEncrypt(text, nonce), secKey)encSecKey = self.rsaEncrypt(secKey, pubKey, modulus)data = {'params': encText,'encSecKey': encSecKey}return datadef get_post_req(self, url, data):try:req = requests.post(url, headers=self.headers, data=data)print("已连接上网易云音乐")except Exception as e:print (url)print(e)if(req==""):print("什么都没有抓取到")else:#print(req.json())#这里我们就得到了所有的json格式的评论了,并把它写进了txt文本with codecs.open(filename, 'a', encoding='utf-8') as f:f.writelines(req.text)print("----------------")return req.json()# 偏移量def get_offset(self, offset):if offset == 0:text = {'rid': '', 'offset': '0', 'total': 'true', 'limit': '20', 'csrf_token': ''}else:text = {'rid': '', 'offset': '%s' % offset, 'total': 'false', 'limit': '20', 'csrf_token': ''}return text# 得到json格式的评论def get_json_data(self,url,offset):text = self.get_offset(offset)data = self.encrypted_request(text)json_text = self.get_post_req(url, data)return json_textdef get_song_comment(self):'''某首歌下全部评论 '''comment_info = []data = self.get_json_data(self.comment_url, offset=0)comment_count = data['total']#comment_count = 3if comment_count:comment_info.append(data)if comment_count > 20:for offset in range(20, int(comment_count), 20):print("开始爬取第{}页".format(offset/20))comment = self.get_json_data(self.comment_url, offset=offset)comment_info.append(comment)return comment_infodef get_album_comment(self, comment_count):'''某专辑下全部评论 '''album_comment_info = []if comment_count:for offset in range(0, int(comment_count), 20):comment = self.get_json_data(self.comment_url, offset=offset)album_comment_info.append(comment)return album_comment_infodef save_to_file(list, filname):with codecs.open(filename, 'a', encoding='utf-8') as f:f.writelines(list)print("写入文件成功!")start_time = time.time()
filename = "后来的我们.txt"
comment_url='http://music.163.com/weapi/v1/resource/comments/R_SO_4_551816010?csrf_token='
all_coment=[]
craw_song_pinglun=CommentCrawl(comment_url)
print("开始")
all_coment=craw_song_pinglun.get_song_comment()
print("--------------")end_time = time.time()  # 结束时间
print("程序耗时%f秒." % (end_time - start_time))
print("已完成")

本次程序爬取到630页的报了一个错误。建议优化及改进方案:爬完每页之后sleep几秒,或者尝试多线程爬取,或者换ip。我已经不太想继续研究这个了 。爬取内容和源码已上传到百度云盘。链接:https://pan.baidu.com/s/1gJxxzxFOMQWII4ORNh4f5A) 密码:kmjj
image.png

后面这个就和题目无关了。
word_cloud_霸王别姬.jpg

yuji.jpg


http://chatgpt.dhexx.cn/article/xHa5GMTh.shtml

相关文章

行业分析常用到的21个网站

行业分析常用到的21个网站 前言 今天写《就业乱世,如何正面应战!【所长】》笔记的时候在里面找到了作者分析行业常用到的21个网站。于是我也看一看。还是有不少启发的。让我一目了然知道对哪些公司看哪些数据。我之前接触得迷迷糊糊的,知道…

2021高考热度最高专业,大数据分析告诉你

又是一年高考季。 经历了十二年苦读的学子们,终于到了真枪实弹、一考定输赢的时候了。小编不由自主替这些学子们捏了一把冷汗。 高考的重要性不言而喻,这是一场不同于平时的测试,在未来的人生里,高考扮演着举足轻重的角色。通过自…

卷积神经网络 神经网络,卷积神经网络基础知识

卷积神经网络通俗理解 。 卷积神经网络(ConvolutionalNeuralNetworks,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(FeedforwardNeuralNetworks),是深度学习(deeplearning)的代表算法…

【信息检索】文档评分和概率检索模型

(1). 用Java语言或其他常用语言计算附件“HW4_1.txt”中的80个英文文档(每行表示一个document,文档编号1~80)两两之间的相似度值,并据此为每个文档返回相似度最大的3个文档。 要求使用cosine similarity和TF-IDF计算文档之间的相…

三个优秀的PyTorch实现语义分割框架

向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程 公众号:datayx 使用的VOC数据集链接开放在文章中,预训练模型已上传Github,环境我使用Colab pro,大家下载模型做预测即可。 代码链接: h…

google crx Hoxx 下载

Hoxx download links. Chrome crx https://base1-hx.diltwo.com//public/Chrome/Firefox XPI https://base1-hx.diltwo.com//public/Firefox/Android api https://base1-hx.diltwo.com//public/Android/ crx 下载地址 https://www.crx4chrome.com/crx/39922/ https://www.crx4…

Chrome安装CRX插件方法

一.前言 Chrome插件有:extension,app, NaCl(Native Client), PNaCl(Portable Native Client)等。但因为安全性,兼容性等各种原因,Chrome官方已经宣布:逐渐废弃其它类型的插件,只保留…

Chrome:拖入crx文件时,显示“无法从该网站添加应用、扩展程序和用户脚本”问题

问题现象 问题解决方案 1)打开新的页签,输入网址:chrome://flags/#extensions-on-chrome-urls 2)Extensions on chrome:// URLs 由Disabed修改为Enabled

Chrome如何安装第三方扩展插件(crx)

Chrome安装第三方扩展插件(crx) 前言 新版本Chrome浏览器会对非Chrome应用商城的扩展应用安装进行限制,安装后会提示“该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的。”。 上述问题的一种解决方式是将CRX文件进行解压后进行…

Chrome谷歌浏览器安装crx后缀插件方法

Chrome谷歌浏览器安装crx后缀插件方法; 很多小伙伴还是习惯用以前的crx后缀谷歌浏览器插件,但是自从2018年之后,谷歌新版本升级;不支持直接拖拽的形式安装这类插件了; 之后的新版本(目前已经升级到v80版本…

Chrome 解决 CRX HEADER INVALID 问题

文章目录 1. 问题2. 原因3. 解决方法3.1 方法一:将 crx 扩展程序解压开,然后加载已解压的扩展程序安装3.2 方法二:将 crx 的文件扩展名更改为 zip,然后拖拽安装3.3 方法三:使用 73 及后续版本打包的 crx,直…

建一个chrome插件crx所需步骤

建一个文件夹 文件夹下建以下几个文件 manifest.json:主要的配置文件 popup.html:主要的承载页面 icon.ico:插件的图标 引入的popup.js是html所涉及的js功能代码 因为是纯js的,所以需要提前引入jquery方便后期事件绑定 chrome插…

新版Edge浏览器安装外部扩展(.crx)的方法

先准备好插件文件: xxx.crx格式 然后改变后缀名,从.crx改为.zip格式 然后把这个.zip文件解压到你电脑的任意位置,最好是Edge浏览器的安装位置附近建一个edge文件夹里,后期方便查找更新。 比如我的目录: 我的操作&am…

谷歌浏览器Crx插件库-https://crxdl.com/

地址:https://crxdl.com/ postman插件:talend json插件库:csdn插件 抓取视频:猫抓

chrome浏览器添加crx插件

1.首先把crx文件修改名字,改成.zip结尾的文件 2.把需要的zip解压 3.chrome浏览器打开开发者模式 4.加载已解压的扩展程序 5.先添加tampermonkey,再添加simple-allow-copy 6.把扩展程序固定到浏览器工具栏 7.在bd文库中,先点亮扩展程序&#x…

谷歌浏览器(chrome)安装crx插件

1、下载crx插件 2、插件扩展名改名为zip 3、解压zip文件 4、打开谷歌浏览器扩展程序 chrome://extensions/ 5、打开开发者模式,加载已解压的扩展程序,安装成功即如图展示

chrome浏览器安装插件,提示程序包无效

chrome浏览器安装插件的时候,如果提示 程序包无效:“CRX_HEADER_INVALID”,导致插件安装不上去,这个时候该怎么办呢?通常,这种错误在chrome浏览器版本73,以及之后的版本会出现 一、工具/原料 1…

谷歌浏览器(Chrome)如何安装crx插件?(详细步骤)

一、前言 谷歌浏览器在旧版本(大概是v67版本)之前安装crx插件都非常简单,直接将crx拖放到浏览器内就可以安装了。但是之后的新版本(目前已经升级到v80版本)就只允许用户通过谷歌应用商店安装插件,而不允许…

一份工作一年半的java开发个人简历,欢迎拍砖

一份个人简历,大四提前一年出来实习,在12306。 2020年毕业,开始第二份正式工作。 从大学毕业,只是我学习之路的刚刚开始。 简历所写的内容都是真实的,一点水分没有。 欢迎拍砖,希望大家能够针对我的简历&a…

java开发工程师简历模板,2022最新

模块科技招聘官莅临千锋教育 招聘Java开发工程师招聘官谢经理莅临千锋教育成都分校招聘10位Java开发工程师,谢经理在面试前的宣讲会上,为学员详细介绍了模块科技的发展现状和岗位需求,让学员对公司和岗位有了充分的认识。在随后的面试环节,学员们基于对企业的了解和自身职业发展…