用过很多播放器,之前一直是酷我,偶尔QQ。但是网易云音乐出来后毅然变成了他的忠实用户。精确推荐和乐评都很赞!安利了不少人入坑。前些日子网易云音乐将精选用户评论搬上了地铁,使网易云音乐又火了一把。因此就想爬取一些歌曲的评论。

分析

网络请求

如图我们可以看到有两个参数params和encSecKey。现在如何得到这两个参数就变得至关重要。参考知乎https://www.zhihu.com/question/36081767 问题的解答

core.js

core.js

b函数与asrea为一个函数,四个参数分别为:

第一个参数:first_param = '{rid:"", offset:"0", total:"true", limit:"20", csrf_token:""}'

rid就是R_SO_4_加上歌曲的id(其实这个参数也是可以没有的),offset就是(评论页数-1) * 20,total在第一页是true,其余是false。

第二个参数:010001

第三个参数:00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7

第四个参数:0CoJUm6Qyw8W8jud

第二三四个参数均为固定值

此时b函数就是一个AES加密,经过了两次加密生成params。其中i为长度为16的一个字符串,可以取定值。那么此时c函数生成的encSecKey便为固定值。

参数生成完毕即可访问获取返回的json数据。

github地址

代码如下

#! /usr/bin/python

# -*-coding:utf-8-*-

# Author:zp

from Crypto.Cipher import AES

import base64

import requests

import json

import codecs

import time

# 头部信息

headers = {

'Host': "music.163.com",

'Accept-Language': "zh-CN,zh;q=0.8",

'Accept-Encoding': "gzip, deflate, sdch",

'Content-Type': "application/x-www-form-urlencoded",#text/html;charset=utf8

'Cookie': "JSESSIONID-WYYY=cd1Rl3VE3QCuWrM1F2p5X2uldz7nID%5CPkiCScp1xwmj%5CQaK1ntkfjHrdsOIPo63qTVSQ%2F31E5R19S8qrlWscJtCZM4fHnp25P%2FHrDweHD91%2FeaFxBD%2Fq6efikdBYg9mDhDAHy0yW23r6iGkCIUE4NGQYNw4oMbmeNiBuf%2BTNfh6MysQ%2B%3A1491229798294; _iuqxldmzr_=32; _ntes_nnid=d805c50ad0597b9a6f15c3a0724ac9f3,1491227998322; _ntes_nuid=d805c50ad0597b9a6f15c3a0724ac9f3; __utma=94650624.196941009.1491227999.1491227999.1491227999.1; __utmb=94650624.8.10.1491227999; __utmc=94650624; __utmz=94650624.1491227999.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; playerid=36222054",

'Connection': "keep-alive",

'Referer': 'http://music.163.com/'

}

# 设置代理服务器

proxies = {

'http:': 'http://121.232.146.184',

'https:': 'https://144.255.48.197'

}

# offset的取值为:(评论页数-1)*20,total第一页为true,其余页为false

# first_param = '{rid:"", offset:"0", total:"true", limit:"20", csrf_token:""}' # 第一个参数

second_param = "010001" # 第二个参数

# 第三个参数

third_param = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"

# 第四个参数

forth_param = "0CoJUm6Qyw8W8jud"

# 获取参数

def get_params(page): # page为传入页数

iv = "0102030405060708"

first_key = forth_param

second_key = 16 * 'F'

if (page == 1): # 如果为第一页

first_param = '{rid:"", offset:"0", total:"true", limit:"20", csrf_token:""}'

h_encText = AES_encrypt(first_param, first_key, iv)#加密方式是第一个参数和最后一个参数通过固定iv加密

else:

offset = str((page - 1) * 20)

first_param = '{rid:"", offset:"%s", total:"%s", limit:"20", csrf_token:""}' % (offset, 'false')

h_encText = AES_encrypt(first_param, first_key, iv)

h_encText = AES_encrypt(h_encText, second_key, iv)#第二次加密是上次加密返回值与一个16位的任意字符串加密

return h_encText

# 获取 encSecKey

def get_encSecKey():

encSecKey = "257348aecb5e556c066de214e531faadd1c55d814f9be95fd06d6bff9f4c7a41f831f6394d5a3fd2e3881736d94a02ca919d952872e7d0a50ebfa1769a7a62d512f5f1ca21aec60bc3819a9c3ffca5eca9a0dba6d6f7249b06f5965ecfff3695b54e1c28f3f624750ed39e7de08fc8493242e26dbc4484a01c76f739e135637c"

return encSecKey

# 解密过程

def AES_encrypt(text, key, iv):

