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

用过网易云音乐听歌的朋友都知道,网易云音乐每首歌曲后面都有很多评论,热门歌曲的评论更是接近百万或者是超过百万条.现在我就来分享一下如何爬取网易云音乐歌曲的全部评论,由于网易云音乐的评论都做了混淆加密处理,因此我们需要深入了解它的加密过程之后才能爬取到网易云音乐歌曲的全部评论.

一,首先分析数据的请求方式

网易云音乐歌曲页面的URL形式为https://music.163.com/#/song?id=歌曲id号,这里我用Delacey的Dream it possible 为例进行讲解,它的URL为https://music.163.com/#/song?id=38592976.接下来开始分析数据的请求方式.

由于网易云音乐的评论是通过Ajax传输,我们打开浏览器的开发者工具(检查元素),选中控制面板中的Network,再点击XHR(捕获ajax数据),然后点击左上角的重新加载,会看到下面图片中的数据请求列表

点击R_SO_4_38592976?csrf_token=cdee144903c5a32e6752f50180329fc9这一行,再点击Preview

发现我们所需要的数据就在这json格式的数据中,其中comments中是第一页的全部评论,一共20条,hotcomments是精彩评论一共有15条,每首歌曲只有第一页评论才有精彩评论.接着看一下它的请求头,点击Headers

我们发现的它是个post请求,向下滑你会发现这个post请求还带有数据

这些数据都是经过加密处理的,因此我们需要分析它的加密过程来生成相应的参数,然后把加密后的参数加到post请求中才能获取到我们需要的评论数据.

二,分析加密过程

通过断点调试发现params和encSecKey是由js脚本中的window.asrsea()函数生成的.

我们发现window.asrsea()函数有4个参数,在浏览器的js控制台分别对这四个参数进行调试:

后面三个参数是定值,只有第一个参数是控制评论页面偏移量的参数,它是一个变量.笔者经过分析发现第一个参数的形式是:

{"rid":"R_SO_4_38592976","offset":"0","total":"True","limit":"20","csrf_token":""}

下面我来详细讲解这个变量的发现过程:

首先找到core_dfe56728795d119e4d476fd09ea2dc51.js这个js脚本,然后将断点打在第12973行,点击第一页评论,页面加载到断点处便停止了

通过这几页的分析,我们可以得到i1x值的变化规律,且可以得到它的一般形式:

{"rid":"R_SO_4_38592976","offset":"0","total":"True","limit":"20","csrf_token":""}

offset和limit是必选参数,其他参数是可选的,其他参数不影响data数据的生成,offset (页面偏移量) = (页数-1) * 20, 注意limit最大值为100,当设为100时,获取第二页时,默认前一页是20个评论,也就是说第二页最新评论有80个,有20个是第一页显示的.因此我们可以构造第一个参数为:

# 偏移量,page是页数

offset = (page-1) * 20

msg = '{"offset":' + str(offset) + ',"total":"True","limit":"20","csrf_token":""}'

接下来,我们来看一下window.asrsea()函数的整个加密过程:

!function() {

// 函数a生成长度为16的随机字符串

function a(a) {

var 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);

, d = CryptoJS.enc.Utf8.parse("0102030405060708")

return c

}

// 函数b实现AES加密

function b(a, b) {

var c = CryptoJS.enc.Utf8.parse(b)

return f.toString()

, e = CryptoJS.enc.Utf8.parse(a)

, f = CryptoJS.AES.encrypt(e, c, {

iv: d,

mode: CryptoJS.mode.CBC

});

}

e = encryptedString(d, a)

// 函数c实现RSA加密

function c(a, b, c) {

var d, e;

return setMaxDigits(131),

d = new RSAKeyPair(b,"",c),

}

h.encSecKey = c(i, e, f),

function d(d, e, f, g) {

var h = {}

, i = a(16);

return h.encText = b(d, g),

h.encText = b(h.encText, i),

h

}

}();

function e(a, b, d, e) {

var f = {};

return f.encText = c(a + e, b, d),

f

}

window.asrsea = d,

window.ecnonasr = e

window.asrsea()函数就是上面的d函数,现在我们来看函数d:

function d(d, e, f, g) {

var h = {}

return h.encText = b(d, g), // 第一次AES加密

, i = a(16);

h.encText = b(h.encText, i), // 第二次AES加密

h.encSecKey = c(i, e, f), // RSA加密

h

}

参数h.encText是经过两次AES加密得到的,h.encSecKey是经过一次RSA加密得到的,其中i是随机生成的长度为16的随机字符串.

三,生成加密参数

首先我们需要生成长度为16的随机字符串,这里我们仿照上面的javascript的实现,用Python生成16位长的随机字符串:

# 生成随机字符串

def generate_random_strs(length):

string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

# 控制次数参数i

i = 0

# 初始化随机字符串

random_strs = ""

while i < length:

