python⾖瓣⾳乐排⾏榜数据爬取分析及可视化
python | ⾖瓣⾳乐排⾏榜数据爬取分析及可视化
⼀、选题背景
其实简单的对信息的下载,我们⽤不到爬⾍出马,简单的⼀个单机下载,就可以解决下载的问题,但是对于想要多个⾳乐(排⾏榜⾥),有⼀定规律的⾳乐进⾏下载我们就可以看到Python给我们带来的便利,其实也是⼀种对数据进⾏搜集的⼀种⽅式。希望通过简单的⾳乐排名的爬取可以让我们更加了解python,并且对⾳乐数据背后带来的信息进⾏分析。对于⾳乐爬取,这个不涉及到版权的问题,爬取上应该没有太多的限制,那我们要的就是⼀个⾳乐排⾏榜进⾏爬取学习,分析。我这⾥的是⾖瓣⾳乐本周⾳乐⼈最热单曲排⾏榜。我们确定我们想要的数据对应的排⾏了,这样我们对于我们的⽬标就⼜近了⼀步。
⼆、设计⽅案
1、名称
⾖瓣⾳乐排⾏榜数据爬取分析及可视化
2.内容与数据特征分析
爬取歌曲播放量的数据,分析各类数据之间的特征与关系
3.设计⽅案概述
通过访问⽹页源代码,爬取数据,分析html页⾯,标记需要的数据标签,对数据提取、处理、可视化、绘制图形、保存数据。
三、主题页⾯的结构特征分析
1、主题页⾯的结构与特征分析
从下⽅⽹站页⾯截图可看出,页⾯结构⼤致分为三部分,我们需要爬取的数据基本在左下边,其他的可以不去考虑。
2、Htmls页⾯解析
3.节点(标签)查⽅法与遍历⽅法(必要时画出节点树结构)
四、⽹络爬⾍程序设计
1、数据爬取与采集
皮特朱莉联合声明
1#-*- coding = utf-8 -*-
2from bs4 import BeautifulSoup
3#进⾏⽹页解析
4
5import re
6#进⾏⽂字匹配
7
9#制定URL,获取⽹页数据
10
11import xlwt
12#进⾏excel操作
13
14import sqlite3
15#进⾏SQLite数据库操作
16
17
18#开始爬取数据
21    html = askURL(url)
22    soup = BeautifulSoup(html,"html.parser")
23    i=1
24for item in soup.find_all('li', class_="clearfix"):
25        data = []
26        item = str(item)
27        pm = i
28        i=i+1
29        data.append(pm)
30        findgm = repile(r'javascript:;">(.*?)</a>')
31        gm = re.findall(findgm, item)[0]
32        data.append(gm)
33if i<=11:
34            findbfl = repile(r'\xa0/\xa0(.*?)</p>')
35            bfl = re.findall(findbfl, item)[0]
36            data.append(bfl)
37else:
38            findbfl2 = repile(r'\xa0/\xa0(.*?)\n')
39            bfl2 = re.findall(findbfl2, item)[0]
40            data.append(bfl2)
41        datalist.append(data)
42if i==16:
43break
44return datalist
45
46
47
48def askURL(url):
49    head = {
50"User-Agent": "Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome / 96.0.4664.110 Safari / 537.36"
51    }
52    request = quest.Request(url, headers=head)
53    html = ""
54try:
55        response = quest.urlopen(request)
56        html = ad().decode("utf-8")
URLError as e:
58if hasattr(e, "code"):
de)
60
61if hasattr(e, "reason"):
ason)
63
64return html
65
66
67
68 url = ("music.douban/chart")
69 html=askURL(url)
70 datalist = getData(url)
71print(datalist)
72 savepath = ".\\⾖瓣⾳乐本周⾳乐⼈最热单曲排⾏榜.xls"
73 book = xlwt.Workbook(encoding="utf-8",style_compression=0)
74
75#创建workbook对象
76 sheet = book.add_sheet('⾖瓣⾳乐本周⾳乐⼈最热单曲排⾏榜',cell_overwrite_ok=True)
77
78#创建⼯作表
79#列名
80 col = ("排名","歌名","播放量")
81
82#创建表头
83for i in range(0,3):
84    sheet.write(0,i,col[i])
85
86#输⼊数据
87for i in range(0,15):
88#将播放量数据转化为纯数字格式
89    datalist[i][2] = datalist[i][2].replace('次播放','')
90    data = datalist[i]
91for j in range(0,3):
92            sheet.write(i+1,j,data[j])
93
94 book.save(savepath)
95
96print('已输出表格!')
97print("爬取完毕!")
2、读取数据
1import pandas as pd
4 df_gm = pd.read_excel("⾖瓣⾳乐本周⾳乐⼈最热单曲排⾏榜.xls",encoding='utf-8')
5
林忆莲专辑
6#显⽰数据表格
7 df_gm.head(15)
输出内容如下:
3、数据清洗和处理
(1)查看是否有重复⾏,有重复⾏返回True,没有重复⾏返回False
1 df_gm.duplicated()
(2)判断数据⾏中是否存在缺失值,有缺失值返回True,没有缺失值返回False 1 df_gm.isnull().any(axis=1)
(3)查看是否有空值,有空值返回True,没有空值返回False
1 df_gm.isnull()
(4)查看是否存在异常值
1 df_gm.describe()
4、数据分析与可视化
(1)散点折线图
1#绘制散点折线图
2import pandas as pd
3import numpy as np
4import matplotlib.pyplot as plt
5 df_gm = pd.read_excel("⾖瓣⾳乐本周⾳乐⼈最热单曲排⾏榜.xls")
6
7#散点
8 plt.scatter(df_gm.排名,df_gm.播放量,color='b')
9
10#折线
郭美美是什么背景11 plt.plot(df_gm.排名,df_gm.播放量,color='r')
12
13#添加x轴标签和y轴标签
14 plt.xlabel('PM')
15 plt.ylabel('BFL')
16
17 plt.show()
(2)数据柱形图
1#绘制数据柱形图
2import matplotlib.pyplot as plt
3import pandas as pd
4import numpy as np
5
6 kuake_ad_excel(r'C:\Users\20832\⾖瓣⾳乐本周⾳乐⼈最热单曲排⾏榜.xls')
7 data=np.array(kuake_df['播放量'][0:15])
8
9#添加x轴标签和y轴标签
11 plt.ylabel('BFL')
12
失恋阵线联盟伴奏13 s = pd.Series(data, index)
14 s.plot(kind='bar',color='cyan')
15
16#添加⽹格
id()
18
19 plt.show()
(3)线性回归⽅程
1#线性回归⽅程
2import pandas as pd
3from sklearn import datasets
4from sklearn.datasets import load_boston
5from sklearn.linear_model import LinearRegression
6 df_ad_excel(r'C:\Users\20832\⾖瓣⾳乐本周⾳乐⼈最热单曲排⾏榜.xls')
7 predict_model=LinearRegression()
8 X=df_gm[["排名"]]
9 Y=df_gm["播放量"]
10 predict_model.fit(X,Y)
11 np.set_printoptions(precision=3,suppress=True)
12print("回归⽅程系数为{}".format( f_))
13print("回归⽅程截距:{0:2f}".format( predict_model.intercept_))
1#绘制线性回归⽅程图
2import matplotlib.pyplot as plt
3import matplotlib
4import numpy as np
5import scipy.optimize as opt
6 df_ad_excel(r'C:\Users\20832\⾖瓣⾳乐本周⾳乐⼈最热单曲排⾏榜.xls')
7 x0=np.array(df_gm['排名'])
8 y0=np.array(df_gm['播放量'])
9def func(x,c0):
10    a,b,c=c0
11return a*x**2+b*x+c
12def errfc(c0,x,y):
13return y-func(x,c0)
14 c0=[0,2,3]
15 c1=opt.leastsq(errfc,c0,args=(x0,y0))[0]
16 a,b,c=c1
17print(f"拟合⽅程为:y={a}*x**2+{b}*x+{c}")
18 chinese=matplotlib.font_manager.FontProperties(fname='C:\Windows\')
19 plt.plot(x0,y0,"ob",label="样本数据")
20 plt.plot(x0,func(x0,c1),"r",label="拟合曲线")
21#添加x轴标签和y轴标签
22 plt.xlabel("PM")
23 plt.ylabel("BFL")
24 plt.legend(loc=3,prop=chinese)
25 plt.show()
5、完整代码
1#-*- coding = utf-8 -*-
2from bs4 import BeautifulSoup
3#进⾏⽹页解析
4
5import re
6#进⾏⽂字匹配
从前你穿越风雨都会仓促见一面
7
9#制定URL,获取⽹页数据
10
11import xlwt
13
母亲教我的歌
14import sqlite3
15#进⾏SQLite数据库操作
16
17
18#开始爬取数据
19def getData(url):
20    datalist = []
21    html = askURL(url)
22    soup = BeautifulSoup(html,"html.parser")
23    i=1
24for item in soup.find_all('li', class_="clearfix"):
25        data = []
26        item = str(item)
27        pm = i
28        i=i+1
29        data.append(pm)
30        findgm = repile(r'javascript:;">(.*?)</a>')
31        gm = re.findall(findgm, item)[0]
32        data.append(gm)
33if i<=11:
34            findbfl = repile(r'\xa0/\xa0(.*?)</p>')
35            bfl = re.findall(findbfl, item)[0]
36            data.append(bfl)
37else:
38            findbfl2 = repile(r'\xa0/\xa0(.*?)\n')
39            bfl2 = re.findall(findbfl2, item)[0]
40            data.append(bfl2)
41        datalist.append(data)
42if i==16:
43break
44return datalist
45
46
47
48def askURL(url):
49    head = {
50"User-Agent": "Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome / 96.0.4664.110 Safari / 537.36"
51    }
52    request = quest.Request(url, headers=head)
53    html = ""
54try:
55        response = quest.urlopen(request)
56        html = ad().decode("utf-8")
URLError as e:
58if hasattr(e, "code"):
de)
60
61if hasattr(e, "reason"):
ason)
63
64return html
65
66
67
68 url = ("music.douban/chart")
69 html=askURL(url)
70 datalist = getData(url)
71print(datalist)
72 savepath = ".\\⾖瓣⾳乐本周⾳乐⼈最热单曲排⾏榜.xls"
73 book = xlwt.Workbook(encoding="utf-8",style_compression=0)
74
75#创建workbook对象
76 sheet = book.add_sheet('⾖瓣⾳乐本周⾳乐⼈最热单曲排⾏榜',cell_overwrite_ok=True)
77
78#创建⼯作表
79#列名
80 col = ("排名","歌名","播放量")
81
82#创建表头
83for i in range(0,3):
84    sheet.write(0,i,col[i])
85
86#输⼊数据
87for i in range(0,15):
88#将播放量数据转化为纯数字格式
89    datalist[i][2] = datalist[i][2].replace('次播放','')
90    data = datalist[i]
91for j in range(0,3):
92            sheet.write(i+1,j,data[j])
93
94 book.save(savepath)