python实战 爬取网易云评论信息
Posted ꧁༺空༒白༻꧂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python实战 爬取网易云评论信息相关的知识,希望对你有一定的参考价值。
8、实战项目:网易云音乐评价
8.1、获取评论的URL
- 一般我们从检查(F12调试器)、网页源代码,查询,至于框架源代码就是一个类似一个笔记本,有很好看的背景图,叫框架,而你去将他写上文字,贴纸修饰,他就组合成一个好看饱满的页面
- 假设,没有在网页源代码找到评论,通过F12调试器来判断评论位置
可以看到,此时我们找到了相应的评论的URL存放地址
8.2、分析步骤
- 找到未加密前的参数
然后我们点击Initiator查看脚本执行文件
点击第一个脚本也就是最后才执行的脚本,可以看到各个代码模块的执行程序
我们此时需要知道参数params是否在(e7d)进来之前就加密了
-
设置断点,刷新页面
-
不难发现,此时的params已经是被加密过的参数了,因此我们进行下一步,点击Call Stack,寻找未加密前的参数
- 直到参数值改变,不再是加密状态,此时我们可以得知,就是在t7m.be7X被加密
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9AEjTLds-1623521116748)(C:\\Users\\空\\AppData\\Roaming\\Typora\\typora-user-images\\image-20210612184738911.png)]
-
返回t7m.be7X,再次断点操作
-
找到了加密前一步的信息
- 接下来的一步会将值封装成两个参数的形式储存并传递
- 想办法把参数进行加密(参考网易的逻辑)
- 根据上面,我们就可以知道
-
params =>encText
-
encSecKey=>encSecKey
-
加密方法:window.arsea(参数,xxx,xxx,xxx)
- 通过ctrl+f查找window.aresea可以发现到abcd的四种方式
3. 寻找abcd对应的参数
4. 将参数输出得到字符串
- 找到params和encSecKey
- encSecKey
function d(d, e, f, g) {
var h = {} #创建一个空对象
, i = a(16); #i就是随机值
return h.encText = b(d, g),
h.encText = b(h.encText, i), #返回的就是params
h.encSecKey = c(i, e, f), #得到的就是encSecKey,ef是固定值,只有i是随机的,也就是说我们要在网页找到这个随机,而独有网页独有的i,就可以获取该网页的信息
h
}
- params
def get_params(): #默认接收到的是字符串
first=enc_params(data,g)
second=enc_params(first,i)
return second
- 请求到网易,拿到评论信息
# 1.找到未加密前的参数
# 2.将参数进行加密分析
# 3.请求到网易,拿到评论
from Crypto.Cipher import AES #AES加密算法库
from base64 import b64decode #字节处理
import requests #获取url地址
import json #将字典转化为字符串
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_1407358755",
"threadId": "R_SO_4_1407358755"
}
e="010001"
f="00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
g="0CoJUm6Qyw8W8jud"
i="ceuDyzWkePGOKnuf" #i找到后,下面的encSecKey也是定值
def get_encSecKey():
return "c2139810d3897ec98b2754e050b9553c242927855d1e399c05e27e33a912b2d4bce05d5d1b7d815f86740b8d03e02b3d1113d4d1dfa1e94e0db3c63d589ec755ed399581198a4e56520a304adb75ace8accb4d53a4ea029bfbb5c77429dc986deea782bbccaa0101ca971febd715f611b89cf500660bfac439f4b806ee50a77e"
def get_params(data): #默认接收到的是字符串
first=enc_params(data,g)
second=enc_params(first,i)
return second
def to_16(data):
pad = 16 - len(data) % 16
data += chr(pad) * pad
return 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"))
# return str(b64decode(bs))
return str(b64decode(bs))
# 处理加密过程
# d:数据 efg都是定值
# 将加密的方法放进来
"""
function a(a=16) { #返回随机的16位字符串
var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
for (d = 0; a > d; d += 1) #循环16次
e = Math.random() * b.length, #随机数 1.2345
e = Math.floor(e), #取整1
c += b.charAt(e); #去字符串中的xxx位置 b
return c
}
function b(a, b) { #a是要加密的内容
var c = CryptoJS.enc.Utf8.parse(b) #c是密钥,b也是密钥
, d = CryptoJS.enc.Utf8.parse("0102030405060708")
, e = CryptoJS.enc.Utf8.parse(a) #e是数据
, f = CryptoJS.AES.encrypt(e, c, { #AES加密算法 iv是偏移量 模式:cbc
iv: d,
mode: CryptoJS.mode.CBC
});
return f.toString()
}
function c(a, b, c) { #c是不会产生随机数的
var d, e;
return setMaxDigits(131),
d = new RSAKeyPair(b,"",c),
e = encryptedString(d, a)
}
function d(d, e, f, g) {
var h = {} #创建一个空对象
, i = a(16); #i就是随机值
return h.encText = b(d, g), #g也是密钥
h.encText = b(h.encText, i), #返回的就是params,i是密钥,可以发现,除了d,其他都是定值,而d就是上方的data
h.encSecKey = c(i, e, f), #得到的就是encSecKey,ef是固定值,只有i是随机的,也就是说我们要在网页找到这个随机,而独有网页独有的i,就可以获取该网页的信息
return h
}
#两次加密:数据+g=>b=>第一次加密+i=>b=params
"""
resp=requests.post(url,data={
"params": get_params(json.dumps(data)),
"encSecKey": get_encSecKey()
})
print(resp.text)
以上是关于python实战 爬取网易云评论信息的主要内容,如果未能解决你的问题,请参考以下文章