利用Python网络爬虫爬取各大音乐评论的代码


Posted in Python onApril 13, 2021

 python爬虫--爬取网易云音乐评论

方1:使用selenium模块,简单粗暴。但是虽然方便但是缺点也是很明显,运行慢等等等。
方2:常规思路:直接去请求服务器

1.简易看出评论是动态加载的,一定是ajax方式。

2.通过网络抓包,可以找出评论请求的的URL

利用Python网络爬虫爬取各大音乐评论的代码

得到请求的URL

利用Python网络爬虫爬取各大音乐评论的代码

3.去查看post请求所上传的数据

利用Python网络爬虫爬取各大音乐评论的代码

显然是经过加密的,现在就需要按着网易的思路去解读加密过程,然后进行模拟加密。

4.首先去查看请求是经过那些js到达服务器的

利用Python网络爬虫爬取各大音乐评论的代码

5.设置断点:依次对所发送的内容进行观察,找到评论对应的URL

利用Python网络爬虫爬取各大音乐评论的代码
利用Python网络爬虫爬取各大音乐评论的代码
利用Python网络爬虫爬取各大音乐评论的代码

6.查找加密函数

利用Python网络爬虫爬取各大音乐评论的代码

(忽略查找过程)找到:加密函数在

利用Python网络爬虫爬取各大音乐评论的代码

通过查找,找到加密函数具体位置:

利用Python网络爬虫爬取各大音乐评论的代码

7.解读加密函数

运用的是AES,模式是:CBC

