利用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 调用DLL操作抄表机
Jan 12 Python
python实现的一个p2p文件传输实例
Jun 04 Python
解决Python 中英文混输格式对齐的问题
Jul 16 Python
详解python 注释、变量、类型
Aug 10 Python
在Django model中设置多个字段联合唯一约束的实例
Jul 17 Python
python并发编程多进程 模拟抢票实现过程
Aug 20 Python
python openCV实现摄像头获取人脸图片
Aug 20 Python
python开根号实例讲解
Aug 30 Python
基于Python的图像阈值化分割(迭代法)
Nov 20 Python
python 列表推导和生成器表达式的使用
Feb 01 Python
如何在Python项目中引入日志
May 31 Python
详解Python flask的前后端交互
Mar 31 Python
用Python制作灯光秀短视频的思路详解
python实现socket简单通信的示例代码
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
python用字节处理文件实例讲解
Apr 13 #Python
Python中相见恨晚的技巧
Apr 13 #Python
利用python做表格数据处理
python glom模块的使用简介
Apr 13 #Python
You might like
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
php数组函数序列之array_combine() - 数组合并函数使用说明
2011/10/29 PHP
修改PHP的memory_limit限制的方法分享
2012/02/21 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
按给定几率进行随机抽取的js代码
2010/12/28 Javascript
在js(jquery)中获得文本框焦点和失去焦点的方法
2012/12/04 Javascript
DWZ table的原生分页浅谈
2013/03/01 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
javascript中的Base64、UTF8编码与解码详解
2015/03/18 Javascript
javascript实现表单提交后,提交按钮不可用的方法
2015/04/18 Javascript
js限制文本框只能输入整数或者带小数点的数字
2015/04/27 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
基于JQuery及AJAX实现名人名言随机生成器
2017/02/10 Javascript
AngularJS中$http使用的简单介绍
2017/03/17 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
2017/04/25 Javascript
javascript 中关于array的常用方法详解
2017/05/05 Javascript
关于Angular2 + node接口调试的解决方案
2017/05/28 Javascript
微信小程序日历组件calendar详解及实例
2017/06/08 Javascript
JavaScript Drum Kit 指南(纯 JS 模拟敲鼓效果)
2017/07/23 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
2018/04/28 Javascript
nodejs require js文件入口,在package.json中指定默认入口main方法
2018/10/10 NodeJs
three.js实现圆柱体
2018/12/30 Javascript
深入理解nodejs搭建静态服务器(实现命令行)
2019/02/05 NodeJs
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
十分钟利用Python制作属于你自己的个性logo
2018/05/07 Python
python的slice notation的特殊用法详解
2019/12/27 Python
Python处理PDF与CDF实例
2020/02/26 Python
Lookfantastic美国/加拿大:英国知名美妆购物网站
2019/03/27 全球购物
局部内部类是否可以访问非final变量?
2013/04/20 面试题
.NET初级开发工程师面试题
2014/04/18 面试题
劲霸男装广告词改编版
2014/03/21 职场文书
英语演讲稿3分钟
2014/04/29 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
2014年小学辅导员工作总结
2014/12/23 职场文书