爬虫6:爬取网易云音乐评论

过程比较艰辛,具体看代码吧

python 复制代码
"""
框架源代码,源代码
前端外层一个html,内层嵌套一个

1. 找到未加密的参数
2. 想办法把参数加密(必须参考网易的逻辑),params,encSeckey; 都是window.arsea函数加密的
3. 请求到网易,拿到评论信息

F12查看发起程序的请求堆栈, 自下往上越来越新
js代码可能经过压缩,加密,变量名替换

看到有个send,打断点,一步步找
"""
import requests

url = 'https://music.163.com/weapi/comment/resource/comments/get?csrf_token='

# 原始数据,请求方式是post
data = {
    "rid": "R_SO_4_1869390986",
    "threadId": "R_SO_4_1869390986",
    "pageNo": "1",
    "pageSize": "20",
    "cursor": "-1",
    "offset": "0",
    "orderType": "1",
    "csrf_token": ""
}

# 处理加密过程
"""
function a(a = 16) {
    var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
    for (d = 0; a > d; d += 1)
        e = Math.random() * b.length,  # 循环16次,随机数,取整,取字符串中的位置
        e = Math.floor(e),
        c += b.charAt(e);
    return c
}
function b(a, b) {  # a是要加密的内容,e是数据, AES(CBC)加密
    var c = CryptoJS.enc.Utf8.parse(b)  # b是秘钥
      , d = CryptoJS.enc.Utf8.parse("0102030405060708")
      , e = CryptoJS.enc.Utf8.parse(a)
      , f = CryptoJS.AES.encrypt(e, c, {
        iv: d,
        mode: CryptoJS.mode.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:数据,e:010001, f:很长, g:定值
    var h = {}
      , i = a(16); # 16位随机值
    return h.encText = b(d, g),  # g是秘钥
    h.encText = b(h.encText, i),  # i是秘钥
    h.encSecKey = c(i, e, f),  # 得到encSeckey,e和f是定死的, 如果把i固定那得到的encSeckey就是定值
    h
    # h 塞点东西然后返回
    
    # encText两次加密,数据+g => b => 第一次加密+i => b => params
}
function e(a, b, d, e) {
    var f = {};
    return f.encText = c(a + e, b, d),
    f
}
"""

# 服务于D的
e = "010001"
f = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'
g = '0CoJUm6Qyw8W8jud'
i = "CSc0ukfzGqLt3kmr" # 手动固定的,但人家函数中是随机的

ttt = {
    "encText": "U7Udb8ATi4zMsjVtcCiBTuofmEU/BLLb8VYst3XQxGoENrmhp9aPbB5OMRmqab6KWsJ7XTDjlYvjbmMjHN5mB5lPTmsr/oRdNCNVlI5DtTXs/0Ll5L5S7vfbcbFKKVEh",
    "encSecKey": "8356016f73fac1d2d2d0fa3e915b7e132df0e1711361bb572d679b0e266c22a0536ea0291db1aad59b7edc033856dd558709504f098727e56512a1ce554729cdde1ddc59c2208c2ebf7f689308d3cc1da96bbbef523fc025f64c0c68ef28d4da677bc547d2db71a6e12e68f0ad262d653bf28037c94fb9aed6d6ff3e84aea71c"
}

def get_encKey():
    return ttt["encSecKey"]

from Crypto.Cipher import AES
from base64 import b64encode

def to_16(data):
    pad = 16-len(data) %16
    data += chr(pad) * pad
    return data
def enc_params(data, key):
    aes = AES.new(key.encode('utf-8'), iv="0102030405060708".encode('utf-8'), mode=AES.MODE_CBC)
    bs = aes.encrypt(to_16(data).encode('utf-8'))  # 加密,内容长度必须是16倍数
    return str(b64encode(bs), 'utf-8') # 转化成字符串返回

# 数据加密
def get_params(data):
    # 默认收到的是字符串
    first = enc_params(data,g)
    second = enc_params(first, i)
    return second

import json
resp = requests.post(url, data={
    "params": get_params(json.dumps(data)),
    "encSecKey": get_encKey()
}, verify=False)

resp.close()
dict = json.loads(resp.text)
for com in dict['data']['comments']:
    print(repr(com['content']))
相关推荐
vx_biyesheji00019 分钟前
豆瓣电影推荐系统 | Python Django 协同过滤 Echarts可视化 深度学习 大数据 毕业设计源码
大数据·爬虫·python·深度学习·django·毕业设计·echarts
深蓝电商API1 小时前
爬虫IP封禁后的自动切换与检测机制
爬虫·python
喵手3 小时前
Python爬虫实战:公共自行车站点智能采集系统 - 从零构建生产级爬虫的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集公共自行车站点·公共自行车站点智能采集系统·采集公共自行车站点导出csv
喵手3 小时前
Python爬虫实战:地图 POI + 行政区反查实战 - 商圈热力数据准备完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·地区poi·行政区反查·商圈热力数据采集
芷栀夏3 小时前
从 CANN 开源项目看现代爬虫架构的演进:轻量、智能与统一
人工智能·爬虫·架构·开源·cann
喵手19 小时前
Python爬虫实战:HTTP缓存系统深度实战 — ETag、Last-Modified与requests-cache完全指南(附SQLite持久化存储)!
爬虫·python·爬虫实战·http缓存·etag·零基础python爬虫教学·requests-cache
喵手19 小时前
Python爬虫实战:容器化与定时调度实战 - Docker + Cron + 日志轮转 + 失败重试完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·容器化·零基础python爬虫教学·csv导出·定时调度
喵手21 小时前
Python爬虫实战:全站 Sitemap 自动发现 - 解析 sitemap.xml → 自动生成抓取队列的工业级实现!
爬虫·python·爬虫实战·零基础python爬虫教学·sitemap·解析sitemap.xml·自动生成抓取队列实现
iFeng的小屋1 天前
【2026年新版】Python根据小红书关键词爬取所有笔记数据
笔记·爬虫·python
Love Song残响1 天前
揭秘Libvio爬虫:动态接口与逆向实战
爬虫