function a(a) { a=16
        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); #取出b中对应位置的字符
        return c
    }
    function b(a, b) {
        var c = CryptoJS.enc.Utf8.parse(b)
          , d = CryptoJS.enc.Utf8.parse("0102030405060708")
          , e = CryptoJS.enc.Utf8.parse(a) #e是数据
          , f = CryptoJS.AES.encrypt(e, c, { #c就是加密密钥 
            iv: d, #iv是偏移量
            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)
    }
    function d(d, e, f, g) { d:数据json串  e:"010001" f:   g = "0CoJUm6Qyw8W8jud"
        var h = {}
          , i = a(16); #16位随机值
        return h.encText = b(d, g), g是密钥
        h.encText = b(h.encText, i), #返回的就是params i是密钥
        h.encSecKey = c(i, e, f), #返回的是encSecKey e和f定死,能产生变数的只能是i
        h
    function e(a, b, d, e) {
        var f = {};
        return f.encText = c(a + e, b, d),
        f
    }
    window.asrsea = d

解读该过程即可:代码有注释。

8.参数如何获得:

function d(d, e, f, g) { d:数据json串  e:"010001" f:   g = "0CoJUm6Qyw8W8jud"


 var bZe2x = window.asrsea(JSON.stringify(i4m), brx6r(["流泪", "强"]), brx6r(Sc1x.md), brx6r(["爱心", "女孩", "惊恐", "大笑"]));

#使用网页控制台:发现都为定值;

利用Python网络爬虫爬取各大音乐评论的代码

9.这时只需找到某一个i以及它对应的encSecKey 即可完成服务器的验证

利用Python网络爬虫爬取各大音乐评论的代码

拿到该值之后开始编写代码

全部代码粘贴

#1.找到未加密的参数        #通过函数window.asrsea()进行加密
#2.想办法把参数进行加密,params--->encText  encSecKey--->encSecKey

from Cryptodome.Cipher import AES
from base64 import b64encode
import requests,json



e = "010001"
f = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"
g = "0CoJUm6Qyw8W8jud"
i = "0hyFaCNAVzOIdoht"

url = 'https://music.163.com/weapi/comment/resource/comments/get?csrf_token='
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
    }

def get_encSecKey():
    return "4022359ea3110bcd034e0160c3b89e5e172fd0110a3cf765d9f366d9fd09840a1f4a4705ac43719fdb8bfeb44d3b92334733061ad10942131184a4dfba0ac9d2cf867b8b6236523c1ca5f44c0d2d82c1c2665a3137a9241c7373539c1aa8e5e9bb9d33dafc764b5d76c2ab34fc94df85e27a934c8a603fa713f2cf38c2b7bbae"

def get_params(data): #data默认是json字符串
    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(b64encode(bs),"utf-8") #转化成字符串

#处理加密过程
'''
 function a(a) { a=16
        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); #取出b中对应位置的字符
        return c
    }
    function b(a, b) {
        var c = CryptoJS.enc.Utf8.parse(b)
          , d = CryptoJS.enc.Utf8.parse("0102030405060708")
          , e = CryptoJS.enc.Utf8.parse(a) #e是数据
          , f = CryptoJS.AES.encrypt(e, c, { #c就是加密密钥 
            iv: d, #iv是偏移量
            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)
    }
    function d(d, e, f, g) { d:数据json串  e:"010001" f:   g = "0CoJUm6Qyw8W8jud"
        var h = {}
          , i = a(16); #16位随机值
        return h.encText = b(d, g), g是密钥
        h.encText = b(h.encText, i), #返回的就是params i是密钥
        h.encSecKey = c(i, e, f), #返回的是encSecKey e和f定死,能产生变数的只能是i
        h
    }'''
if __name__ == '__main__':

    page = int(input('请输入需要爬取的页数:'))
    print('开始爬虫!!!')
    fp = open('./网易云评论.txt', 'w', encoding='utf-8')
    for j in range(1,page+1):
        page_num = str(j*20)
        data = {
            'csrf_token': "",
            'cursor': "-1",
            'offset': "0",
            'orderType': "1",
            'pageNo': "1",
            'pageSize': page_num,
            'rid': "R_SO_4_1376142151",
            'threadId': "R_SO_4_1376142151"
        }

        response = requests.post(url,data={
            "params":get_params(json.dumps(data)),
            "encSecKey":get_encSecKey()
        },headers=headers)


        result = json.loads(response.content.decode('utf-8'))
        #hotComments
        for hot in range(len(result['data']['hotComments'])):
            fp.write('hotComments' + ' ')
            fp.write('昵称:' + result['data']['hotComments'][hot]['user']['nickname'] + '\n')
            fp.write('评论:' + result['data']['hotComments'][hot]['content'] + '\n')

            if result['data']['hotComments'][hot]['user']['vipRights'] == None:
                fp.write('vip:yes' + '\n')
            else:
                fp.write('vip:no' + '\n')
            fp.write('点赞数' + str(result['data']['hotComments'][hot]['likedCount']) + '\n')
            fp.write('-------------------------------------' + '\n')

        #print(result['data']['hotComments'][1]['user']['nickname'])

        #comments
        for r in range(20):
            fp.write('comments')
            fp.write('昵称:'+result['data']['comments'][r]['user']['nickname']+'\n')
            fp.write('评论:'+result['data']['comments'][r]['content']+'\n')

            if result['data']['comments'][r]['user']['vipRights'] == None:
                fp.write('vip:yes'+'\n')
            else:
                fp.write('vip:no'+'\n')
            fp.write('点赞数'+str(result['data']['comments'][r]['likedCount'])+'\n')
            fp.write('-------------------------------------'+'\n')
    print('爬取完毕!!!')

效果图

利用Python网络爬虫爬取各大音乐评论的代码

通过这次爬虫实验,在爬取的过程中,遇到各种困难,收货很多。掌握遇到加密,该如何处理的步骤,以及拓宽自己的思路,去运用各种工具。以及各种自己想不到的思路。最起码,下次遇到如此加密的数据获取,心里有了一些底气。
也了解了大互联网公司对数据进行加密的一种方式,以及网页运作的更深一步的了解,受益颇多。

到此这篇关于如何用Python网络爬虫爬取网易云音乐评论的文章就介绍到这了,更多相关python爬取网易云音乐评论内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python创建只读属性对象的方法(ReadOnlyObject)
Feb 10 Python
Python Web框架Flask下网站开发入门实例
Feb 08 Python
Python中super关键字用法实例分析
May 28 Python
谈谈Python进行验证码识别的一些想法
Jan 25 Python
Python使用logging结合decorator模式实现优化日志输出的方法
Apr 16 Python
Python实现比较扑克牌大小程序代码示例
Dec 06 Python
Python根据成绩分析系统浅析
Feb 11 Python
Python制作微信好友背景墙教程(附完整代码)
Jul 17 Python
python global关键字的用法详解
Sep 05 Python
Python分析最近大火的网剧《隐秘的角落》
Jul 02 Python
基于Python实现射击小游戏的制作
Apr 06 Python
Python使用PyYAML库读写yaml文件的方法
Apr 06 Python
用Python制作灯光秀短视频的思路详解
python实现socket简单通信的示例代码
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
python用字节处理文件实例讲解
Apr 13 #Python
Python中相见恨晚的技巧
Apr 13 #Python
利用python做表格数据处理
python glom模块的使用简介
Apr 13 #Python
You might like
PHP 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
PHP 编写的 25个游戏脚本
2009/05/11 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
根据json字符串生成Html的一种方式
2013/01/09 Javascript
jquery 页面滚动到指定DIV实现代码
2013/09/25 Javascript
js解析json读取List中的实体对象示例
2014/03/11 Javascript
JavaScript运算符小结
2015/06/03 Javascript
理解JavaScript中worker事件api
2015/12/25 Javascript
jquery精度计算代码 jquery指定精确小数位
2017/02/06 Javascript
javascript history对象详解
2017/02/09 Javascript
使用bat打开多个cmd窗口执行gulp、node
2017/02/17 Javascript
微信小程序 检查接口状态实例详解
2017/06/23 Javascript
其实你可以少写点if else与switch(推荐)
2019/01/10 Javascript
[35:26]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第三局
2016/02/26 DOTA
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
浅析Python中的多条件排序实现
2016/06/07 Python
Python检测生僻字的实现方法
2016/10/23 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
Python3之读取连接过的网络并定位的方法
2018/04/22 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
2018/04/27 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
Python使用get_text()方法从大段html中提取文本的实例
2019/08/27 Python
基于python实现语音录入识别代码实例
2020/01/17 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
keras的siamese(孪生网络)实现案例
2020/06/12 Python
Pycharm 2020.1 版配置优化的详细教程
2020/08/07 Python
想学画画?python满足你!
2020/12/24 Python
Ruby如何定义一个类
2012/10/08 面试题
高级人员简历的自我评价分享
2013/11/03 职场文书
财务管理专业自荐信范文
2013/12/24 职场文书
文化与传播毕业生求职信
2014/03/09 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
运动会通讯稿200字
2015/07/20 职场文书
2016年学校禁毒宣传活动工作总结
2016/04/05 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL
基于Android10渲染Surface的创建过程
2022/08/14 Java/Android