random_strs = random_strs + list(string)[e]

e = random.random() * len(string)

# 向下取整

e = math.floor(e)

i = i + 1

return random_strs

接着用Python实现AES加密,这里要用到pycrypto库,先安装好这个库:

pip install pycrypto

然后导入加密模块:

from Crypto.Cipher import AES

由于AES加密的明文长度必须是16的倍数,因此我们需要对明文进行必要的填充,以满足它的长度是16的倍数:

# msg是需要加密的明文,如果不是16的倍数则进行填充(paddiing)

padding = 16 - len(msg) % 16

msg = msg + padding * chr(padding)

# 这里使用padding对应的单字符进行填充

AES加密的模式是AES.MODE_CBC,初始化向量iv=’0102030405060708′,具体的AES加密:

# AES加密

def AESencrypt(msg, key):

# 如果不是16的倍数则进行填充(paddiing)

padding = 16 - len(msg) % 16

# 这里使用padding对应的单字符进行填充

msg = msg + padding * chr(padding)

# 用来加密或者解密的初始向量(必须是16位)

iv = '0102030405060708'

# 加密后得到的是bytes类型的数据

cipher = AES.new(key, AES.MODE_CBC, iv)

encryptedbytes = cipher.encrypt(msg)

# 对byte字符串按utf-8进行解码

# 使用Base64进行编码,返回byte字符串

encodestrs = base64.b64encode(encryptedbytes)

return enctext

enctext = encodestrs.decode('utf-8')

然后是RSA加密.首先我简单介绍一下RSA的加密过程.在RSA中,明文,密钥和密文都是数字.RSA的加密过程可以用下列的公式来表达,这个公式非常的重要,你只有理解了这个公式,才能用Python实现RSA加密.

密文 = 明文E mod N (RSA加密)

RSA的密文是对代表明文的数字的E次方求mod N 的结果, 通俗的讲就是将明文和自己做E次乘法,然后将其结果除以N 求余数,这个余数就是密文.

下面来看具体的RSA加密代码实现:

# RSA加密

def RSAencrypt(randomstrs, key, f):

# 随机字符串逆序排列

# 将随机字符串转换成byte类型数据

string = randomstrs[::-1]

seckey = int(codecs.encode(text, encoding='hex'), 16)**int(key, 16) % int(f, 16)

text = bytes(string, 'utf-8')

# 返回整数的小写十六进制形式

return format(seckey, 'x').zfill(256)

RSA加密后得到的字符串长为256,如果不够长则进行填充(不足部分在左侧添0).

最后就是获取那两个加密参数:

# 获取参数

def get_params(page):

# msg也可以写成msg = {"offset":"页面偏移量=(页数-1) * 20", "limit":"20"},offset和limit这两个参数必须有(js)

# limit最大值为100,当设为100时,获取第二页时,默认前一页是20个评论,也就是说第二页最新评论有80个,有20个是第一页显示的

# 偏移量

msg = '{"offset":' + str(offset) + ',"total":"True","limit":"20","csrf_token":""}'

offset = (page-1) * 20

# offset和limit是必选参数,其他参数是可选的,其他参数不影响data数据的生成,最好还是保留

f = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'

key = '0CoJUm6Qyw8W8jud'

e = '010001'

enctext = AESencrypt(msg, key)

# 生成长度为16的随机字符串

# RSA加密之后得到encSecKey的值

i = generate_random_strs(16)

# 两次AES加密之后得到params的值

encText = AESencrypt(enctext, i)

return encText, encSecKey

encSecKey = RSAencrypt(i, e, f)

四,获取全部评论

上面我们获取到了两个参数encText和encSecKey,利用这两个参数来构造post表单数据(Form Data),即data的值:

params, encSecKey = get_params(page)

data = {'params': params, 'encSecKey': encSecKey}

歌曲评论的URL为:

url = 'https://music.163.com/weapi/v1/resource/comments/R_SO_4_' + str(songid) + '?csrf_token='

然后把data加到post的参数中去就能获取到json格式的评论数据.

html = requests.post(url, headers=headers, data=data)

至此,获取网易云音乐全部评论的Python爬虫实现原理分析全部完成!若想获取全部代码请上我的Github:获取网易云音乐歌曲全部评论代码

https://github.com/zyingzhou/wangyiyun_music/blob/master/get_comments.py

原文发布时间为:2018-11-21

本文作者:xxx

本文来自云栖社区合作伙伴“Python爱好者社区”,了解相关信息可以关注“Python爱好者社区”。

文章

数据采集 · JavaScript · 前端开发 · 数据安全/隐私保护 · Python

2018-11-22

