文的笔墨及图片来源于网络,仅供学习、互换利用,不具有任何商业用场,版权归原作者所有,如有问题请及时联系我们以作处理。

作者: CDA数据剖析师

Python爬取620首虾米歌曲揭秘蒲月天为什么狂吸粉  第1张

PS:如有须要Python学习资料的小伙伴可以加点击下方链接自行获取

http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef

本日我就用Python爬一爬虾米音乐,半剖析半安利地给大家先容一下这个充满有趣灵魂的组合。

数据获取

本次爬虫紧张目的是爬取五月天所有歌曲的信息,信息维度当然是越多越好啦。

直接搜索关键词“五月天”,可能会涌现歌名是“五月天”的信息,或者别人翻唱“cover五月天”的内容,搜索范围变大,多抓取了不少无用信息。

以是我以“五月天-艺人-专辑信息-歌曲id-歌曲详情”这个路径进行数据爬取。
我创造,无论是专辑信息、歌曲list还是歌曲详情,都存在于非常俊秀的JSON格式里面:

本来可以美滋滋“唰唰唰”地批量下载。
但是!
URL里面有一个s的参数,我暂时找不到变革的规律(摔!
)由于赶韶光,就另辟路子,用相对麻烦一点的beautiful soup库来解析网页源代码的内容,过程很坎坷,这便是我为什么五月天算夜电影上映凌晨还在写这篇文章的缘故原由……

而且,爬虫的时候我还碰着两个坑:

1.两天前能运行的代码,在本日居然解析不到所需的内容了,由于爬取的东西内容格式发生了很大变革。
难道是我正巧遇上了他们内部修正源代码的节点嘛?无从查证。

2.两天前还在显示的歌曲详情(播放量和收藏量),本日一看全都变成0了,每首歌都这样。
我让别的朋友用其他电脑查看,也是没信息的。
“检讨”了一下,Play Count这些参数直接变成Null了…?

末了得到三个文件,分别是专辑信息(50张)、歌曲列表(620首)和歌曲详情(620首),紧张是通过专辑字符和歌曲id进行干系联,详细字段如下:

专辑信息(专辑种类、ID、封面、名字、艺术家、收藏数、措辞、播放数、推举数、歌曲数量、专辑字符、评分、评分人数、发布韶光)歌曲列表(专辑名字、歌曲名字、ID、时长、播放量)歌曲详情(歌曲名字、别名、歌曲ID、时长、播放次数、作词、作曲、编曲、专辑名字、歌词、热门第一条评论、评论点赞数)

数据洗濯

国际老例:Excel画图表+Python画词云,(自认为)大略粗暴又高效。

截止目前在虾米音乐平台关于五月天的一共有50张专辑,个中“正正经经”的专辑有9张(“录音室专辑”),“单曲”类专辑有20张,歌曲数量在1到6首不等。

判断作品的利害,最明显快速的办法便是查看大众对其的评分,我们来瞧瞧这50张专辑的评疏散布:

可以看到,将近一半的的专辑评分在9.8-10.0之间,只有3张专辑评分没超过9分。
解释大众对其认可度还是相称高的。

五月天曾说过只会出10张专辑,随着2016年《自传》的发布,现在已经有9张跟大家见面啦。
我们先看看这9张的数据情形。

按照发布韶光顺序排列:

根据专辑信息里面的歌曲ID(字符串形式和数字形式皆可),我们可以顺藤摸瓜爬取歌曲的信息,一共得到620首,撤除没歌词的纯音乐歌曲55首,还剩565首。

再看看播放数量TOP20的歌曲:

我们从歌曲的创作内容来看看五月天的歌到底有什么特点。

每首歌都要经历作词、作曲和编曲的过程。
在这177首歌里面,主唱阿信参加了139次作词、100次作曲,我说一句阿信是创作小王子没人反对吧!

编曲方面,68%的歌曲都是由五月天全体团队完成的,还有31首歌是有其他人参与互助的,互助次数最高的是周恒毅(8次)。

代码部分

xiamisongs(歌曲清单).py

import requestsfrom bs4 import BeautifulSoupimport timeimport pandas as pdimport randomsongName=[]songId=[]albumName=[]duration=[]playCount=[]df=pd.read_excel('五月天专辑信息.xlsx')albumString=df['专辑字符']headers={ 'Connection': 'keep-alive', 'Cookie':'', 'User-Agent': '' }url='https://www.xiami.com/album/{}'for albumId in albumString[13:]: print('正在爬取{}'.format(albumId)) full_url=url.format(albumId) res = requests.get(full_url, headers=headers) soup=BeautifulSoup(res.text,'html.parser') #歌曲名字,专辑名字 sn=soup.select('.song-name') for i in range(len(sn)): songName.append(sn[i].text) albumName.append(soup.select('.album-name')[0].text) #歌曲id for item in sn: a=item.find_all('a') for m in a: songId.append(m.get('href')[6:]) #时长 d=soup.select('.duration') for i in range(len(d)): duration.append(d[i].text) pc=soup.select('.playCount-container') for p in range(len(pc)): playCount.append(pc[p].text) time.sleep(random.random()3+1)print('爬取成功啦!
')result={'专辑名字':albumName,'歌曲名字':songName,'歌曲ID':songId,'歌曲时长':duration,'播放量':playCount}results=pd.DataFrame(result)results.info()results.to_excel('五月天歌曲清单.xlsx')

