网易云指定用户评论抓取2017
暑假在校,突发奇想,网易云好像没有一个汇总自己或者别人所有评论的功能,即获取指定用户所有评论,为什么不能有呢?那么自己动手呗。
准备工作:
首先呢,要获取指定用户的评论数据,我的思路是首先得到他/她喜欢的歌曲,或者ta的歌单,因为在喜欢的歌下面评论的概率是最大的。获取数据肯定是现成的api好用,有很好的格式例如json,牛人总是有的,大部分的api都有人给出了,以下给出参考的网址。
实际实现中的问题:
1.频率过高导致运行不久就被封了ip:通过不断改变请求延迟和user_agent,达到不被封ip的持久爬取,但速度相对很慢。
2.没有找到现成的个人听歌排行歌曲列表的api:通过自己分析网页请求得到
代码(python 3.5):
综合的add_on.py
import pickle
import get_search,get_songlist,timed_input
#给出需要寻找的用户名
username=''
all_songs_id={}#存放需要搜寻的用户歌曲id
userid,userdict=get_search.get_uid(username)#获得用户id和包含所有信息的dict
play_list=get_songlist.get_playlist(userid)#获得用户所有歌单id的字典:歌单名:id
for playlistname in play_list:
#print(get_search.get_songid(playlistid))
all_songs_id[playlistname]=get_search.get_songid(play_list[playlistname])
#这里我没有一次行爬取所有歌单的歌词,而是挑选了某个感兴趣的歌单
for item in [all_songs_id['感兴趣的歌单名称']]:
for song in item:
permision=timed_input.timedInput('是否进行(输入q退出否则进行)---> '+song[0],'y')
if permision==('y' or 'yes'):
print('进行---> ',song[0])
get_songlist.get_all_comments(song[0],song[1],username)
if permision=='q':
break
通过简单的get命令获得歌单列表和歌名列表的api文件,get_search.py
import requests
import json,sys,io
def get_uid(username):
headers = {
'Cookie': 'appver=1.5.0.75771;',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36',
'Referer': 'http://music.163.com/'
}
url = "http://music.163.com/api/search/pc"
data = {
"s": username,
"offset": '0',
'limit':'20',
'type':'1002'
}
response = requests.post(url, headers=headers, data=data)
jsondatadict=json.loads(response.text)#有resutl和code两个键
resultdata=jsondatadict['result']['userprofiles']
for item in resultdata:
if item['nickname']==username:
print('-成功找到:',item['nickname'],' -ID号为:',item['userId'],'-粉丝数:',item['followeds'])
return item['userId'],item#返回用户id和包含用户所有信息的dict
#存在一次只能获