pad = 16 - len(text) % 16

#print(type(text))

text = text + pad * chr(pad)

encryptor = AES.new(key, AES.MODE_CBC, iv)

encrypt_text = encryptor.encrypt(text)

encrypt_text = base64.b64encode(encrypt_text).decode()

return encrypt_text

# 获得评论json数据

def get_json(url, params, encSecKey):

data = {

"params": params,

"encSecKey": encSecKey

}

response = requests.post(url, headers=headers, data=data, proxies=proxies)

return response.content

# 抓取某一首歌的全部评论

def get_all_comments(url):

all_comments_list = [] # 存放所有评论

all_comments_list.append(u"用户ID 用户昵称 用户头像地址 评论时间 点赞总数 评论内容\n") # 头部信息

params = get_params(1)

encSecKey = get_encSecKey()

json_text = get_json(url, params, encSecKey).decode()

json_dict = json.loads(json_text)

comments_num = int(json_dict['total'])

if (comments_num % 20 == 0):

page = int(comments_num / 20)

else:

page = int(comments_num / 20) + 1

print("共有%d页评论!" % page)

print(type(page))

for i in range(page): # 逐页抓取

params = get_params(i + 1)

encSecKey = get_encSecKey()

json_text = get_json(url, params, encSecKey).decode()

json_dict = json.loads(json_text)

if i == 0:

print("共有%d条评论!" % comments_num) # 全部评论总数

for item in json_dict['comments']:

comment = item['content'] # 评论内容

likedCount = item['likedCount'] # 点赞总数

comment_time = item['time'] # 评论时间(时间戳)

userID = item['user']['userId'] # 评论者id

nickname = item['user']['nickname'] # 昵称

avatarUrl = item['user']['avatarUrl'] # 头像地址

comment_info = str(userID) + u" " + nickname + u" " + avatarUrl + u" " + str(

comment_time) + u" " + str(likedCount) + u" " + comment + u"\n"

all_comments_list.append(comment_info)

print("第%d页抓取完毕!" % (i + 1))

return all_comments_list

# 抓取热门评论,返回热评列表

def get_hot_comments(url):

hot_comments_list = []

hot_comments_list.append("用户ID " + u"\t" + "用户昵称" + u"\t" + "评论时间" + u"\t" + "点赞总数" + u"\t" + "评论内容" + u"\t" + u"\r\n")

params = get_params(1) # 第一页

encSecKey = get_encSecKey()

json_text = get_json(url,params,encSecKey).decode()

json_dict = json.loads(json_text)

hot_comments = json_dict['hotComments'] # 热门评论

#print(hot_comments)

print("共有%d条热门评论!" % len(hot_comments))

for item in hot_comments:

comment = item['content'] # 评论内容

likedCount = item['likedCount'] # 点赞总数

#comment_time = item['time'] / 1000 # 评论时间(时间戳)除1000转化为10位时间戳

#print(comment_time)

# 转换成localtime

time_local = time.localtime(item['time'] / 1000)

comment_time = time.strftime("%Y-%m-%d", time_local)

userId = item['user']['userId'] # 评论者id

nickname = item['user']['nickname'] # 昵称

#print(type(comment))

comment_info = str(userId) + u"\t" +nickname+u"\t" +str(comment_time)+u"\t" +str(likedCount) +u"\t\t" + comment + u"\r\n"

hot_comments_list.append(comment_info)

return hot_comments_list

def save_to_file(list, filname):

with codecs.open(filename, 'a', encoding='utf-8') as f:

f.writelines(list)

print("写入文件成功!")

if __name__ == "__main__":

start_time = time.time()

url = "http://music.163.com/weapi/v1/resource/comments/R_SO_4_185821?csrf_token"

filename = "搁浅.txt"

all_comments_list = get_all_comments(url)

save_to_file(all_comments_list, filename)

#hot_comments = get_hot_comments(url)

#print(hot_comments)

#save_to_file(hot_comments,filename)

end_time = time.time() # 结束时间

print("程序耗时%f秒." % (end_time - start_time))

