1、需求

2、工具

pip install pycryptodomex #用Cryptodome.Cipher里的AES加密

3、url和参数以及加密过程查找



点栈元素,跳到sources,在光标处设置断点重新刷新。








所以要找的参数实际上是:params=>encText,encSecKey=>encSecKey
需要找到加密的处理函数。

剩余三个参数可以看是什么值。

找到处理加密过程,即找window.asrsea(参数,…)

固定i的值。

4、处理加密过程爬取评论及解析

# comprehensive case
# 爬取网易云评论
import json
import requests
import base64
from Cryptodome.Cipher import AES
import jsonpath
import re# 需求:
# 1.找到未加密的参数     #通过window.asrsea(参数,...)进行加密
# 2.按照原来的加密方式把参数进行加密,实际上:params=>encText,encSecKey=>encSecKey
# 3.请求url拿到数据url = "https://music.163.com/weapi/comment/resource/comments/get?csrf_token="#真实的参数
data = {    #字典"csrf_token": "","cursor":"-1","offset": "0","orderType": "1","pageNo": "1","pageSize": "20","rid": "R_SO_4_29004400","threadId": "R_SO_4_29004400"
}# 处理加密过程,即找window.asrsea(参数,...)源头# d = JSON.stringify(i0x)  #实参也就是data
e = "010001"
f = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
g = "0CoJUm6Qyw8W8jud"#在加密过程中i为随机值,在i取值后设置断点得到i的值,将i固定值不变
i = "hJmVIJGZI4uNku8O"def to16(data):#转化为16位的长度add = 16 - len(data) % 16data = str(data)# for i in range(0,add):#     data += " "data += chr(add) * add  # 要添add个字节,chr()表示字节return datadef get_encSecKey():# i固定之后得到的encSecKeyencSecKey = "a399da91613e7804adffa10983935885caf040325eea0f8f83daf9544ecdc640ac87d366e3c5ce80a726c808e3d43d811cb56aadddc49d2e20ef9f138d8565ca59dc5d98eea82b90f935c003de9a3b112c9aed05c267d6d177d6eb6d43ea224e6bdd54030fb72399184a0f44cc36d41f322d8e200063873f11c7f76b6df7020f"return encSecKey#对数据进行加密
def get_params(data):   #data为字符串#还原d中的encText,调用了bfirst = get_encText(data,g)second = get_encText(first,i)return seconddef get_encText(data,key):   #data为字符串# 还原b中的转换和AES加密过程iv = "0102030405060708"#创建加密对象aes = AES.new(key=key.encode("utf-8"),mode=AES.MODE_CBC,IV=iv.encode("utf-8"))# 补足16的倍数data = to16(data)#完成加密dataAes = aes.encrypt(data.encode("utf-8"))    #加密内容的长度必须是16的倍数,不能只为16#用b64encode编码dataAes = base64.b64encode(dataAes)#密钥转化为字符串dataAes = str(dataAes,"utf-8")return dataAes"""
!function() {function a(a) {    # a = 16var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";for (d = 0; a > d; d += 1)e = Math.random() * b.length,    #取0-b.length的随机数e = Math.floor(e),  #向下取整c += b.charAt(e);   #检索字符串b中特定位置e的字符累加到creturn c   #返回16长度的字符串}function b(a, b) {  # a为要加密的内容var c = CryptoJS.enc.Utf8.parse(b)  # b也为密钥, d = CryptoJS.enc.Utf8.parse("0102030405060708")   #字符串为IV, e = CryptoJS.enc.Utf8.parse(a)   # e 为数据, f = CryptoJS.AES.encrypt(e, c, {   #AES为加密方法,c为机密的密钥iv: d,   #偏移量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)}在scope中d = JSON.stringify(i0x)  #实参也就是datae = "010001"f = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"g = "0CoJUm6Qyw8W8jud"主要找d的取值function d(d, e, f, g) {var h = {}, i = a(16);   #i是长度为16的随机字符串,根据以下可以把i设为定值# encText进行两次加密h.encText = b(d, g),   #返回字符串(utf-8),g为最开始的密钥,为定值h.encText = b(h.encText, i),    #实际encText=>params,i也是密钥,为定值h.encSecKey = c(i, e, f),    #实际为encSecKey=>encSecKey,参数除了i都为定值。因为c中无随机数,所以方法:固定i的值,得到encSecKey为固定值return h}function e(a, b, d, e) {var f = {};return f.encText = c(a + e, b, d),f}window.asrsea = d,window.ecnonasr = e
}();
"""def craw():resp = requests.post(url, data={"params": get_params(json.dumps(data)),  # json.dumps(data)  把字典转为字符串"encSecKey": get_encSecKey()})page_content = json.loads(resp.text)  # 以json格式保存到文件resp.close()return page_contentdef writeAsJson(page_content):with open(r"attachment/comments.json",mode="w",encoding="utf-8") as f:json.dump(page_content,f,ensure_ascii=False,indent=2)f.close()returnjsonData = ""
with open("attachment/comments.json",'r',encoding='utf-8') as f:jsonData = json.load(f)   #json文件以原格式读出f.close()#解析
nicknameList = []
contentList = []
timeStrList = []
# print(type(jsonData))   #dic
nicknameList = jsonpath.jsonpath(jsonData,'$.data.hotComments[*].user.nickname')
contentList = jsonpath.jsonpath(jsonData,'$.data.hotComments[*].content')
timeStrList = jsonpath.jsonpath(jsonData,'$.data.hotComments[*].timeStr')
result = list(zip(nicknameList,timeStrList,contentList))print(result)

【爬虫】六、综合案例之爬网易云音乐评论信息相关推荐

  1. java爬虫实战(3):网易云音乐评论,歌曲,歌单,歌词下载

    java爬虫实战(3):网易云音乐评论,歌曲,歌单,歌词下载 *本实战仅作为学习和技术交流使用,转载请注明出处: *此文章很早便在草稿箱中,由于编写时事情较多,临时中断,现暂时发表,后续补上(2019 ...

  2. python爬网易云音乐评论最多的歌_使用Python爬一爬网易云音乐上那些评论火爆的歌曲...

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

  3. python爬虫网易云音乐评论最多的歌_使用Python爬一爬网易云音乐上那些评论火爆的歌曲...

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

  4. python爬取网易云音乐_Python 从零开始爬虫(七)——实战:网易云音乐评论爬取(附加密算法)...

    前言 某宝评论区已经成功爬取了,jd的也是差不多的方法,说实话也没什么好玩的,我是看上它们分析简单,又没加密才拿来试手的.如果真的要看些有趣的评论的话,我会选择网易云音乐,里面汇聚了哲学家,小说家,s ...

  5. Python爬虫之js加密破解,抓取网易云音乐评论生成词云

    js破解历程 前言 技能点 界面概况 静态网页动态网页 页面解析 step1: 找参数step2:分析js函数step3:分析参数step4: 校验step5:转为python代码 编写爬虫 很多人学 ...

  6. Python爬取网易云音乐评论,反爬算啥啊!

    兴趣点: 这个网易云音乐的评论我早就想爬了,可惜技术不行,研究了两天的时间我终于用最简单的方法实现了网易云音乐评论的爬取,我以毛不易的<像我这样的人>为例来介绍一下 爬取网站: 虚假的爬取 ...

  7. 网易云音乐评论爬取。

    欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式搞定! 对商业智能BI.大数据分析挖掘.机器学习,python,R等数据领域感兴趣的同学 ...

  8. python爬取网易云音乐评论并进行可视化分析

    2019独角兽企业重金招聘Python工程师标准>>> 前言 今天为大家一个爬取网易云音乐评论的Python案例,并用Python的第三方库来进行可视化分析,生成图表样式,可以清晰地 ...

  9. 爬虫之js加密破解抓取网易云音乐评论生成词云

    js破解历程 前言 技能点 界面概况 静态网页 动态网页 页面解析 step1: 找参数 step2:分析js函数 step3:分析参数 step4: 校验 step5:转为python代码 编写爬虫 ...

最新文章

  1. hash hashcode变化_hashmap重写key的hashcode问题
  2. python划分有限元网格_有限元网格划分应该考虑些什么
  3. dva 中的响应编程
  4. GetDiskFreeSpace 和 GetDiskFreeSpaceEx
  5. JavaScript——易班优课YOOC课群在线测试答案隐藏解决方案
  6. 函数的返回值-接收返回元组函数的方式
  7. 本地配置_Hadoop本地模式的安装配置
  8. AJAX编写用户注册实例及技术小结
  9. 什么是在Vim中评论/取消注释行的快速方法?
  10. test和read命令
  11. 学生选课管理系统(Java)
  12. Kepware KEPServerEX连接Cimplicity OPC UA Server
  13. 微信公众号授权突破微信开放平台只能配置两个的限制
  14. Oracle导入sas数据集,来自SAS数据集的Oracle表
  15. 设置windows开机隐藏启动,隐藏欢迎界面
  16. 为什么转置512x512矩阵,会比513x513矩阵慢很多?
  17. gmac做3路网卡转fpga实现方案对比
  18. 超简单修改权限破解typora beta版本(备忘)
  19. windows安装IIS服务
  20. ubuntu下IPv6查询相关命令

热门文章

  1. 级联样式表_级联样式表| 第1部分
  2. 用单链表实现通讯录管理
  3. 我去!企业微信BUG还真不少 大象盯盯成熟值得信任
  4. 中兴软创个人面试(算法工程师实习岗)总结
  5. 瑞芯微sensors中断linux实现方式
  6. GitLab CI/CD 自动化构建与发布实践
  7. 最接近计算机硬件的系统软件是,最接近计算机硬件的系统软件是
  8. 计算机等级考试是大学教的吗,计算机二级是大学生必考的吗
  9. sql server 通过上下级关系字段用递归方法生成上下级层级关联数据字段
  10. 【Android】Bitmap图像色彩模式:黑白、模糊、老照片、胶卷等(92/100)