粗餅·中國魔方賽事網中國三階魔方速盲前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的不熟練。學習的不夠認真,在爬蟲與可視化的相關內容中遇到了一些難點,但是在多次嘗試之后,也迎刃而解了。
建議:還需要繼續努力,多學習,多嘗試,多思考。