python爬取虾米音乐_Python爬取620首虾米歌曲,揭秘五月天为什么狂吸粉?!

前言

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

作者: CDA数据分析师

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

今天我就用Python爬一爬虾米音乐,半分析半安利地给大家介绍一下这个充满有趣灵魂的组合。

数据获取

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

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

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaTM0Nzc5NTc5MA==,size_16,color_FFFFFF,t_70

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

而且,爬虫的时候我还遇到两个坑:

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

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

最后得到三个文件,分别是专辑信息(50张)、歌曲列表(620首)和歌曲详情(620首),主要是通过专辑字符和歌曲id进行相关联,具体字段如下:

专辑信息(专辑种类、ID、封面、名字、艺术家、收藏数、语言、播放数、推荐数、歌曲数量、专辑字符、评分、评分人数、发布时间)

歌曲列表(专辑名字、歌曲名字、ID、时长、播放量)

歌曲详情(歌曲名字、别名、歌曲ID、时长、播放次数、作词、作曲、编曲、专辑名字、歌词、热门第一条评论、评论点赞数)

数据清洗

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaTM0Nzc5NTc5MA==,size_16,color_FFFFFF,t_70

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

判断作品的优劣,最明显快速的方式就是查看大众对其的评分,我们来瞧瞧这50张专辑的评分分布👇:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaTM0Nzc5NTc5MA==,size_16,color_FFFFFF,t_70

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

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

按照发布时间顺序排列:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaTM0Nzc5NTc5MA==,size_16,color_FFFFFF,t_70

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaTM0Nzc5NTc5MA==,size_16,color_FFFFFF,t_70

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaTM0Nzc5NTc5MA==,size_16,color_FFFFFF,t_70

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

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

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlaTM0Nzc5NTc5MA==,size_16,color_FFFFFF,t_70

代码部分

xiamisongs(歌曲清单).py

1 importrequests2 from bs4 importBeautifulSoup3 importtime4 importpandas as pd5 importrandom6 ​7 songName=[]8 songId=[]9 albumName=[]10 duration=[]11 playCount=[]12 ​13 df=pd.read_excel('五月天专辑信息.xlsx')14 albumString=df['专辑字符']15 ​16 ​17 headers={18 'Connection': 'keep-alive',19 'Cookie':'',20 'User-Agent': ''

21 }22 ​23 url='https://www.xiami.com/album/{}'

24 ​25 for albumId in albumString[13:]:26 print('正在爬取{}'.format(albumId))27 full_url=url.format(albumId)28 res = requests.get(full_url, headers=headers)29 soup=BeautifulSoup(res.text,'html.parser')30

31 #歌曲名字,专辑名字

32 sn=soup.select('.song-name')33 for i inrange(len(sn)):34 songName.append(sn[i].text)35 albumName.append(soup.select('.album-name')[0].text)36 #歌曲id

37 for item insn:38 a=item.find_all('a')39 for m ina:40 songId.append(m.get('href')[6:])41 #时长

42 d=soup.select('.duration')43 for i inrange(len(d)):44 duration.append(d[i].text)45 pc=soup.select('.playCount-container')46 for p inrange(len(pc)):47 playCount.append(pc[p].text)48

49 time.sleep(random.random()*3+1)50 ​51 print('爬取成功啦!')52 result={'专辑名字':albumName,'歌曲名字':songName,'歌曲ID':songId,'歌曲时长':duration,'播放量':playCount}53 results=pd.DataFrame(result)54 results.info()55 results.to_excel('五月天歌曲清单.xlsx')

xiami(专辑信息).py

1 importrequests2 from bs4 importBeautifulSoup3 importcsv4 importtime5 importdatetime6 importpandas as pd7 ​8 albumCategory=[]9 albumId=[]10 albumLogo=[]11 albumName=[]12 artistName=[]13 collects=[]14 language=[]15 playCount=[]16 recommends=[]17 songCount=[]18 albumStringId=[]19 albumStatus=[]20 gmtPublish=[]21 grade=[]22 gradeCount=[]23 ​24 ​25 ​26 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'

