粗饼·中国魔方赛事网中国三阶魔方速盲前100爬虫分析
一、选题背景
魔方,又叫鲁比克方块,最早是由匈牙利布达佩斯建筑学院厄尔诺·鲁比克教授于1974年发明的机械益智玩具。WCA(World Cube Association,世界魔方协会)每年都会在世界各地举办各类大小魔方赛事。1991年十一月中国国内首次魔方比赛在广州进行,2004年元月中国选手首次参加世界魔方协会比赛,2009年5月中国选手首次在官方比赛中打破世界纪录,2014年6月粗饼•中国魔方赛事网(Cubing China)正式上线,为国内魔方事业的发展起到了关键的作用,如今在三阶魔方上中国人也取得了优秀的成绩。本次课程将会对粗饼网的三阶魔方速拧与盲拧的前100名的相关数据进行爬虫分析。
二、主题式网络爬虫设计方案
1.主题式网络爬虫名称
粗饼·中国魔方赛事网中国三阶魔方单次速盲前100爬虫分析
2.主题式网络爬虫爬取的内容与数据特征分析
爬取粗饼网中国三阶魔方单次速拧与盲拧前100名的排名,姓名,地区,成绩,比赛,日期,年份数据,对其进行分析。
数据来源:https://cubing.com/(数据截止至2021年12月27日)
3.主题式网络爬虫设计方案概述
(1)实现思路
通过对粗饼网的页面进行分析,利用Requests爬虫库和BeautifulSoup库爬取到我们所需要的粗饼网中国三阶魔方单次速拧与盲拧前100名的排名,姓名,地区,成绩,比赛,日期,年份数据,然后再保存为.csv文件,最后进行可视化分析。
(2)技术难点
爬取数据中的一些困难,在利用Matplotlib与PyEcharts进行数据可视化分析时遇到了难点。
三、主题页面的结构特征分析
1.主题页面的结构与特征分析
需要爬取的相关页面截图
三阶单次成绩前100(截图仅展示部分)
三阶单次盲拧成绩前100(截图仅展示部分)
我们需要爬取的数据如图所示。
2.Htmls 页面解析
通过对页面审查元素观察分析,可以得知我们所需要爬取的数据在body标签下的div标签中(三阶盲拧单次的数据也是一样的)
3.节点(标签)查找方法与遍历方法
通过for循环进行节点(标签)的查找与遍历。
四、网络爬虫程序设计
1.数据爬取与采集
1 #导入我们所需要的库# 2 import requests 3 from bs4 import BeautifulSoup 4 import csv 5 main_url = 'https://cubingchina.com' 6 def get_html(url): 7 #根据url返回相应的html对象# 8 #写入请求标头# 9 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'} 10 response = requests.get(url, headers=headers) 11 response.encoding='utf-8-sig' 12 html = response.text 13 return html 14 def get_soup(html): 15 #根据HTML返回beautifulsoup对象# 16 soup = BeautifulSoup(html, 'lxml') 17 return soup 18 def get_rank_list(soup): 19 #使用beautifulsoup解析网页,取得选手信息,并返回选手信息列表# 20 rank_text_list = soup.find('table', {'class': 'table table-bordered table-condensed table-hover table-boxed'}) 21 rank_text_list = rank_text_list.find_all('tr')[1:] 22 rank_list = [] 23 for rank_text in rank_text_list: 24 rank_text = rank_text.find_all('td') 25 rank = rank_text[1].extract().text 26 name = rank_text[2].extract().text 27 region = rank_text[3].extract().text 28 result = rank_text[4].extract().text 29 competitive = rank_text[5].extract().text 30 date = rank_text[6].extract().text 31 item = (rank, name, region, result, competitive, date) 32 rank_list.append(item) 33 return rank_list 34 def writer_file(rank_list, flag=''): 35 #将三阶速拧的数据写入csv文件# 36 header = ('排名', '姓名','地区', '成绩', '比赛', '日期') 37 with open('333_single_china.csv', 'a',encoding='utf-8-sig',newline='') as file: 38 writer = csv.writer(file) 39 if flag == 'first': 40 writer.writerow(header) 41 for rank in rank_list: 42 writer.writerow(rank) 43 def main(): 44 start_url = 'https://cubing.com/results/rankings' 45 html = get_html(start_url) 46 soup = get_soup(html) 47 # 将三阶单次排名写入文件# 48 rank_list = get_rank_list(soup) 49 writer_file(rank_list, 'first') 50 print('三阶单次速拧排名数据爬取成功,已保存!') 51 if __name__=="__main__": 52 main() 53 def writer_file(rank_list, flag=''): 54 #将三阶盲拧的数据写入csv文件# 55 header = ('排名', '姓名','地区', '成绩', '比赛', '日期') 56 with open('333bf_single_china.csv', 'a',encoding='utf-8-sig',newline='') as file: 57 writer = csv.writer(file) 58 if flag == 'first': 59 writer.writerow(header) 60 for rank in rank_list: 61 writer.writerow(rank) 62 def main(): 63 start_url = 'https://cubing.com/results/rankings?region=China&event=333bf&gender=all&type=single' 64 html = get_html(start_url) 65 soup = get_soup(html) 66 # 三阶盲拧排名写入文件# 67 rank_list = get_rank_list(soup) 68 writer_file(rank_list, 'first') 69 print('三阶盲拧单次排名数据爬取成功,已保存!') 70 if __name__=="__main__": 71 main()
运行结果:
保存的csv文件如下
1 #导入三阶魔方速拧单次中国前100排名数据# 2 import pandas as pd 3 df=pd.DataFrame(pd.read_csv('C:\\Users\\Lenovo\\Desktop\\中国三阶魔方数据\\333_single_china.csv')) 4 df
运行结果:
1 #导入三阶魔方盲拧单次中国前100排名数据# 2 import pandas as pd 3 df2=pd.DataFrame(pd.read_csv('C:\\Users\\Lenovo\\Desktop\\中国三阶魔方数据\\333bf_single_china.csv')) 4 df2
运行结果:
1 #删除三阶速拧单次排名数据中我们不需要的行和列# 2 df.drop('比赛',axis=1,inplace=True) 3 df 4 df.drop('地区',axis=1,inplace=True) 5 df
运行结果:
1 #删除三阶单次盲拧排名中我们不需要的行和列# 2 df2.drop('比赛',axis=1,inplace=True) 3 df2 4 df2.drop('地区',axis=1,inplace=True) 5 df2
运行结果:
1 # 查看数据是否存在有空值,有空值返回True,没有空值返回False# 2 df.isnull().value_counts()
运行结果:
1 df2.isnull().value_counts()
运行结果:
1 # 查看爬取的数据是否有重复行,有重复行返回True,没有重复行返回False# 2 df.duplicated()
运行结果:
1 df2.duplicated()
运行结果:
3.数据分析与可视化
1 #利用Matplotlib绘制截止至2021年12月27日中国三阶魔方速拧前100排名柱状图# 2 #导入库# 3 import pandas as pd 4 import matplotlib 5 import matplotlib.pyplot as plt 6 plt.figure(figsize=(15, 7),dpi=600) 7 # 解决中文和负号显示问题# 8 plt.rcParams['font.sans-serif']=['SimHei'] 9 plt.rcParams['axes.unicode_minus'] = False 10 #读取中国三阶魔方单次速拧前100数据csv文件# 11 df = pd.read_csv("C:\\Users\\Lenovo\\Desktop\\中国三阶魔方数据\\333_single_china.csv") 12 #设置x轴与y轴显示内容# 13 plt.bar(df['姓名'], df['成绩']) 14 #设置标题# 15 plt.title(r'截止至2021年12月27日中国三阶魔方速拧前100排名(单位:s)') 16 #设置x轴标签# 17 plt.xlabel('选手姓名') 18 #设置y轴标签# 19 plt.ylabel(r'选手成绩') 20 #将x轴标签字体调整为7# 21 plt.tick_params(labelsize=7) 22 #将x轴标签字体顺时针旋转90度# 23 plt.xticks(rotation=90) 24 #数据持久化# 25 plt.savefig('截止至2021年12月27日中国三阶魔方速拧前100排名.jpg') 26 #显示可视化结果# 27 plt.show()
运行结果:
1 #利用pyecharts绘制截止至2021年12月27日中国三阶魔方盲拧前100排名柱状图# 2 #导入库# 3 import time 4 import json 5 import pandas as pd 6 import numpy as np 7 from pyecharts import options as opts 8 data=df2 9 bar = ( 10 Bar() 11 .add_xaxis(df2["姓名"].tolist()) 12 .add_yaxis("成绩", df2["成绩"].tolist()) 13 .set_global_opts( 14 #图形标题的设置# 15 title_opts=opts.TitleOpts( 16 title="截止至2021年12月27日中国三阶魔方盲拧前100排名", 17 subtitle="(图中仅展示部分)", 18 pos_left="center", 19 pos_top="7%"), 20 #'shadow':阴影指示器# 21 tooltip_opts=opts.TooltipOpts( 22 is_show=True, 23 trigger="axis", 24 axis_pointer_type="shadow" 25 ), 26 #x轴坐标配置项,x轴标签,顺时针旋转90度# 27 xaxis_opts=opts.AxisOpts(name="姓名",axislabel_opts={"interval":"0","rotate":90}), 28 #y轴配置项# 29 yaxis_opts=opts.AxisOpts( 30 name="成绩",min_=0, 31 type_="value",axislabel_opts=opts.LabelOpts(formatter="{value} 秒"),), 32 #区域缩放配置项# 33 datazoom_opts=opts.DataZoomOpts(range_start=0,range_end=10), 34 ) 35 ) 36 bar.render_notebook()
运行结果:
1 #利用Matplotlib绘制截止至2021年12月27日中国三阶魔方速拧前100创造时间散点图# 2 import pandas as pd 3 import matplotlib.pyplot as plt 4 plt.figure(figsize=(15, 6.5),dpi=600) 5 plt.title('截止至2021年12月27日中国三阶魔方速拧前100创造时间散点图',size=25,color="black") 6 #画出散点图# 7 plt.scatter(df['日期'], df['创造年份']) 8 plt.xticks(rotation=90) 9 #数据持久化# 10 plt.savefig('截止至2021年12月27日中国三阶魔方速拧前100创造时间散点图.jpg') 11 #将散点图显示出来 12 plt.show()
运行结果:
1 #利用Matplotlib绘制截止至2021年12月27日中国三阶魔方盲拧前100创造时间散点图# 2 import pandas as pd 3 import matplotlib.pyplot as plt 4 plt.figure(figsize=(15, 6.5),dpi=600) 5 plt.title('截止至2021年12月27日中国三阶魔方盲拧前100创造时间散点图',size=25,color="black") 6 #画出散点图# 7 plt.scatter(df2['日期'], df2['创造年份']) 8 plt.xticks(rotation=90) 9 #数据持久化# 10 plt.savefig('截止至2021年12月27日中国三阶魔方盲拧前100创造时间散点图.jpg') 11 #将散点图显示出来 12 plt.show()
运行结果:
1 #利用Matplotlib绘制截止至2021年12月27日中国三阶魔方速拧前100成绩创造时间分布图# 2 #导入库# 3 import pandas as pd 4 import matplotlib 5 import matplotlib.pyplot as plt 6 #设置图形大小# 7 plt.figure(figsize=(15,7),dpi=80) 8 #设置各部分显示比例# 9 finance=[len(df[df["创造年份"]==2015]["创造年份"]), 10 len(df[df["创造年份"]==2017]["创造年份"]), 11 len(df[df["创造年份"]==2018]["创造年份"]), 12 len(df[df["创造年份"]==2019]["创造年份"]), 13 len(df[df["创造年份"]==2020]["创造年份"]), 14 len(df[df["创造年份"]==2021]["创造年份"])] 15 16 #设置中文显示,解决乱码问题# 17 font = {'family' : 'MicroSoft YaHei', 18 'weight': 'bold', 19 'size': '12'} 20 matplotlib.rc("font",**font) 21 matplotlib.rc("font", 22 family='MicroSoft YaHei', 23 weight="bold") 24 labels = ["2015", 25 "2017", 26 "2018", 27 "2019", 28 "2020", 29 "2021"] 30 explode = [0.1, 0.1, 0.1, 0.1,0.1,0.1] 31 colors = ['mistyrose', 'salmon', 'tomato', 'darksalmon','mistyrose','orangered'] 32 #设置饼图相关参数# 33 plt.pie(finance, explode=explode, labels=labels, 34 colors=colors,autopct='%.2f%%', 35 pctdistance=0.8, labeldistance=1.1, 36 startangle=180, radius=1.2, 37 counterclock=False, 38 wedgeprops={'linewidth':1.5, 'edgecolor':'white'}, 39 textprops={'fontsize':10, 'color':'black'} ) 40 #设置标题# 41 plt.title('中国三阶魔方速拧前100成绩创造年份分布饼图') 42 #数据持久化# 43 plt.savefig('中国三阶魔方速拧前100成绩创造年份分布饼图.jpg') 44 #显示可视化图像# 45 plt.show()
运行结果:
1 #利用Matplotlib绘制截止至2021年12月27日中国三阶魔方盲拧前100成绩创造时间分布图# 2 #导入库# 3 import pandas as pd 4 import matplotlib 5 import matplotlib.pyplot as plt 6 #设置图形大小# 7 plt.figure(figsize=(15,7),dpi=80) 8 #设置各部分显示比例# 9 finance=[len(df2[df2["创造年份"]==2009]["创造年份"]), 10 len(df2[df2["创造年份"]==2010]["创造年份"]), 11 len(df2[df2["创造年份"]==2012]["创造年份"]), 12 len(df2[df2["创造年份"]==2013]["创造年份"]), 13 len(df2[df2["创造年份"]==2014]["创造年份"]), 14 len(df2[df2["创造年份"]==2015]["创造年份"]), 15 len(df2[df2["创造年份"]==2016]["创造年份"]), 16 len(df2[df2["创造年份"]==2017]["创造年份"]), 17 len(df2[df2["创造年份"]==2018]["创造年份"]), 18 len(df2[df2["创造年份"]==2019]["创造年份"]), 19 len(df2[df2["创造年份"]==2021]["创造年份"])] 20 21 #设置中文显示,解决乱码问题# 22 font = {'family' : 'MicroSoft YaHei', 23 'weight': 'bold', 24 'size': '12'} 25 matplotlib.rc("font",**font) 26 matplotlib.rc("font", 27 family='MicroSoft YaHei', 28 weight="bold") 29 #设置饼图显示# 30 labels = ["2009", 31 "2010", 32 "2012", 33 "2013", 34 "2014", 35 "2015", 36 "2016", 37 "2017", 38 "2018", 39 "2019", 40 "2021"] 41 explode = [0.1, 0.1, 0.1, 0.1,0.1,0.1,0.1, 0.1, 0.1, 0.1,0.1] 42 colors = ['plum', 'violet', 'purple', 'darkmagenta','m','thistle','magenta','orchid','mediumvioletred','deeppink','hotpink'] 43 #设置饼图相关参数# 44 plt.pie(finance, explode=explode, labels=labels, 45 colors=colors,autopct='%.2f%%', 46 pctdistance=0.8, labeldistance=1.1, 47 startangle=180, radius=1.2, 48 counterclock=False, 49 wedgeprops={'linewidth':1.5, 'edgecolor':'white'}, 50 textprops={'fontsize':10, 'color':'black'} ) 51 #设置标题# 52 plt.title('中国三阶魔方盲拧前100成绩创造年份分布饼图') 53 #数据持久化# 54 plt.savefig('中国三阶盲拧速拧前100成绩创造年份分布饼图.jpg') 55 #显示可视化图像# 56 plt.show()
运行结果:
4.数据持久化
1 #数据持久化# 2 plt.savefig('截止至2021年12月27日中国三阶魔方速拧前100排名.jpg') 3 plt.savefig('截止至2021年12月27日中国三阶魔方速拧前100创造时间散点图.jpg') 4 plt.savefig('截止至2021年12月27日中国三阶魔方盲拧前100创造时间散点图.jpg') 5 plt.savefig('中国三阶魔方速拧前100成绩创造年份分布饼图.jpg') 6 plt.savefig('中国三阶盲拧速拧前100成绩创造年份分布饼图.jpg')
运行结果:
5.附上完整代码
1 #导入我们所需要的库# 2 import requests 3 from bs4 import BeautifulSoup 4 import csv 5 main_url = 'https://cubingchina.com' 6 def get_html(url): 7 #根据url返回相应的html对象# 8 #写入请求标头# 9 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'} 10 response = requests.get(url, headers=headers) 11 response.encoding='utf-8-sig' 12 html = response.text 13 return html 14 def get_soup(html): 15 #根据HTML返回beautifulsoup对象# 16 soup = BeautifulSoup(html, 'lxml') 17 return soup 18 def get_rank_list(soup): 19 #使用beautifulsoup解析网页,取得选手信息,并返回选手信息列表# 20 rank_text_list = soup.find('table', {'class': 'table table-bordered table-condensed table-hover table-boxed'}) 21 rank_text_list = rank_text_list.find_all('tr')[1:] 22 rank_list = [] 23 for rank_text in rank_text_list: 24 rank_text = rank_text.find_all('td') 25 rank = rank_text[1].extract().text 26 name = rank_text[2].extract().text 27 region = rank_text[3].extract().text 28 result = rank_text[4].extract().text 29 competitive = rank_text[5].extract().text 30 date = rank_text[6].extract().text 31 item = (rank, name, region, result, competitive, date) 32 rank_list.append(item) 33 return rank_list 34 def writer_file(rank_list, flag=''): 35 #将三阶速拧的数据写入csv文件# 36 header = ('排名', '姓名','地区', '成绩', '比赛', '日期') 37 with open('333_single_china.csv', 'a',encoding='utf-8-sig',newline='') as file: 38 writer = csv.writer(file) 39 if flag == 'first': 40 writer.writerow(header) 41 for rank in rank_list: 42 writer.writerow(rank) 43 def main(): 44 start_url = 'https://cubing.com/results/rankings' 45 html = get_html(start_url) 46 soup = get_soup(html) 47 # 将三阶单次排名写入文件# 48 rank_list = get_rank_list(soup) 49 writer_file(rank_list, 'first') 50 print('三阶单次速拧排名数据爬取成功,已保存!') 51 if __name__=="__main__": 52 main() 53 def writer_file(rank_list, flag=''): 54 #将三阶盲拧的数据写入csv文件# 55 header = ('排名', '姓名','地区', '成绩', '比赛', '日期') 56 with open('333bf_single_china.csv', 'a',encoding='utf-8-sig',newline='') as file: 57 writer = csv.writer(file) 58 if flag == 'first': 59 writer.writerow(header) 60 for rank in rank_list: 61 writer.writerow(rank) 62 def main(): 63 start_url = 'https://cubing.com/results/rankings?region=China&event=333bf&gender=all&type=single' 64 html = get_html(start_url) 65 soup = get_soup(html) 66 # 三阶盲拧排名写入文件# 67 rank_list = get_rank_list(soup) 68 writer_file(rank_list, 'first') 69 print('三阶盲拧单次排名数据爬取成功,已保存!') 70 if __name__=="__main__": 71 main() 72 73 #利用Matplotlib绘制截止至2021年12月27日中国三阶魔方速拧前100排名柱状图# 74 #导入库# 75 import pandas as pd 76 import matplotlib 77 import matplotlib.pyplot as plt 78 plt.figure(figsize=(15, 7),dpi=600) 79 80 # 解决中文和负号显示问题# 81 plt.rcParams['font.sans-serif']=['SimHei'] 82 plt.rcParams['axes.unicode_minus'] = False 83 84 #读取中国三阶魔方单次速拧前100数据csv文件# 85 df = pd.read_csv("C:\\Users\\Lenovo\\Desktop\\中国三阶魔方数据\\333_single_china.csv") 86 87 #设置x轴与y轴显示内容# 88 plt.bar(df['姓名'], df['成绩']) 89 90 #设置标题# 91 plt.title(r'截止至2021年12月27日中国三阶魔方速拧前100排名(单位:s)') 92 93 #设置x轴标签# 94 plt.xlabel('选手姓名') 95 96 #设置y轴标签# 97 plt.ylabel(r'选手成绩') 98 99 #将x轴标签字体调整为7# 100 plt.tick_params(labelsize=7) 101 102 #将x轴标签字体顺时针旋转90度# 103 plt.xticks(rotation=90) 104 105 #数据持久化# 106 plt.savefig('截止至2021年12月27日中国三阶魔方速拧前100排名.jpg') 107 108 #显示可视化结果# 109 plt.show() 110 111 #利用pyecharts绘制截止至2021年12月27日中国三阶魔方盲拧前100排名柱状图# 112 #导入库# 113 import time 114 import json 115 import pandas as pd 116 import numpy as np 117 from pyecharts import options as opts 118 119 bar = ( 120 Bar() 121 .add_xaxis(df2["姓名"].tolist()) 122 .add_yaxis("成绩", df2["成绩"].tolist()) 123 .set_global_opts( 124 #图形标题的设置# 125 title_opts=opts.TitleOpts( 126 title="截止至2021年12月27日中国三阶魔方盲拧前100排名", 127 subtitle="(图中仅展示部分)", 128 pos_left="center", 129 pos_top="7%"), 130 #'shadow':阴影指示器# 131 tooltip_opts=opts.TooltipOpts( 132 is_show=True, 133 trigger="axis", 134 axis_pointer_type="shadow" 135 ), 136 #x轴坐标配置项,x轴标签,顺时针旋转90度# 137 xaxis_opts=opts.AxisOpts(name="姓名",axislabel_opts={"interval":"0","rotate":90}), 138 #y轴配置项# 139 yaxis_opts=opts.AxisOpts( 140 name="成绩",min_=0, 141 type_="value",axislabel_opts=opts.LabelOpts(formatter="{value} 秒"),), 142 #区域缩放配置项# 143 datazoom_opts=opts.DataZoomOpts(range_start=0,range_end=10), 144 ) 145 ) 146 bar.render_notebook() 147 148 #利用Matplotlib绘制截止至2021年12月27日中国三阶魔方速拧前100创造时间散点图# 149 import pandas as pd 150 import matplotlib.pyplot as plt 151 plt.figure(figsize=(15, 6.5),dpi=600) 152 plt.title('截止至2021年12月27日中国三阶魔方速拧前100创造时间散点图',size=25,color="black") 153 154 #画出散点图# 155 plt.scatter(df['日期'], df['创造年份']) 156 plt.xticks(rotation=90) 157 158 #数据持久化# 159 plt.savefig('截止至2021年12月27日中国三阶魔方速拧前100创造时间散点图.jpg') 160 161 #将散点图显示出来 162 plt.show() 163 164 #利用Matplotlib绘制截止至2021年12月27日中国三阶魔方盲拧前100创造时间散点图# 165 import pandas as pd 166 import matplotlib.pyplot as plt 167 plt.figure(figsize=(15, 6.5),dpi=600) 168 plt.title('截止至2021年12月27日中国三阶魔方盲拧前100创造时间散点图',size=25,color="black") 169 170 #画出散点图# 171 plt.scatter(df2['日期'], df2['创造年份']) 172 plt.xticks(rotation=90) 173 174 #数据持久化# 175 plt.savefig('截止至2021年12月27日中国三阶魔方盲拧前100创造时间散点图.jpg') 176 177 #将散点图显示出来 178 plt.show() 179 180 #利用Matplotlib绘制截止至2021年12月27日中国三阶魔方速拧前100成绩创造时间分布图# 181 #导入库# 182 import pandas as pd 183 import matplotlib 184 import matplotlib.pyplot as plt 185 186 #设置图形大小# 187 plt.figure(figsize=(15,7),dpi=80) 188 189 #设置各部分显示比例# 190 finance=[len(df[df["创造年份"]==2015]["创造年份"]), 191 len(df[df["创造年份"]==2017]["创造年份"]), 192 len(df[df["创造年份"]==2018]["创造年份"]), 193 len(df[df["创造年份"]==2019]["创造年份"]), 194 len(df[df["创造年份"]==2020]["创造年份"]), 195 len(df[df["创造年份"]==2021]["创造年份"])] 196 197 #设置中文显示,解决乱码问题# 198 font = {'family' : 'MicroSoft YaHei', 199 'weight': 'bold', 200 'size': '12'} 201 matplotlib.rc("font",**font) 202 matplotlib.rc("font", 203 family='MicroSoft YaHei', 204 weight="bold") 205 labels = ["2015", 206 "2017", 207 "2018", 208 "2019", 209 "2020", 210 "2021"] 211 explode = [0.1, 0.1, 0.1, 0.1,0.1,0.1] 212 colors = ['mistyrose', 'salmon', 'tomato', 'darksalmon','mistyrose','orangered'] 213 214 #设置饼图相关参数# 215 plt.pie(finance, explode=explode, labels=labels, 216 colors=colors,autopct='%.2f%%', 217 pctdistance=0.8, labeldistance=1.1, 218 startangle=180, radius=1.2, 219 counterclock=False, 220 wedgeprops={'linewidth':1.5, 'edgecolor':'white'}, 221 textprops={'fontsize':10, 'color':'black'} ) 222 223 #设置标题# 224 plt.title('中国三阶魔方速拧前100成绩创造年份分布饼图') 225 226 #数据持久化# 227 plt.savefig('中国三阶魔方速拧前100成绩创造年份分布饼图.jpg') 228 229 #显示可视化图像# 230 plt.show() 231 232 #利用Matplotlib绘制截止至2021年12月27日中国三阶魔方盲拧前100成绩创造时间分布图# 233 #导入库# 234 import pandas as pd 235 import matplotlib 236 import matplotlib.pyplot as plt 237 238 #设置图形大小# 239 plt.figure(figsize=(15,7),dpi=80) 240 241 #设置各部分显示比例# 242 finance=[len(df2[df2["创造年份"]==2009]["创造年份"]), 243 len(df2[df2["创造年份"]==2010]["创造年份"]), 244 len(df2[df2["创造年份"]==2012]["创造年份"]), 245 len(df2[df2["创造年份"]==2013]["创造年份"]), 246 len(df2[df2["创造年份"]==2014]["创造年份"]), 247 len(df2[df2["创造年份"]==2015]["创造年份"]), 248 len(df2[df2["创造年份"]==2016]["创造年份"]), 249 len(df2[df2["创造年份"]==2017]["创造年份"]), 250 len(df2[df2["创造年份"]==2018]["创造年份"]), 251 len(df2[df2["创造年份"]==2019]["创造年份"]), 252 len(df2[df2["创造年份"]==2021]["创造年份"])] 253 254 #设置中文显示,解决乱码问题# 255 font = {'family' : 'MicroSoft YaHei', 256 'weight': 'bold', 257 'size': '12'} 258 matplotlib.rc("font",**font) 259 matplotlib.rc("font", 260 family='MicroSoft YaHei', 261 weight="bold") 262 263 #设置饼图显示# 264 labels = ["2009", 265 "2010", 266 "2012", 267 "2013", 268 "2014", 269 "2015", 270 "2016", 271 "2017", 272 "2018", 273 "2019", 274 "2021"] 275 explode = [0.1, 0.1, 0.1, 0.1,0.1,0.1,0.1, 0.1, 0.1, 0.1,0.1] 276 colors = ['plum', 'violet', 'purple', 'darkmagenta','m','thistle','magenta','orchid','mediumvioletred','deeppink','hotpink'] 277 278 #设置饼图相关参数# 279 plt.pie(finance, explode=explode, labels=labels, 280 colors=colors,autopct='%.2f%%', 281 pctdistance=0.8, labeldistance=1.1, 282 startangle=180, radius=1.2, 283 counterclock=False, 284 wedgeprops={'linewidth':1.5, 'edgecolor':'white'}, 285 textprops={'fontsize':10, 'color':'black'} ) 286 287 #设置标题# 288 plt.title('中国三阶魔方盲拧前100成绩创造年份分布饼图') 289 290 #数据持久化# 291 plt.savefig('中国三阶盲拧速拧前100成绩创造年份分布饼图.jpg') 292 293 #显示可视化图像# 294 plt.show()
五、总结
1.经过对主题数据的分析与可视化,可以得到哪些结论?是否达到预期的目标?
结论:(1)近几年中国三阶速拧和盲拧的成绩逐年提升,说明选手的实力逐年增强;
(2)与速拧对比,盲拧的钱100排名成绩落差较大,创造成绩的时间也较为分散,中国的盲拧成绩还有待提高;
(3)总的来说,中国魔方事业发展呈现稳中向好的趋势。
达到了预期的目标。
2.在完成此设计过程中,得到哪些收获?以及要改进的建议?
收获:在设计过程中,了解到了很多关于Python爬虫的相关知识,也了解到了Python可视化功能的强大以及方便。但是也遇到了一些难点,暴露了自己对Python的不熟练。学习的不够认真,在爬虫与可视化的相关内容中遇到了一些难点,但是在多次尝试之后,也迎刃而解了。
建议:还需要继续努力,多学习,多尝试,多思考。