python爬取网抑云评论

本文是一篇学习笔记,整体过程来自于b站

https://www.bilibili.com/video/BV1Wf4y1t7PC?p=48&spm_id_from=pageDriver

运用了js解密的方法
我们首先对wyy的网页进行分析,很显然它的评论不位于网页的源代码内,这时候我们就要通过抓包去找到它评论的url
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

我们看到传入的data被加密了,所以我们需要获得未加密的参数,这时候我们的思路就有了

  • 1.找到未加密的参数
  • 2.想办法把参数进行加密(必须参考它的逻辑)
  • 3.请求到wy,拿到评论信息
    在这里插入图片描述
    我们点击它的最顶端的一个脚本,因为这是他最后运行的
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

e="010001"
f="00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
g='0CoJUm6Qyw8W8jud'
data={
    "csrf_token": "",
    "cursor": "-1",
    "offset": "0",
    "orderType": "1",
    "pageNo": "1",
    "pageSize": "20",
    "rid": "R_SO_4_1481164987",
    "threadId": "R_SO_4_1481164987"
}

然后我们分析下面的加密函数

python
 function a(a=16) {   #返回了16位随机的字符串
        var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
        for (d = 0; a > d; d += 1)  #循环16次
            e = Math.random() * b.length,   #随机数    2.4567
            e = Math.floor(e),  #向下取整   2
            c += b.charAt(e);   #取字符串中的某个位置 c
        return c
    }
    function b(a, b) {#a就是是数据,要加密的,   b是密钥
        var c = CryptoJS.enc.Utf8.parse(b)
          , d = CryptoJS.enc.Utf8.parse("0102030405060708") #d新值
          , 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() #把f变成字符串返回
    }
    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:数据data e:010001 f:很长的一个变量 g:0CoJUm6Qyw8W8jud
        var h = {}  #空对象
          , i = a(16);  #i就是一个16位的随机字符串,我们把i设置成一个定值
        return h.encText = b(d, g), #传入的g是密钥
        h.encText = b(h.encText, i),    #返回的就是params(进行了两次b()加密)  i也是密钥  
        h.encSecKey = c(i, e, f),       #返回的就是encSecKey,传入的e和f是定值,变量值为i(一个16位的随机值),如果将i固定,则c()返回的值也是个定值,即encSecKey也是定值
        h
    }
    两次加密:
    数据+g =>第一次加密+i =>b => params

因为c里面没有随机数生成,所以我们假设把i也设置为固定值
在这里插入图片描述

i="riDx3tkIqurdfDtv"

分析完毕后,我们就可以编写代码了

# @Time:2021/12/411:07
# @Author:中意灬
# @File:网易云评论.py
# @ps:tutu qqnum:2117472285

import csv
import re
import requests
from Crypto.Cipher import AES   #需要安装pip install pycryptodome
from base64 import b64encode
import json

url="https://music.163.com/weapi/comment/resource/comments/get?csrf_token="
#服务于d函数
e="010001"
f="00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
g='0CoJUm6Qyw8W8jud'
i="riDx3tkIqurdfDtv"#i是手动固定的
data={
    "csrf_token": "",
    "cursor": "-1",
    "offset": "0",
    "orderType": "1",
    "pageNo": "1",
    "pageSize": "20",
    "rid": "R_SO_4_1481164987",
    "threadId": "R_SO_4_1481164987"
}

def to_16(data):#为ASE加密算法服务
    pad=16-len(data)%16
    data=data+chr(pad) * pad
    return data
def get_encSecKey():#获取encSecKey值,由于i固定,所以encSecKey也是固定的,就是c(i,e,f)的结果就是固定的
    return  "4a3d959dab493457825f4679d55ec3560bf5607e785ce0ed8696b62c61625e4a1633ea8f76bf39be79483e385e25f755b2086760869ecf05432c383cc6691889e39dca8dd8da05d1cdcce8e10068bbb7e666123f5019f18cea9142c87588e909ffa079967c636b383e332d650e3a55059fc95dafd093c7ee9c3bf7fe701d0761"
def get_params(data):#默认收到的是字符串#把参数进行加密
    first=enc_params(data,g)
    sencond=enc_params(first,i)
    return sencond  #返回的就是params
def enc_params(data,key):#加密过程,即还原b()方法,即还原b()方法中的f生成
    iv="0102030405060708" #去网页设置断点来获取
    data=to_16(data)
    aes=AES.new(key=key.encode('utf-8'),mode=AES.MODE_CBC,iv=iv.encode('utf-8'),)   #Create a new AES cipher
    bs=aes.encrypt(data.encode('utf-8'))   #加密,加密的内容的长度必须是16的倍数,
    return str(b64encode(bs),'utf-8')   #转换成字符串返回


#请求方式post
resp=requests.post(url,data={
    "params": get_params(json.dumps(data)),#将data转换成字符串,因为get_params接收字符串
    "encSecKey": get_encSecKey()
})
patter=re.compile('.*?"content":(?P<content>.*?),.*?')
resp.text.encode('utf-8')
text=resp.text
result=patter.finditer(text)
for i in result:
    with open('网易于评论.csv','w',newline='',encoding='utf-8')as f:
        csvwriter=csv.writer(f)
        for i in result:
            dic=i.groupdict()
            dic['content']=dic['content'].strip('"')
            csvwriter.writerow(dic.values())
print('ok!')

运行结果:
在这里插入图片描述
在这里插入图片描述
最后:大家可以自己更加优化,比如获取全部多页的评论(我试试了修改data里面的pageNo,但好像不行,所以我就没有爬取多页),但有好的建议和方法也欢迎大家与我交流,一起进步咯

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值