爬取网易云热评

爬取网易云热评,用python上手真心简单,怪不得有人总说“人生苦短,我用python“。

​ 爬网页数据的话一般是解析html的结构,这种适合抓取html里面多种元素的情况,而我只是想看个热评而已,可以另辟蹊径:直接搞到评论的API,然后获取json返回,最后解析就行了。(( ̄▽ ̄)~所以说很简单咦)

找到API

​ 打开网易云网页版,输入自己想抓取热评的歌曲,然后用开发者工具,输入comments就能找到评论API的url了,点response就能看到json格式的评论了。

那个数字代表的应该就是这首歌的id了,后面有一个叫csrf_tocken的参数,显示为空,那就不管它了。请求方式依然是post,然后表单那里还有两个加密过的参数,分别是params和encSecKey,一开始以为是每首歌都会对应这么一个参数,后来发现并不是,刷新了页面后却发现这个参数变了,可能是对应评论页码加密的?

获取json

​ 再一次慨叹一下python库的强大,不信?那你看代码长度咯。

1
2
3
4
5
6
7
import requests
import json
url = 'http://music.163.com/weapi/v1/resource/comments/R_SO_4_63650?csrf_token='
param = {'params':'', 'encSecKey':''}
r = requests.post(url, param)
data = r.text #拿到json

这样就拿到评论的json格式了(PS:那两个参数实在是太长了,贴出来看的我不舒服,写的时候自行粘贴上去就好)。

解析json

拿到了json后自然要解析一波,python的json库可以很轻易地帮我们解决这个问题。首先从开发者工具那直接复制json,拿到这里在线json校验格式化工具,看一下json的具体形式(直接那么长一串简直反人类没法看)。

舒服多了23333。主要信息有nickname,content,likedCount把这三个拎出来就差不多了。(id, 内容, 点赞量)json库不会用的话去查一下就好,上手很容易的,然后直接解析后打印就好了。(就一页热评,懒得写入文件了。)稍微完整的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests
import json
url = 'http://music.163.com/weapi/v1/resource/comments/R_SO_4_63650?csrf_token='
param = {'params':'', 'encSecKey':''}
r = requests.post(url, param)
data = r.text #拿到json
jsOb = json.loads(data)
hotComments = jsOb['hotComments']
for i in range(len(hotComments)):
user_nickname = hotComments[i]['user']['nickname']
likedCount = hotComments[i]['likedCount']
content = hotComments[i]['content']
print('评论',str(i+1),' 用户名:',user_nickname,'喜 欢:',str(likedCount))
print('-----------------------------')
print(content)

这样就OK咯。贴一下我抓的《独家记忆》第一页热评。

emmmmm,后期再更新一下抓全部评论和整个歌单的热评好了。不过那样数据会比较大,时间相应也挺长的,不太敢多开线程加快速度,怕触发反爬虫机制ip被封了就GG了。