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

PS:如有需要学习资料的小伙伴可以加点击下方链接自行获取
免费学习资料以及群交流解答点击即可加入
今天我就用爬一爬虾米音乐,半分析半安利地给大家介绍一下这个充满有趣灵魂的组合 。
数据获取
本次爬虫主要目的是爬取五月天所有歌曲的信息,信息维度当然是越多越好啦 。
直接搜索关键词“五月天”,可能会出现歌名是“五月天”的信息,或者别人翻唱“cover五月天”的内容,搜索范围变大,多抓取了不少无用信息 。
所以我以“五月天-艺人-专辑信息-歌曲id-歌曲详情”这个路径进行数据爬取 。我发现,无论是专辑信息、歌曲list还是歌曲详情,都存在于非常漂亮的JSON格式里面:
本来可以美滋滋“唰唰唰”地批量下载 。但是!URL里面有一个s的参数,我暂时找不到变化的规律(摔!)因为赶时间,就另辟蹊径,用相对麻烦一点的 soup库来解析网页源代码的内容,过程很坎坷,这就是我为什么五月天大电影上映凌晨还在写这篇文章的原因……
而且,爬虫的时候我还遇到两个坑:
1.两天前能运行的代码,在今天居然解析不到所需的内容了,因为爬取的东西内容格式发生了很大变化 。难道是我正巧赶上了他们内部修改源代码的节点嘛?无从查证 。
2.两天前还在显示的歌曲详情(播放量和收藏量),今天一看全都变成0了,每首歌都这样 。我让别的朋友用其他电脑查看,也是没信息的 。“检查”了一下,Play Count这些参数直接变成Null了…?
最后得到三个文件,分别是专辑信息(50张)、歌曲列表(620首)和歌曲详情(620首),主要是通过专辑字符和歌曲id进行相关联,具体字段如下:

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

文章插图
数据清洗
国际惯例:Excel画图表+画词云,(自认为)简单粗暴又高效 。
截止目前在虾米音乐平台关于五月天的一共有50张专辑,其中“正正经经”的专辑有9张(“录音室专辑”),“单曲”类专辑有20张,歌曲数量在1到6首不等 。
判断作品的优劣,最明显快速的方式就是查看大众对其的评分,我们来瞧瞧这50张专辑的评分分布:
可以看到,将近一半的的专辑评分在9.8-10.0之间,只有3张专辑评分没超过9分 。说明大众对其认可度还是相当高的 。
五月天曾说过只会出10张专辑,随着2016年《自传》的发布,现在已经有9张跟大家见面啦 。我们先看看这9张的数据情况 。
按照发布时间顺序排列:
根据专辑信息里面的歌曲ID(字符串形式和数字形式皆可),我们可以顺藤摸瓜爬取歌曲的信息,一共得到620首,除去没歌词的纯音乐歌曲55首,还剩565首 。
Python爬取620首虾米歌曲,揭秘五月天为什么狂吸粉?!

文章插图
再看看播放数量TOP20的歌曲:
我们从歌曲的创作内容来看看五月天的歌到底有什么特点 。
每首歌都要经历作词、作曲和编曲的过程 。在这177首歌里面,主唱阿信参加了139次作词、100次作曲,我说一句阿信是创作小王子没人反对吧!
编曲方面,68%的歌曲都是由五月天整个团队完成的,还有31首歌是有其他人参与合作的,合作次数最高的是周恒毅(8次) 。
代码部分
(歌曲清单).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)#歌曲idfor 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')