python听歌识曲爬虫_Python爬取网易云音乐热门评论的搜索结果-阿里云开发者社区...相关推荐

  1. PHP爬虫爬取网易云音乐热门评论

    说起爬虫,恐怕第一个想到的都是Python,PHP的就少之又少. 得空闲下来,自己用PHP做了一个爬虫,爬取网易云音乐的热门评论. 效果图: 下面简单说一下思路 首先,在网易云官网排行榜内,审查元素, ...

  2. python爬取音乐并保存_Python爬取网易云音乐上评论火爆的歌曲

    前言 网易云音乐这款音乐APP本人比较喜欢,用户量也比较大,而网易云音乐之所以用户众多和它的歌曲评论功能密不可分,很多歌曲的评论非常有意思,其中也不乏很多感人的评论.但是,网易云音乐并没有提供热评排行 ...

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

    互联网爬虫是一个很有意思的技术,借由爬虫,我们可以做到很多好玩的事情--这其中就包括爬取评论. 词云就是个更好玩的技术,通过技术方法分析词语出现频率,生成可视化的图形,将文字内容用图形呈现,想想就很意 ...

  4. request + bs4 爬取网易云音乐热门评论

    """ 获取网易云音乐中的评论 """ import requests from bs4 import BeautifulSoup impo ...

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

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

  6. python爬虫网易云音乐评论再分析_爬取网易云音乐的评论后,竟有这种发现!

    原标题:爬取网易云音乐的评论后,竟有这种发现! 作者 | 志颖 责编 | 胡巍巍 用过网易云音乐听歌的朋友都知道,网易云音乐每首歌曲后面都有很多评论,热门歌曲的评论更是接近百万或者是超过百万条. 现在 ...

  7. Python Scrapy 多线程爬取网易云音乐热门歌单信息(手把手教学)

    下面我将向大家介绍使用 Scrapy 爬虫获取 网易云音乐 的热门歌单信息. 这里是网易云音乐的歌单页面,可以看到歌单信息非常得结构化,是非常适合爬虫来爬取的. URL:全部歌单 - 歌单 - 网易云 ...

  8. 抄袭风波后 爬取网易云音乐看评论画风如何

    作者 | 小F 来源 | 法纳斯特(ID:walker398) 近日,民谣歌手花粥被爆出涉嫌抄袭. 具体的我就不细说了,音乐圈的抄袭风波也是喜闻乐见. 比如,李袁杰的「离人愁」,展展与罗罗的「沙漠骆驼 ...

  9. Selenium解决动态渲染页面----爬取网易云音乐全部评论

    爬取网易云音乐全部评论,我们先随便找一首歌,这里以毛不易的水乡为例.毛不易–水乡 一.常规方法 1. 尝试直接爬取 先直接用歌曲链接直接爬取 import requests#URL url = 'ht ...

最新文章

  1. 今日 Paper | 新闻推荐系统;多路编码;知识增强型预训练模型等
  2. Qt工作笔记-自定义QSortFilterProxyModel实现多列分别过滤
  3. softmax分类器_[ML] 逻辑回归与 Softmax 回归
  4. 8年软件测试工程师感悟:与薪资相匹配的永远是实力
  5. [7]对话框控件的变量绑定
  6. 238.除自身以外数组的乘积 (力扣leetcode) 博主可答疑该问题
  7. 【微信小程序学习】小程序API
  8. android手机录屏工具,安卓手机录屏软件哪个好用
  9. 互联网晚报 | 12月7日 星期二 | 阿里新设两大数字商业板块;B站宣布迈入8K超高清时代;中国物流集团正式成立...
  10. matlab的求解方程组函数solve、dsolve、ode系列
  11. python 网络 select
  12. 贷款客户资源获取,一文了解贷款行业怎么获取高效精准客户
  13. 文件搜索工具(Python实现)
  14. 计算机关闭这些程序,电脑中哪些进程可以关闭? 节约资源
  15. gaussDB200 单节点安装
  16. 软件测试金字塔,软件测试金字塔
  17. 用xcode编译c++代码
  18. Hexo-域名设置+收录
  19. 使用RPA机器人快速实现表格数据汇总
  20. LOL登录服务器显示看不懂的文字,LOL乱码怎么办?解决方法介绍_LOL进游戏就出现看不懂的字怎么办_牛游戏网...

热门文章

  1. Python Pandas 读取 Excel 表格处理出席表
  2. 苹果X可以升级5G吗_苹果分析师:2020 年的 iPhone 屏幕尺寸升级,还有 5G
  3. 一些常用的mysql语句实例-以后照写2
  4. 图论问题建模讨论汇总
  5. 初始化之前使寄存器恢复缺省值的重要性
  6. Github各种账号密码错误的统一解决方案
  7. 产品经理 demo html,18个UI demo设计实例,深挖让用户愉悦的小惊喜
  8. 大数据周周看:汽车之家发布大数据产品“车智云”,中国数据中心标准联盟正式在京成立
  9. 有实力的APP开发公司应该具备哪些优势?
  10. Go语言经典库使用分析(六)| Negroni 中间件(二)