Python-爬取LOL战队战力值排行榜
一、选题背景
电子竞技是指使用电子游戏来比赛的体育项目,进行人与人之间智力与反应的对抗。通过电子竞技,可以锻炼和提高参与者的思维能力、反应能力、四肢协调能力和意志力,培养团队精神。随着游戏对经济、社会不断加强的影响,电子竞技被正式列入体育运动项目,并且成为一种职业。2020年12月16日,在亚奥理事会第39次全体代表大会上,电子竞技正式获准列入杭州亚运会竞赛项目。
二、主题式网络爬虫设计方案
1.网络爬虫名称:LOL战队战力值排行榜
2.网络爬虫爬取的内容与数据特征分析:
从LOL战队战力排行榜中所获取的数据,从排行前三十五的数据集中可以看出在前五名的战队之间的战力值差距比较大,而在第十名以后就普遍趋于一个比较平稳的状态,因此能够体现出排名在前面的战队的实力远超排在之后的战队,实力差距较为悬殊。
三、主题页面的结构特征分析
数据来源:https://wanplus.com/lol/ranking
所需页面代码:
对于所需要的数据进行右键,点击检查,来查找所需代码
四、网络爬虫程序设计
1、数据爬取
#-*- coding = utf-8 -*- from bs4 import BeautifulSoup #进行网页解析 import re #进行文字匹配 import urllib.request,urllib.error #制定URL,获取网页数据 import xlwt #进行excel操作 import sqlite3 #进行SQLite数据库操作 def main(): askURL("http://www.wanplus.com/lol/ranking") def getData(url): datalist = [] html = askURL(url) soup = BeautifulSoup(html,"html.parser") i=0 j=1 for item1 in soup.find_all('div',class_="teamname"): data = [] data.append(j) item1=str(item1) f1= re.compile(r'>(.*?)<') i1 = re.findall(f1, item1)[0] data.append(i1) item2=soup.find_all('div',class_="integral")[i] i=i+1 item2=str(item2) f2= re.compile(r'>(.*?)<') i2 = re.findall(f2, item2)[0] data.append(i2) j=j+1 if j==37: break datalist.append(data) return datalist def askURL(url): head = { "User-Agent": "Mozilla / 5.0 (ndows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome / 96.0.4664.110 Safari / 537.36" } request = urllib.request.Request(url, headers=head) html = "" try: response = urllib.request.urlopen(request) html = response.read().decode("utf-8") except urllib.error.URLError as e: if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason) return html main() url = "http://www.wanplus.com/lol/ranking" getData(url) print("爬取完毕!") url = ("http://www.wanplus.com/lol/ranking") html=askURL(url) datalist = getData(url) print(datalist) print("爬取完毕!") savepath = ".\\LOL战队战力排行榜.xls" book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象 sheet = book.add_sheet('LOL战队战力排行榜',cell_overwrite_ok=True) #创建工作表 col = ("排名","战队名","战力") for i in range(0,3): sheet.write(0,i,col[i]) #列名 for i in range(0,35): #测试 print("第%d条" %(i+1)) data = datalist[i] for j in range(0,3): sheet.write(i+1,j,data[j]) book.save(savepath) print('已输出表格!')
2、数据可视化
#柱形图 import matplotlib.pyplot as plt import pandas as pd import numpy as np lol_df=pd.read_excel(r'C:\Users\86198\LOL战队战力排行榜.xls') data=np.array(lol_df['战力'][0:35]) #索引 index=np.arange(1,36) #用来正常显示中文标签 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] #用来正常显示负号 plt.rcParams['axes.unicode_minus']=False #修改x轴字体大小为12 plt.xticks(fontsize=12) #修改y轴字体大小为12 plt.yticks(fontsize=12) print(data) print(index) #x标签 plt.xlabel('排名') #y标签 plt.ylabel('战力') #使中文不会乱码 plt.rcParams['font.sans-serif']=['SimHei'] s = pd.Series(data, index) s.plot(kind='bar',color='g') plt.grid() plt.show()
import numpy as np import pandas as pd import matplotlib.pyplot as plt a = np.random.randn(200) s = pd.Series(a) plt.hist(s) plt.show()
import pandas as pd import matplotlib .pyplot as plt #文字设为中文(解决文字乱码) from matplotlib import rcParams rcParams['font.family'] = 'simhei' people = pd.read_excel('LOL战队战力排行榜.xls') print(people) people.plot.bar(x='战队名',y='战力',color='red') plt.xticks(rotation=360) plt.show()
# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt #X轴,Y轴数据 plt.figure(figsize=(12,4)) #创建绘图对象 plt.plot(lol_df.排名, lol_df.战力,color='r') #plt.plot(x,y,label="EDGnb",color="red",linewidth=2) #在当前绘图对象绘图(X轴,Y轴,虚线,线宽度) plt.xlabel("战力") #X轴标签 plt.ylabel("战队名") #Y轴标签 plt.title("LOL战队战力排行榜") #图标题 plt.show() #显示图 plt.savefig("lol.jpg") #保存图
import matplotlib.pyplot as plt import matplotlib import numpy as np import scipy.optimize as opt kuake_df=pd.read_excel(r'C:\Users\86198\LOL战队战力排行榜.xls') x0=np.array(kuake_df['排名'][0:10]) y0=np.array(kuake_df['战力'][0:10]) def func(x,c0): a,b,c=c0 return a*x**2+b*x+c def errfc(c0,x,y): return y-func(x,c0) c0=[0,2,3] c1=opt.leastsq(errfc,c0,args=(x0,y0))[0] a,b,c=c1 print(f"拟合方程为:y={a}*x**2+{b}*x+{c}") chinese=matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc') plt.plot(x0,y0,"ob",label="样本数据") plt.plot(x0,func(x0,c1),"r",label="拟合曲线") plt.legend(loc=3,prop=chinese) plt.show()
经过观察以上视图,发现排名前几名的战力落差较大,排名中间及靠后的落差较小!
3、总代码
1 #-*- coding = utf-8 -*- 2 from bs4 import BeautifulSoup 3 #进行网页解析 4 5 import re 6 #进行文字匹配 7 8 import urllib.request,urllib.error 9 #制定URL,获取网页数据 10 11 import xlwt 12 #进行excel操作 13 14 import sqlite3 15 #进行SQLite数据库操作 16 17 def main(): 18 askURL("http://www.wanplus.com/lol/ranking") 19 20 def getData(url): 21 datalist = [] 22 html = askURL(url) 23 soup = BeautifulSoup(html,"html.parser") 24 i=0 25 j=1 26 for item1 in soup.find_all('div',class_="teamname"): 27 data = [] 28 data.append(j) 29 item1=str(item1) 30 f1= re.compile(r'>(.*?)<') 31 32 i1 = re.findall(f1, item1)[0] 33 data.append(i1) 34 item2=soup.find_all('div',class_="integral")[i] 35 i=i+1 36 item2=str(item2) 37 f2= re.compile(r'>(.*?)<') 38 39 i2 = re.findall(f2, item2)[0] 40 data.append(i2) 41 j=j+1 42 if j==37: 43 break 44 datalist.append(data) 45 return datalist 46 47 48 def askURL(url): 49 head = { 50 "User-Agent": "Mozilla / 5.0 (ndows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome / 96.0.4664.110 Safari / 537.36" 51 } 52 request = urllib.request.Request(url, headers=head) 53 html = "" 54 try: 55 response = urllib.request.urlopen(request) 56 html = response.read().decode("utf-8") 57 except urllib.error.URLError as e: 58 if hasattr(e, "code"): 59 print(e.code) 60 61 if hasattr(e, "reason"): 62 print(e.reason) 63 return html 64 65 66 main() 67 url = "http://www.wanplus.com/lol/ranking" 68 getData(url) 69 print("爬取完毕!") 70 71 72 url = ("http://www.wanplus.com/lol/ranking") 73 html=askURL(url) 74 datalist = getData(url) 75 76 print(datalist) 77 print("爬取完毕!") 78 79 80 savepath = ".\\LOL战队战力排行榜.xls" 81 book = xlwt.Workbook(encoding="utf-8",style_compression=0) 82 83 #创建workbook对象 84 sheet = book.add_sheet('LOL战队战力排行榜',cell_overwrite_ok=True) 85 86 #创建工作表 87 col = ("排名","战队名","战力") 88 89 for i in range(0,3): 90 sheet.write(0,i,col[i]) #列名 91 92 for i in range(0,35): 93 94 #测试 print("第%d条" %(i+1)) 95 96 data = datalist[i] 97 for j in range(0,3): 98 sheet.write(i+1,j,data[j]) 99 100 book.save(savepath) 101 102 print('已输出表格!') 103 #柱形图 104 import matplotlib.pyplot as plt 105 import pandas as pd 106 107 import numpy as np 108 109 lol_df=pd.read_excel(r'C:\Users\86198\LOL战队战力排行榜.xls') 110 data=np.array(lol_df['战力'][0:35]) 111 112 #索引 113 index=np.arange(1,36) 114 115 #用来正常显示中文标签 116 plt.rcParams['font.sans-serif']=['Arial Unicode MS'] 117 118 #用来正常显示负号 119 plt.rcParams['axes.unicode_minus']=False 120 121 #修改x轴字体大小为12 122 plt.xticks(fontsize=12) 123 124 #修改y轴字体大小为12 125 plt.yticks(fontsize=12) 126 127 print(data) 128 print(index) 129 130 #x标签 131 plt.xlabel('排名') 132 133 #y标签 134 plt.ylabel('战力') 135 #使中文不会乱码 136 plt.rcParams['font.sans-serif']=['SimHei'] 137 138 s = pd.Series(data, index) 139 s.plot(kind='bar',color='g') 140 141 plt.grid() 142 plt.show() 143 144 import numpy as np 145 import pandas as pd 146 147 import matplotlib.pyplot as plt 148 149 a = np.random.randn(200) 150 s = pd.Series(a) 151 plt.hist(s) 152 plt.show() 153 154 import pandas as pd 155 import matplotlib .pyplot as plt 156 157 #文字设为中文(解决文字乱码) 158 from matplotlib import rcParams 159 160 rcParams['font.family'] = 'simhei' 161 162 people = pd.read_excel('LOL战队战力排行榜.xls') 163 print(people) 164 165 people.plot.bar(x='战队名',y='战力',color='red') 166 plt.xticks(rotation=360) 167 plt.show() 168 # -*- coding: utf-8 -*- 169 170 import numpy as np 171 import matplotlib.pyplot as plt 172 173 #X轴,Y轴数据 174 175 176 plt.figure(figsize=(12,4)) 177 #创建绘图对象 178 plt.plot(lol_df.排名, lol_df.战力,color='r') 179 #plt.plot(x,y,label="EDGnb",color="red",linewidth=2) 180 #在当前绘图对象绘图(X轴,Y轴,虚线,线宽度) 181 182 plt.xlabel("战力") 183 184 #X轴标签 185 plt.ylabel("战队名") 186 187 #Y轴标签 188 plt.title("LOL战队战力排行榜") 189 #图标题 190 191 plt.show() 192 #显示图 193 plt.savefig("lol.jpg") 194 #保存图 195 196 import matplotlib.pyplot as plt 197 import matplotlib 198 import numpy as np 199 200 import scipy.optimize as opt 201 202 kuake_df=pd.read_excel(r'C:\Users\86198\LOL战队战力排行榜.xls') 203 x0=np.array(kuake_df['排名'][0:10]) 204 y0=np.array(kuake_df['战力'][0:10]) 205 def func(x,c0): 206 a,b,c=c0 207 return a*x**2+b*x+c 208 def errfc(c0,x,y): 209 return y-func(x,c0) 210 211 c0=[0,2,3] 212 c1=opt.leastsq(errfc,c0,args=(x0,y0))[0] 213 a,b,c=c1 214 print(f"拟合方程为:y={a}*x**2+{b}*x+{c}") 215 216 chinese=matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc') 217 plt.plot(x0,y0,"ob",label="样本数据") 218 plt.plot(x0,func(x0,c1),"r",label="拟合曲线") 219 plt.legend(loc=3,prop=chinese) 220 plt.show()
五、总结
1.经过对主题数据的分析与可视化,可以得到哪些结论?是否达到预期的目标?
排名靠前的队伍战力的差距落差特别大,而在中后段的战队的战力的落差较小。预期的目标是整个排名从高到低的落差相当较为平缓,但实际上排名靠前的战队的战力过高,造成落差较大。
2.在完成此设计过程中,得到哪些收获?以及要改进的建议?
通过这次的爬取,我对于自己的能力更加的了解,更加清楚那些是已经掌握的,哪一些是还不会的,通过各种资料的查阅,学习并做出最后的内容,我从中学到了很多有用的知识。
从刚开始着手爬虫程序设计到现在,虽然这次的程序设计并不复杂,但对于当前的我而言困难重重,设计的这个过程中几乎无时无刻都在遇到问题,我也明白了自己的不足并且会不断努力完善自己,如今对于数据可视化的设计也更加熟悉,但依然还有很多的不足,我也会更加认真努力的补足自己,争取早日掌握程序设计。