有温度 有深度 有广度 就等你来关注哦~
哈喽!我是栗子同学,爬虫部分小案例已经可以给大家写啦!
有小伙伴儿问我这么久都去哪儿了?
当然是学习新知识去啦,黑嘿嘿,很多爬虫的小案例小编已经会了哦!
今日主题:如果没有音乐,生活就是一个错误 :n首回味无穷的歌,总有曲深得你心啦!
所有文章完整的素材+源码都在👇👇
某音乐网址TOP500榜单:https://www.kugou.com/yy/rank/home/1-8888.html?from=rank
环境: Python 3 、Pycharm、requests 、bs4 。 其他内置模块,安装 好python环境就可以了。
(win + R 输入cmd 输入安装命令 pip install 模块名 (如果你觉得安 装速度比较慢, 你可以切
换国内镜像源))
第三方库的安装:pip install + 模块名 或者 带镜像源 pip install -i https://pypi.douban.com/simple/ +模块名
(1)确认要爬取的网页内容
(2)查询网页版酷狗可以发现,并没有手动翻页浏览的地方,但是通过观察第一页的url:
https://www.kugou.com/yy/rank/home/1-8888.html?from=rank
可以发现,只要改变链接中1-8888中的1变成2,再进行浏览如下图所示:
进行多次尝试后,发现更换不同数字就可以得到不同的页面,因此只需要更改home后面1-8888中
的1作为页面数字就可以看到不同的页面。由于每页显示为22首歌曲,所以总共需要23个url。如下
图所示:
从上图可以看到第23页正好可以显示到TOP500的歌曲数据。
(3)确认需要爬取的信息有排名、歌曲、歌手和歌曲时间,如下图:
- #导入相应的库文件
- import requests
- from bs4 import BeautifulSoup
- import time
-
- #加入请求头
- headers={
- "User-Agent": "xxx"
- }
-
- #定义获取信息函数
- def get_info(url):
- #通过请求头和url链接,得到整体网页页面信息
- web_data=requests.get(url,headers=headers)
- #对返回的结果进行解析
- soup=BeautifulSoup(web_data.text,'lxml')
- #找到具体的相同的数据的内容位置和内容
- ranks = soup.select('span.pc_temp_num')
- titles = soup.select('div.pc_temp_songlist > ul > li > a')
- times = soup.select('span.pc_temp_tips_r > span')
- #提取具体的文字内容
- for rank, title, time in zip(ranks, titles, times):
- data = {
- 'rank': rank.get_text().strip(),
- 'singer': title.get_text().split('-')[0],
- 'song': title.get_text().split('-')[1],
- 'time': time.get_text().strip()
- }
- print(data)
-
- #程序入口
- if __name__=='__main__':
- urls = ['https://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'.format(i) for i in range(1, 2)]
- for url in urls:
- get_info(url)
- time.sleep(1)
针对爬取的结果,是字典的形式,同时有的输出如:singer对应的输出还含有很多制表符,因此,
必须进行数据清洗,然后再进行保存,才能更好的为后续数据分析做好准备,代码如下:
- #包含整体和清洗和保存代码如下
- import requests
- from bs4 import BeautifulSoup
- import time
- import xlwt
-
- headers={
- "User-Agent": "xxx"
- }
-
- def get_info(url):
- data=[]
- #通过请求头和链接,得到网页页面整体信息
- web_data=requests.get(url,headers=headers)
- #print(web_data.text)
- #对返回的结果进行解析
- soup=BeautifulSoup(web_data.text,'lxml')
- #print(soup)
- #找到具体的相同的数据的内容位置和内容
- ranks = soup.select('span.pc_temp_num')
- titles = soup.select('div.pc_temp_songlist > ul > li > a')
- times = soup.select('span.pc_temp_tips_r > span')
- #提取具体的文字内容
- for rank, title, time in zip(ranks, titles, times):
- datadict = {
- 'rank': rank.get_text().strip(),
- 'singer': title.get_text().split('-')[0],
- 'song': title.get_text().split('-')[1],
- 'time': time.get_text().strip()
- }
- data_total.append(datadict)
-
- def get_data_save(df):
- #数据清洗
- for i in range(len(df)):
- df_list = []
- rank=df[i]['rank']
- singer=df[i]['singer'].strip()
- song=df[i]['song'].strip()
- time=df[i]['time']
- df_list.append(rank)
- df_list.append(singer)
- df_list.append(song)
- df_list.append(time)
- data.append(df_list)
-
- #数据保存成excel
- head = ['rank', 'title', 'user', 'time'] # 定义表头
- book = xlwt.Workbook(encoding='utf-8') # 创建工作簿
- sheet_name = book.add_sheet('酷狗TOP500') # 创建工作表
- # 写入表头数据
- for h in range(len(head)):
- sheet_name.write(0, h, head[h])
- row = 1
- data_len = len(data)
- for i in range(data_len):
- for j in range(len(head)):
- sheet_name.write(row, j, data[i][j])
- row += 1
- book.save('酷狗TOP500.xls')
-
- if __name__=='__main__':
- urls = ['https://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'.format(i) for i in range(1, 24)]
- data_total = []
- for url in urls:
- get_info(url)
- data=[]
- get_data_save(data_total)
- time.sleep(1)
对于已经爬取的数据已经保存成了excel,可以进行数据分析了,数据量小可以直接通过excel进行
透视或者可视化分析,如果数据量较大,可以通过python进行数据分析,也可以通过python进行可
视化的呈现。
此次酷狗Top500数据维度较少,只有排名、歌曲、歌手、时间4个维度,可以尝试去了解TOP歌曲
一般时长是多少,上榜最多的歌手是谁等等。
(1)按照每分钟一个区间,统计歌曲的时长分布如下:
可以很明显的看到,时间在3分钟的上榜歌曲数量最多:238个,4分钟的歌曲数量排名第二:168
个,3-4分钟歌曲数占:81.2%;视乎结论是3分钟的歌曲比较适合,但是不妨将时间粒度再切细一
点,看看是否会有什么不同。
(2)按照半分钟一个分段,统计歌曲的时长分布如下:
按照更细粒度的30秒进行切分,TOP500的歌曲时间主要都集中在3分30秒至4分30秒之间,占
top50歌曲比:50%;
(3)最后也顺便看一下,TOP500里面上榜最多的三位歌手是谁?
排名 | 歌手 | 歌曲数 |
1 | 周杰伦 | 34 |
2 | 林俊杰 | 13 |
3 | G.E.M.邓紫棋 | 8 |
项目0.2 【Python实战】WIFI密码小工具,甩万能钥匙十条街,WIFI任意连哦~(附源码)
项目0.3 【Python实战】再分享一款商品秒杀小工具,我已经把压箱底的宝贝拿出来啦~
项目0.4 【Python爬虫】过来人告诉你:为什么找工作抓住这个细节,能少踩很多坑哦~(招聘网站实战)
项目0.1 【Python抢票神器】火车票枪票软件到底靠谱吗?实测—终极攻略。
Python文章合集 | (入门到实战、游戏、Turtle、案例等)
(文章汇总还有更多你案例等你来学习啦~源码找我即可免费!)