xiami(专辑信息).py

import requestsfrom bs4 import BeautifulSoupimport csvimport timeimport datetimeimport pandas as pdalbumCategory=[]albumId=[]albumLogo=[]albumName=[]artistName=[]collects=[]language=[]playCount=[]recommends=[]songCount=[]albumStringId=[]albumStatus=[]gmtPublish=[]grade=[]gradeCount=[]url='https://www.xiami.com/api/album/getArtistAlbums?_q=%7B%22pagingVO%22:%7B%22page%22:1,%22pageSize%22:60%7D,%22artistId%22:3110,%22category%22:0%7D&_s=dd6d0ef72dda69944fc2fbaa33c5bc6c'headers={ 'Connection': 'keep-alive', 'Cookie':'', 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1' }res = requests.get(url, headers=headers)content=json.loads(res.text,encoding='utf-8')for album in content['result']['data']['albums']: albumCategory.append(album['albumCategory']) albumId.append(album['albumId']) albumLogo.append(album['albumLogo']) albumName.append(album['albumName']) artistName.append(album['artistName']) collects.append(album['collects']) language.append(album['language']) playCount.append(album['playCount']) recommends.append(album['recommends']) songCount.append(album['songCount']) albumStringId.append(album['albumStringId']) albumStatus.append(album['albumStatus']) gmtPublish.append(datetime.datetime.fromtimestamp(int(album['gmtPublish']/1000))) grade.append(album['grade']) gradeCount.append(album['gradeCount'])result={'专辑种类':albumCategory,'专辑id':albumId,'专辑封面':albumLogo,'专辑名字':albumName,'艺术家':artistName,'收藏':collects,'措辞':language,'播放数':playCount,'推举':recommends,'歌曲数量':songCount,'专辑字符':albumStringId,'状态':albumStatus,'评分':grade,'评分人数':gradeCount,'发布韶光':gmtPublish}results=pd.DataFrame(result)results.info()results.to_excel('五月天专辑信息.xlsx')

xima_eachsong(歌曲详情).py

import requestsfrom bs4 import BeautifulSoupimport timeimport datetimeimport pandas as pdimport reimport random​songName=[]songIds=[]favCount=[]commentCount=[]lyrics=[]newSubName=[]​​songwriters=[] #作词composer=[] #作曲arrangement=[] #编曲albumId=[]albumName=[]​hotComment1=[]commentLike1=[]​playCount=[]​df=pd.read_excel('五月天歌曲清单.xlsx')albumString=df['歌曲ID']url='https://www.xiami.com/song/{}'​​#cookie须要常常保持更新for songid in albumString: print('正在爬取{}'.format(songid)) full_url=url.format(songid) headers={​ 'Connection': 'keep-alive', 'Cookie':'', 'User-Agent': '' } res = requests.get(full_url, headers=headers) soup=BeautifulSoup(res.text,'html.parser') songName.append(soup.select('.song-name')[0].text) songIds.append(songid) search_data=re.findall('(</span>)(.?)span class="ripple" style="height',res.text,re.S) favCount.append(str(search_data[1])[-10:-3].replace('n','').replace('>','').replace('n','')) if(soup.select('.lyric-content')): lyrics.append(soup.select('.lyric-content')[0].text) else: lyrics.append('无') if(soup.select('.song-subname')): newSubName.append(soup.select('.song-subname')[0].text) else: newSubName.append('') creatInfo=soup.select('.info-value') albumName.append(creatInfo[0].text) songwriters.append(creatInfo[1].text) #作词 composer.append(creatInfo[2].text) #作曲 arrangement.append(creatInfo[3].text) #编曲 playCount.append(soup.select('.count')[0].text[1:]) commentCount.append(soup.select('.count')) #第一条热门评论 if(soup.select('.comment-text')): hotComment1.append(soup.select('.comment-text')[0].text) else: hotComment1.append('') #第一条热门评论的点赞数(实在数据不太准) if(len(soup.select('.count'))>8): commentLike1.append(soup.select('.count')[8].text) else: commentLike1.append('无')​ ime.sleep(random.random()5)result={'歌曲名字':songName,'别名':newSubName,'歌曲Id':songIds,'收藏数量':favCount,'播放数量':playCount,'评论数量':commentCount,'作词':songwriters,'作曲':composer,'编曲':arrangement,'专辑名字':albumName,'歌词':lyrics,'热门评论1':hotComment1,'热门评论赞1':commentLike1}results=pd.DataFrame(result)results.info()results.to_excel('五月天歌曲详情1500.xlsx')