最近在学Python爬虫,看了Blibili爬取网易云音乐评论的视频,视频中是将一首歌的评论存入json文件,我在此代码的基础上扩展了三点:
    1.爬取热歌榜200首歌曲的精彩评论;
    2.解析评论,爬取评论的内容、时间、用户、歌曲名字等数据;**
    3.将爬取的数据存入txt文本文件或者mysql数据库中。

参考代码

  • 存入txt文本文件代码
  • 存入Mysql数据库代码

  下面是我的一小点分析,代码附在最后





  下面是参考代码,逻辑有点乱,一些功能没有用函数封装,大家可以继续优化。

存入txt文本文件代码

# -*- coding: utf-8 -*-
# @Time    : 2021/11/10 11:21
# @Author  : MuTutuMumei
# @File    : Comment_txt.py# 爬取每首歌的ID和名称,改变参数ID获得不同歌曲的评论
# 爬取评论信息内容的步骤:
#1.找到未加密的参数        #window.arsea(参数,xxx,xxx,xxx)
#2.想办法把参数进行加密(必须参考网易的逻辑),params=>encText,encSecKey=>encSecKey
#3.请求到网易,拿到评论信息from Crypto.Cipher import AES
from base64 import b64encode
import requests,json
import time
import re
from lxml import etreeif __name__ == "__main__":headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40'}# 服务于d的f = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"g = "0CoJUm6Qyw8W8jud"e = "010001"i = "oStLTrr0FaYKC6IE"  # 手动固定的,网易是随机的def get_encSecKey():  # 因为i是固定的,所以这也是固定的return "bf0c12e363f8fca9793ddab0cf6e1ea72b5d1c84c136a11147ce1b8b25da43ba385a7df0b5c97f0f9fe8904a23e318757cef5b8fe9da78ba447bfffc89a3fd3fc99db34631b69dffabe2bf6849961452f751fc71302bc3259177f70b4fdbf9ae19a5bd58b1d8422f4f0c1319f32099cbf6bf871bf59e459f05247c009f0f41f5"#把参数进行加密def get_params(data):  #默认这里收到的是字符串first = enc_params(data,g)second = enc_params(first, i)return second  #返回的就是pramas#转化成16的倍数,为下方的加密算法服务def to_16(data):pad = 16 - len(data)%16data += chr(pad)*padreturn data#加密过程def enc_params(data,key):iv = "0102030405060708"data = to_16(data)aes = AES.new(key = key.encode("utf-8"),IV = iv.encode('utf-8'),mode = AES.MODE_CBC)bs = aes.encrypt(data.encode("utf-8"))   #加密,加密的长度是16的倍数return str(b64encode(bs),"utf-8")  #转化成字符串返回#处理加密过程'''function a(a) { a=16var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";for (d = 0; a > d; d += 1)e = Math.random() * b.length, #生成随机数e = Math.floor(e), #取整c += b.charAt(e); #取出b中对应位置的字符return c}function b(a, b) {var c = CryptoJS.enc.Utf8.parse(b), d = CryptoJS.enc.Utf8.parse("0102030405060708"), e = CryptoJS.enc.Utf8.parse(a) #e是数据, f = CryptoJS.AES.encrypt(e, c, { #c就是加密密钥 iv: d, #iv是偏移量mode: CryptoJS.mode.CBC # 模式:CBC加密});return f.toString()}function c(a, b, c) {var d, e;return setMaxDigits(131),d = new RSAKeyPair(b,"",c),e = encryptedString(d, a)}function d(d, e, f, g) { d:数据json串  e:"010001" f:   g = "0CoJUm6Qyw8W8jud"var h = {}, i = a(16); #16位随机值return h.encText = b(d, g), g是密钥h.encText = b(h.encText, i), #返回的就是params i是密钥h.encSecKey = c(i, e, f), #返回的是encSecKey e和f定死,能产生变数的只能是ih}'''#获取歌曲ID的列表,得到的是列表,从列表中正则解析出ID,再添加到一个列表中url_song = 'https://music.163.com/discover/toplist?id=3778678'resp = requests.get(url=url_song, headers=headers).texttree = etree.HTML(resp)song = tree.xpath('//div[@data-key="song_toplist-3778678"]/ul[@class="f-hide"]/li/a/@href')#歌曲名称在首页获取song_name = tree.xpath('//div[@data-key="song_toplist-3778678"]/ul[@class="f-hide"]/li/a/text()')obj = re.compile(r'\d+', re.S)songID_list = []for it in song:song_num = obj.findall(it)song_num_str = ''.join(song_num)songID_list.append(song_num_str)#print(song_list)Comment_mum = int(input('请输入每首歌要爬取的热评数量(不能超过15首):'))song_mum = int(input('请输入你要爬取评论的top歌曲数量(不能超过200首):'))print('开始爬虫!!!')song_count = 0  #这里记录第几首歌曲,获取歌曲名称的时候使用#request请求到歌曲详情页评论的地址for it in songID_list[0:song_mum]:url_comment = "https://music.163.com/weapi/comment/resource/comments/get?csrf_token="#请求方式是POSTdata = {'csrf_token': "",'cursor': "-1",'offset': "0",'orderType': "1",'pageNo': "1",'pageSize': "1",   #因为精彩热评只在第一页'rid': "R_SO_4_" + it,   #组合获得不同歌曲的评论'threadId': "R_SO_4_" + it}response = requests.post(url_comment,data={"params":get_params(json.dumps(data)),"encSecKey":get_encSecKey()},headers=headers)result = json.loads(response.content.decode('utf-8'))#注意文件打开的方式fp = open('./网易云评论.txt', 'a+', encoding='utf-8')fp.write('hotComments' + ' ' + '\n')#爬取hotComments并写入txt文本文件#字典镶嵌列表,列表镶嵌字典,注意如何使用  https://www.cnblogs.com/jiba/p/14945833.htmlfor hot in range(0,Comment_mum):fp.write('昵称:' + result['data']['hotComments'][hot]['user']['nickname'] + '\n')#昵称fp.write('歌曲名称:' + song_name[song_count] + '\n')  # 昵称fp.write('评论:' + result['data']['hotComments'][hot]['content'] + '\n')#评论# "time": 1561597817178# 13位的数字串是毫秒级别的时间戳,通过下边的代码转换为表转格式timeNum = result['data']['hotComments'][hot]['time']timeTemp = float(timeNum / 1000)tupTime = time.localtime(timeTemp)stadardTime = time.strftime("%Y-%m-%d %H:%M:%S", tupTime)fp.write('评论时间:' + stadardTime + '\n')#时间if result['data']['hotComments'][hot]['user']['vipRights'] == None:    #判断是否是VIPfp.write('vip:yes' + '\n')else:fp.write('vip:no' + '\n')fp.write('点赞数:' + str(result['data']['hotComments'][hot]['likedCount']) + '\n')#点赞数fp.write('-------------------------------------' + '\n')song_count = song_count + 1   #递增歌曲的名称fp.close()print('爬取完毕!!!')

  代码运行结果:

存入Mysql数据库代码

# -*- coding: utf-8 -*-
# @Time    : 2021/11/10 23:34
# @Author  : MuTutuMumei
# @File    : Comment_MYSQL.pyfrom Crypto.Cipher import AES
from base64 import b64encode
import requests,json
import time
import re
from lxml import etree
import pymysqlif __name__ == "__main__":#数据库参数设置db = pymysql.connect(host="localhost",port=3306,user="root",passwd="123456",database="wayimusic_comment",charset="utf8",autocommit=True) #在connect() 中加上参数autocommit并且给它赋值True这样就能自动检查是否真的入库cursor = db.cursor()headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.40'}# 关于解密参数的一些数据,服务于d的f = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"g = "0CoJUm6Qyw8W8jud"e = "010001"i = "oStLTrr0FaYKC6IE"  # 手动固定的,网易是随机的def get_encSecKey():  # 因为i是固定的,所以这也是固定的return "bf0c12e363f8fca9793ddab0cf6e1ea72b5d1c84c136a11147ce1b8b25da43ba385a7df0b5c97f0f9fe8904a23e318757cef5b8fe9da78ba447bfffc89a3fd3fc99db34631b69dffabe2bf6849961452f751fc71302bc3259177f70b4fdbf9ae19a5bd58b1d8422f4f0c1319f32099cbf6bf871bf59e459f05247c009f0f41f5"#把参数进行加密def get_params(data):  #默认这里收到的是字符串first = enc_params(data,g)second = enc_params(first, i)return second  #返回的就是pramas#转化成16的倍数,为下方的加密算法服务def to_16(data):pad = 16 - len(data)%16data += chr(pad)*padreturn data#加密过程def enc_params(data,key):iv = "0102030405060708"data = to_16(data)aes = AES.new(key = key.encode("utf-8"),IV = iv.encode('utf-8'),mode = AES.MODE_CBC)bs = aes.encrypt(data.encode("utf-8"))   #加密,加密的长度是16的倍数return str(b64encode(bs),"utf-8")  #转化成字符串返回#获取歌曲ID的列表,得到的是列表,从列表中正则解析出ID,再添加到一个列表中url_song = 'https://music.163.com/discover/toplist?id=3778678'resp = requests.get(url=url_song, headers=headers).texttree = etree.HTML(resp)song = tree.xpath('//div[@data-key="song_toplist-3778678"]/ul[@class="f-hide"]/li/a/@href')#歌曲名称在首页获取song_name = tree.xpath('//div[@data-key="song_toplist-3778678"]/ul[@class="f-hide"]/li/a/text()')obj = re.compile(r'\d+', re.S)songID_list = []for it in song:song_num = obj.findall(it)song_num_str = ''.join(song_num)songID_list.append(song_num_str)#print(song_list)Comment_mum = int(input('请输入每首歌要爬取的热评数量(不能超过15首):'))song_mum = int(input('请输入你要爬取评论的top歌曲数量(不能超过200首):'))print('开始爬虫!!!')song_count1 = 0  #这里记录第几首歌曲,获取歌曲名称的时候使用song_count2 = 0comment_count = 0 #记录数据库的评论数量#request请求到歌曲详情页评论的地址for it in songID_list[0:song_mum]:url_comment = "https://music.163.com/weapi/comment/resource/comments/get?csrf_token="#请求方式是POSTdata = {'csrf_token': "",'cursor': "-1",'offset': "0",'orderType': "1",'pageNo': "1",'pageSize': "1",   #因为精彩热评只在第一页'rid': "R_SO_4_" + it,   #组合获得不同歌曲的评论'threadId': "R_SO_4_" + it}response = requests.post(url_comment,data={"params":get_params(json.dumps(data)),"encSecKey":get_encSecKey()},headers=headers)result = json.loads(response.content.decode('utf-8'))#将评论信息存入MYSQL数据库for hot in range(0,Comment_mum):nickname = result['data']['hotComments'][hot]['user']['nickname'] #昵称songName = song_name[song_count1] # 昵称hot_comment = result['data']['hotComments'][hot]['content'] #评论# "time": 1561597817178# 13位的数字串是毫秒级别的时间戳,通过下边的代码转换为表转格式timeNum = result['data']['hotComments'][hot]['time']timeTemp = float(timeNum / 1000)tupTime = time.localtime(timeTemp)sta_Time = time.strftime("%Y-%m-%d %H:%M:%S", tupTime)if result['data']['hotComments'][hot]['user']['vipRights'] == None:    #判断是否是VIPVip = 0else:Vip = 1likedCount = result['data']['hotComments'][hot]['likedCount'] #点赞数sql = "insert into comment(ID,nickName,songName,comment,`datatime`,VIP,likedNum) " \"values(%d,'%s','%s','%s','%s',%d,%d)"%(comment_count,nickname,songName,hot_comment,sta_Time,Vip,likedCount)#  "insert into '表名'(字段名) values(值)"try:cursor.execute(sql)db.commit()  # 都插入成功,将结果提交给数据库print(str(comment_count)+' 歌曲:“'+songName+'”的评论信息'+'已经存入MYSQL数据库!!!')except Exception as e:db.rollback()  # 如果提交失败,结果回退到上一次提交的结果print("执行MySQL时出错:%s" %e)comment_count = comment_count + 1song_count1 = song_count1 + 1  # 递增歌曲的名称cursor.close()db.close()

  Mysql数据库的表结构:

  运行结果:

  数据表结果:

Python爬虫—爬取网易云音乐【热歌榜】歌曲的精彩评论(写入txt文本文件或者MySQL数据库)相关推荐

  1. Python3---站在大佬肩膀写爬虫-爬取网易云音乐热歌榜歌曲热评(精彩评论)

    和我一起加入CSDN----程序猿和攻城狮的社区 网易云音乐是我比较喜欢的一个音乐平台,对于特别热爱听歌的人来说,网易云音乐精准的音乐定位和独特歌曲推荐,让人使用起来很舒服.所谓:自古评论出人才,精彩 ...

  2. Python爬取网易云音乐热歌榜(爬虫)

    Python爬取网易云音乐热歌榜歌曲,并下载到本地 找到要下载歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更 ...

  3. python爬虫爬取音乐_利用python爬虫实现爬取网易云音乐热歌榜

    利用python爬虫实现爬取网易云音乐热歌榜 发布时间:2020-11-09 16:12:28 来源:亿速云 阅读:102 作者:Leah 本篇文章给大家分享的是有关利用python爬虫实现爬取网易云 ...

  4. 爬虫python代码网易云_python爬取网易云音乐热歌榜实例代码

    首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...

  5. python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜 python爬取网易云音乐热歌榜实例代码...

    想了解python爬取网易云音乐热歌榜实例代码的相关内容吗,FXL在本文为您仔细讲解python爬取网易云音乐热歌榜的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:python,网易热歌榜 ...

  6. python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜实例代码

    首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...

  7. python爬取歌曲_python爬取网易云音乐热歌榜实例代码

    首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...

  8. python爬取音乐排行_python爬取网易云音乐热歌榜实例代码

    首先找到要下载的歌曲排行榜的链接,这里用的是: https://music.163.com/discover/toplist?id=3778678 然后更改你要保存的目录,目录要先建立好文件夹,例如我 ...

  9. 爬虫练习:爬取网易云音乐热歌榜全部歌曲的热门评论

    目标:爬取网易云音乐热歌榜中全部歌曲(共200首)的热门评论(每首歌有15个热门评论) 分析: 需要分两步走,第一步是定位到热歌榜单所在的资源,从而得到这热歌榜中到底有哪些歌并获得每首歌的id:第二步 ...

  10. python爬取网易云音乐飙升榜音乐_Python爬虫实战,30行代码轻松爬取网易云音乐热歌榜...

    在开始讲解思路之前,我们首先了解下网络状态码,为什么要看这个呢?以后你会回来感谢我的,嘻嘻! 一般网络状态有以下几种: 200(成功) 服务器成功处理了请求.一般来说,这意味着服务器提供所请求的页面, ...

最新文章

  1. 在html中超链接_4.html5中超链接
  2. 在应用程序中操作NorFlash
  3. linux 从github拉取更新_2020年的GitHub年度报告,我看出了这些不一样的点
  4. Atitit 图像处理知识点  知识体系 知识图谱v2
  5. 【第三期】电商分布式前沿springboot接口服务之删除和更新-Array-专题视频课程...
  6. 十四届全国大学生“恩智浦”杯智能汽车竞赛信标组总结(3)
  7. mysql的常用英语_学习Mysql常用的英文单词
  8. ps手机计算机图标教程,ps制作手机图标的方法
  9. 芯片流片(晶圆制造)工艺服务的流程。 细节详解连载
  10. java判断百分数_Java 验证前台返回的是不是百分数 在后台用正则表达式验证百分比数据...
  11. 做IT精英还是IT民工? 从事IT只是个体力活
  12. 饥荒服务器模组全部显示冲突,饥荒联机洞穴设置及常见问题的解决方法
  13. 编程序,输出1/3-3/5+5/7-7/9…+19/21的结果
  14. csdn邻家割草_如何维护割草机,使其永远持续(几乎)
  15. 幂级数和函数经典例题_函数项级数和幂级数 习题课
  16. 【2020年天梯赛校选赛】7-16 愤怒的牛
  17. 跨境电商 阿里巴巴外贸 之 为什么我要做外贸!
  18. Camera ITS测试
  19. 1.1 机器学习和深度学习综述
  20. Frenet坐标系下横纵向轨迹决策规划(SL投影及ST投影)及Apollo决策算法解析

热门文章

  1. 电子墨水屏标签:低功耗处理器技术
  2. 辉芒微FT61F022A
  3. (一)验证微信公众平台
  4. H5开发在微信浏览器上,加载时“白屏”问题
  5. wordpress创建_您可以使用WordPress创建的19种网站类型
  6. 鸿蒙系统报名选择一个应用,申请鸿蒙系统有一个应用选择怎么选择呢
  7. AI全自动原创视频生成器-震撼来袭
  8. 用html5看板娘,记在nuxt.js中引入一个萌哒哒的看板娘(Live2d模型)
  9. Android如何让Fragment加载到Activity中
  10. 中国境内哪个chatGPT最好用