您的位置:首页 > 编程语言 > Python开发

Python 爬取网易云评论

2018-01-11 15:42 232 查看
最近闲来无事,研究了一下网易云音乐,发现 ta 客户端传输给服务器的数据是经过加密的,大抵是将你要传输的数据经过两次 AES 加密,因为 AES 是对称加密算法,还需要将 AES 的秘钥以 RSA 的方式加密后传输给服务器。但经过我的分析发现,我们不用登录也是可以浏览到评论的,而且,服务器返回的评论数据,也没有经过加密,如果我们只是简单的想拿到某些歌曲的评论,可以绕过加密算法,直接请求数据。但这样也存在很大的弊端,就是如果不能破解 ta 的加密算法,就无法调用网站本身的搜索接口,我们只能手动分析每首歌曲请求评论的接口(唉╮(╯▽╰)╭还是技术受限啊,不过我还在继续分析,加油↖(^ω^)↗)

分析网站,找到请求评论的接口(应该是一个 post 请求,而且应该是 xhr 的)



如图,我们在这个请求的响应中找到了,我们想要的评论,至于有些人可能会问,你怎么知道是 xhr 的请求呢?我的理由是这样的,我们浏览评论的时候是不是很多评论都是被折叠成很多页的,我们可以通过点击下一页不停的浏览下去,这不就说明,评论是通过异步加载的吗!!!

分析这个请求



这个 Request URL 就是我们请求评论的接口,我们需要的数据数据都是从这来的,记下来。



这是 Cookie



这是
4000
data 里面携带的两个重要参数,经过加密的,但不过我观察了一下前端的 js 脚本发现,普通请求评论的时候带的 data ,也就是通过对几个固定字段进行加密,而且没有涉及时间戳,只要我们传过去的格式类似,而且密文与秘钥能在服务器校验成功就可以了,直接拷贝一个浏览器上的就行。

代码

#/usr/bin/python
# encoding:utf-8
# __Author__ = Slwhy

import requests
import os
import json

data = {
'params':'VTR9VH3d/ourPcEVgzKHba+sLegQNw9bJiqltYz2T0NcJifrsrSlOh1BfqQt2wZsZo5okKVeluhBQ0TNhrQChbDoq9FfyJo6BvTkKVQN6e13ytcwo+9voHSQmhbDSn71zv9/v3axqK5p8PhajmA8+1/BKowmhlOP2Ohjcf4MYjnBRpbTcirXVwGf7k5ZaNIA',
'encSecKey':'cc6d7e14ac1408c39a7c172b70fb1005e199f298abfb5db75919d8b17e574c95ed400947e6e0213a3f4a03e3e568bb54841bafb736906d4d6fe118097afb413ec27ad514c41d92a6f6e2fe8d97febf600651726023071d62236445d2c5bc667888e30f03000f09fefd76f28613abd90f680603cfd7a624370c736b8805225b16'
}

head = {

'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'

}

head['Cookie'] = 'JSESSIONID-WYYY=Jgi1ax6XAkd6cNwfV6qxBbhya5s4SW00PtEcYPNYUgdOeQO%5Cf%2FyFUQo%2FAVRlqDhDV8d7D%5CSGCtdu0NYgBxn9YdoZ0WuTb9VH0Nydug%2BZ4SUn74vDPG%2F%5CD6slP%2FmuljYfIVf%2F2X%5CxlrXuCvJjw8ER4amzfEPao6x5elWf%2B2OkzmGPJ%2Bvz%3A1515500969576; _iuqxldmzr_=32; _ntes_nnid=099805196f22bf7617cf11b5a67feeff,1515499169604; _ntes_nuid=099805196f22bf7617cf11b5a67feeff; __utma=94650624.1398381638.1515499170.1515499170.1515499170.1; __utmc=94650624; __utmz=94650624.1515499170.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmb=94650624.6.10.1515499170'

if __name__ == '__main__':

url = 'http://music.163.com/weapi/v1/resource/comments/A_PL_0_2015321897?csrf_token='
# url = 'http://music.163.com/weapi/v1/resource/comments/A_PL_0_973757368?csrf_token='
s = requests.session()
r = s.post(url,data=data,headers = head)
print r.text
dict_content = r.json()
path = os.getcwd()
path = path + '/comment.json'
with open(path,'wb') as f:
j = json.dumps(r.text, encoding="utf-8")


反思,这个实现还是很牵强,必须得手动分析评论接口,还是得去理清 ta 的加密算法,加油↖(^ω^)↗
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