python爬取网易云音乐评论并进行情感分析_使用python3爬取网易云音乐的评论相关推荐

  1. python商品评论分析_用python3爬取天猫商品评论并分析(1)

    在上一篇文章我们已经完成数据的采集,并将数据存储在mysql,现在我们来继续后面的数据分析工作,先放出项目流程: 0.主要流程 0.数据采集 0. 目标网址获取 1. 爬虫框架选用 注:了解这一步请登 ...

  2. python3爬取微博评论api情感分析_如何科学地蹭热点:用python爬虫获取热门微博评论并进行情感分析...

    param = (comment_id,user_name,created_at,text,likenum,source) try: A = cur.execute(sql,param) conn.c ...

  3. 如何科学地蹭热点:用python爬虫获取热门微博评论并进行情感分析

    前言:本文主要涉及知识点包括新浪微博爬虫.python对数据库的简单读写.简单的列表数据去重.简单的自然语言处理(snowNLP模块.机器学习).适合有一定编程基础,并对python有所了解的盆友阅读 ...

  4. 利用Python实现酒店评论的中文情感分析,含数据集

    利用Python实现酒店评论的情感分析 完整代码下载地址:利用Python实现酒店评论的中文情感分析 情感极性分析,即情感分类,对带有主观情感色彩的文本进行分析.归纳.情感极性分析主要有两种分类方法: ...

  5. 利用python分析电商_基于Word2Vec+SVM对电商的评论数据进行情感分析

    Word2Vec-sentiment 基于Word2Vec+SVM对电商的评论数据进行情感分析 首先是利用word2vec对正负评论数据进行词向量训练,然后利用SVM分类器对语料进行分类,具体的过程如 ...

  6. snownlp对天猫商品评论数据进行情感分析(附源码)

    snowNLP介绍 SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中 ...

  7. 基于微博评论的文本情感分析与关键词提取的实战案例~

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 宣室求贤访逐臣,贾生才调更无伦. ...

  8. 基于深度学习的汽车行业评论文本的情感分析

    使用卷积神经网络对汽车行业评论文本进行情感分析. dateset 爬取汽车之家车主口碑评论文本,抽取口碑中最满意以及最不满意评论文本,分别作为正向情感语料库和负向情感语料库. 爬虫技术视频链接:htt ...

  9. python实现情感分析_利用python实现简单情感分析

    最近选修的大数据挖掘课上需要做关于情感分析的pre,自己也做了一些准备工作,就像把准备的内容稍微整理一下写出来,下次再做类似项目的时候也有个参考. 情感分析是什么? 文本情感分析是指用自然语言处理(N ...

  10. 基于IMDB评论数据集的情感分析

    文章目录 前言 一.大型电影评论数据集介绍 二.环境配置 三.实验模型及流程 1.实验模型 2.实验流程 四.实验代码 1.多层感知器模型代码 2.递归神经网络模型代码 3.长短期记忆模型代码 五.实 ...

最新文章

  1. Salesforce平台支持多租户Multi tenant的核心设计思路
  2. Word中快速插入目录
  3. python中Scipy模块求取积分
  4. Flume1.7.0的安装与使用
  5. Introducing Document Management in SharePoint 2010 介绍SharePoint 2010中的文档管理
  6. 使用Spring Boot应用程序将代码管道化
  7. mysql relay log 配置_mysql relay log参数汇总
  8. 读JavaScript权威指南(第六版)笔记(第二章)
  9. Java实战之管家婆记账系统(24)——项目总结
  10. 微信公众平台接入token验证失败php,PHP开发公众号token验证失败是什么意思?其中一个原因 筋斗云网络...
  11. GetLastError() 返回值对照表
  12. B站台湾大学郭彦甫|MATLAB 学习笔记|12 线性方程式和线性系统 Linear equations
  13. U深度U盘启动盘制作工具怎么用?U深度U盘启动盘制作工具使用教学
  14. 爬取QQ音乐中一首歌的相关信息及评论(破解反爬虫、多协程队列爬虫)
  15. 一名失败人士对大学教育的一些看法
  16. 重定向和转发的概念及区别
  17. 华为交换机用命令更改已有admin账户开启SSH
  18. SpringBoot整合tkMapper
  19. Karl Klein 2D 56 K30-2 W OL/S 45W/2750RPM
  20. 很有意思的软件产品宣传画,这个美工很有创意

热门文章

  1. 【自动驾驶】RTK(高精度的GPS测量)
  2. java调用打印机没反应_java代码调用打印机没反应
  3. 两张表之间进行数据库查询时的聚合函数用法
  4. matlab非齐次方程组的通解,用matlab求非齐次线性方程组的通解?
  5. 线程的先进先出,后进先出,以及优先级队列
  6. 家用风扇控制系统c语言程序设计,[信息与通信]家用风扇控制系统.doc
  7. cpu超线程优缺点_CPU有无超线程重要吗?i7 10700K与9700K对比测试
  8. 数学中有因果关系吗?
  9. 机器人领域的SCI期刊介绍
  10. java assert 断言_Java 之 assert (断言)