27 ​28 headers={29 'Connection': 'keep-alive',30 'Cookie':'',31 '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'

32 }33 res = requests.get(url, headers=headers)34 content=json.loads(res.text,encoding='utf-8')35 ​36 ​37 ​38 for album in content['result']['data']['albums']:39 albumCategory.append(album['albumCategory'])40 albumId.append(album['albumId'])41 albumLogo.append(album['albumLogo'])42 albumName.append(album['albumName'])43 artistName.append(album['artistName'])44 collects.append(album['collects'])45 language.append(album['language'])46 playCount.append(album['playCount'])47 recommends.append(album['recommends'])48 songCount.append(album['songCount'])49 albumStringId.append(album['albumStringId'])50 albumStatus.append(album['albumStatus'])51 gmtPublish.append(datetime.datetime.fromtimestamp(int(album['gmtPublish']/1000)))52 grade.append(album['grade'])53 gradeCount.append(album['gradeCount'])54 ​55 result={'专辑种类':albumCategory,'专辑id':albumId,'专辑封面':albumLogo,'专辑名字':albumName,'艺术家':artistName,'收藏':collects,'语言':language,'播放数':playCount,'推荐':recommends,'歌曲数量':songCount,'专辑字符':albumStringId,'状态':albumStatus,'评分':grade,'评分人数':gradeCount,'发布时间':gmtPublish}56 results=pd.DataFrame(result)57 results.info()58 results.to_excel('五月天专辑信息.xlsx')

xima_eachsong(歌曲详情).py

1 importrequests2 from bs4 importBeautifulSoup3 importtime4 importdatetime5 importpandas as pd6 importre7 importrandom8 ​9 songName=[]10 songIds=[]11 favCount=[]12 commentCount=[]13 lyrics=[]14 newSubName=[]15 ​16 ​17 songwriters=[] #作词

18 composer=[] #作曲

19 arrangement=[] #编曲

20 albumId=[]21 albumName=[]22 ​23 hotComment1=[]24 commentLike1=[]25 ​26 playCount=[]27 ​28 df=pd.read_excel('五月天歌曲清单.xlsx')29 albumString=df['歌曲ID']30 url='https://www.xiami.com/song/{}'

31 ​32 ​33 #cookie需要经常保持更新

34 for songid inalbumString:35 print('正在爬取{}'.format(songid))36 full_url=url.format(songid)37 headers={38 ​39 'Connection': 'keep-alive',40 'Cookie':'',41 'User-Agent': ''

42 }43 res = requests.get(full_url, headers=headers)44 soup=BeautifulSoup(res.text,'html.parser')45

46 songName.append(soup.select('.song-name')[0].text)47 songIds.append(songid)48

49 search_data=re.findall('()(.*?)span class="ripple" style="height',res.text,re.S)50 favCount.append(str(search_data[1])[-10:-3].replace('n','').replace('>','').replace('n',''))51

52 if(soup.select('.lyric-content')):53 lyrics.append(soup.select('.lyric-content')[0].text)54 else:55 lyrics.append('无')56

57 if(soup.select('.song-subname')):58 newSubName.append(soup.select('.song-subname')[0].text)59 else:60 newSubName.append('')61

62 creatInfo=soup.select('.info-value')63 albumName.append(creatInfo[0].text)64 songwriters.append(creatInfo[1].text) #作词

65 composer.append(creatInfo[2].text) #作曲

66 arrangement.append(creatInfo[3].text) #编曲

67

68 playCount.append(soup.select('.count')[0].text[1:])69 commentCount.append(soup.select('.count'))70

71 #第一条热门评论

72 if(soup.select('.comment-text')):73 hotComment1.append(soup.select('.comment-text')[0].text)74 else:75 hotComment1.append('')76 #第一条热门评论的点赞数(其实数据不太准)

77 if(len(soup.select('.count'))>8):78 commentLike1.append(soup.select('.count')[8].text)79 else:80 commentLike1.append('无')81 ​82 time.sleep(random.random()*5)83 ​84 result={'歌曲名字':songName,'别名':newSubName,'歌曲Id':songIds,'收藏数量':favCount,'播放数量':playCount,'评论数量':commentCount,'作词':songwriters,'作曲':composer,'编曲':arrangement,'专辑名字':albumName,'歌词':lyrics,'热门评论1':hotComment1,'热门评论赞1':commentLike1}85 results=pd.DataFrame(result)86 results.info()87 results.to_excel('五月天歌曲详情1500.xlsx')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值