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.在完成此设计过程中,得到哪些收获?以及要改进的建议?

通过这次的爬取,我对于自己的能力更加的了解,更加清楚那些是已经掌握的,哪一些是还不会的,通过各种资料的查阅,学习并做出最后的内容,我从中学到了很多有用的知识。

从刚开始着手爬虫程序设计到现在,虽然这次的程序设计并不复杂,但对于当前的我而言困难重重,设计的这个过程中几乎无时无刻都在遇到问题,我也明白了自己的不足并且会不断努力完善自己,如今对于数据可视化的设计也更加熟悉,但依然还有很多的不足,我也会更加认真努力的补足自己,争取早日掌握程序设计。

posted @ 2021-12-31 02:02  王家垒  阅读(36)  评论(0编辑  收藏  举报