获取数据的逻辑其实并不复杂:爬取歌单中所有歌单的url。输入每个歌曲列表以抓取所有歌曲网址并删除重复项。到每首歌曲的首页爬取热评并进行汇总。歌曲列表是这样的:翻页观察它的url变化,注意下面的动图,每页末尾变化35。使用requests+pyquery爬取:defget_list():list1=[]foriinrange(0,1295,35):url='https://music.163.com/discover/playlist/?order=hot&cat=%E5%8D%8E%E8%AF%AD&limit=35&offset='+str(i)print('成功收集%i页播放列表\n'%(i/35+1))data=[]html=restaurant(url)doc=pq(html)foriinrange(1,36):#35个播放列表在一页a=doc('#m-pl-container>li:nth-child('+str(i)+')>div>a').attr('href')a1='https://music.163.com/api'+a.replace('?','/detail?')data.append(a1)list1.extend(data)time.sleep(5+random.random())returnlist1这样我们就可以获得38页,每页35个播放列表,总共1300+个播放列表。接下来我们需要进入每个播放列表,爬取所有的歌曲url,注意最后的“去重”。不同的播放列表可能包含同一首歌曲。点击播放列表,注意红色圈出的id。观察一下,每个歌曲列表底部我们要获取的信息就是红框圈出的信息。利用刚刚爬取的歌单id和网易云音乐的API,我们可以构造:如果不方便阅读,我们来解析json。defget_playlist(url):data=[]doc=get_json(url)obj=json.loads(doc)jobs=obj['result']['tracks']forjobs:dic={}dic['name']=jsonpath.jsonpath(job,'$..name')[0]#songnamedic['id']=jsonpath.jsonpath(job,'$..id')[0]#songIDdata.append(dic)returndata这样我们就获取到了播放列表下的所有歌曲,记得去掉重复的。#复制data=data.drop_duplicates(subset=None,keep='first',inplace=True)剩下的就是获取每首歌曲的热评,和之前的歌曲类似,也是基于api结构,所以很容易找到。defget_comments(url,k):data=[]doc=get_json(url)obj=json.loads(doc)jobs=obj['hotComments']forjobinjobs:dic={}dic['content']=jsonpath.jsonpath(工作,'$..content')[0]dic['time']=stampToTime(jsonpath.jsonpath(job,'$..time')[0])dic['userId']=jsonpath.jsonpath(job['user'],'$..userId')[0]#用户IDdic['nickname']=jsonpath.jsonpath(job['user'],'$..nickname')[0]#用户名dic['likedCount']=jsonpath.jsonpath(job,'$..likedCount')[0]dic['name']=kdata.append(dic)returndata经过汇总,得到44万条音乐热评数据。数据分析、清洗和灌装。defdata_cleaning(data):cols=data.columnsforcolincols:ifdata[col].dtype=='object':data[col].fillna('missingdata',inplace=True)else:data[col].fillna(0,inplace=True)return(data)是按照点赞数排序的。#排序df1['likedCount']=df1['likedCount'].astype('int')df_2=df1.sort_values(by="likedCount",ascending=False)df_2.head()看看有哪些热评Being复制并粘贴。#Sortdf_line=df.groupby(['content']).count().reset_index().sort_values(by="name",ascending=False)df_line.head()第一个和第三个只在最后期间无区别,可归为一类。这样的话,重复次数最多的句子重复了412次,呃~~来看看评论热度最高的大神是谁?我们可以从他身上学到什么经验?df_user=df.groupby(['userId'].count().reset_index().sort_values(by="name",ascending=False)df_user.head()根据user_id进行汇总排序。成功“抓取”了一个“段子手》热评347,来看看这位大神是怎么评论的?df_user_max=df.loc[(df['userId']==101***770)]df_user_max.head()这位失眠的陈先生”似乎精通各种爱情故事。我们以他为例,看看如何成为网易云音乐评论的热评人。数据可视化,先看看这347条评论的点赞分布。#点赞数分布图importmatplotlib.pyplotaspltdata=df_user_max['likedCount']#data.to_csv("df_user_max.csv",index_label="index_label",encoding='utf-8-sig')plt.hist(data,100,normed=True,facecolor='g',alpha=0.9)plt.show()很明显,点赞数不多,大部分都在500个点赞以内,不过几百个点赞就能跻身热评,这也从侧面说明,这些歌曲除了规模比较小之外,似乎经常在新歌领域广撒网。我们用len()求出每条评论的字符串长度,然后画出分布图:评论的字数集中在18到30个字符之间,也就是说我们离开的时候要注意字数一个消息,安全的方法是不要让它太长让人看不懂,也不应该太短,以免不够经典。制作词云。
