爬取NBA球员生涯数据,并在Excel中可视化显示[Python基础]

python

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

以下文章最早早起Python ,作者投稿君

 

前言

大家好,在之前我们讲过如何使用Python内置一个带有GUI的爬虫小程序,很多这里将迎合热点,延续上次的NBA​爬虫GUI,探讨如何爬取虎扑NBA官网数据。 并且将数据写入Excel中同时自动生成折线图,主要有以下几个步骤

 

本文将分为以下两个部分进行讲解

  • 在虎扑NBA官网球员页面中进行爬虫,获取球员数据。
  • 清洗整理爬取的球员数据,进行进行可视化。

项目主要涉及的Python模块:

  • requests
  • pandas
  • bs4

爬虫部分

爬虫部分整理思路如下

观察URL1的源代码找到球队名称与对应URL2观察URL2的源代码找到球员对应的URL3观察URL3源代码找到对应球员基本信息与比赛数据并进行筛选存储

其实爬虫就是在html上操作,而html的结构很简单就只有一个,就是一个大框套一个小框,小框在套小框,这样的一层层叠。

目标URL如下:

网址1:http://nba.hupu.com/players/

URL2(此处以湖人球队为例):https://nba.hupu.com/players/lakers

URL3(此处以詹姆斯为例):https://nba.hupu.com/players/lebronjames-650.html

先引用模块

from bs4 import BeautifulSoup

import requests

import xlsxwriter

import os

查看URL1源代码,可以看到球队名词及其对应的URL2在span标签中<span class><a href = “...">下,看上去找到它的父框与祖父框,下面的思路都是如此,图如下:

 

此时,可以通过requests模块与bs4模块进行有目的性的索引,得到球队的名称列表。

def Teamlists(url):

TeamName=[]

TeamURL=[]

GET=requests.get(URL1)

soup=BeautifulSoup(GET.content,"lxml")

lables=soup.select("html body div div div ul li span a")

for lable in lables:

ballname=lable.get_text()

TeamName.append(ballname)

print(ballname)

teamname=input("请输入想查询的球队名:")#此处可变为GUI界面中的按键值

c=TeamName.index(teamname)

for item in lables:

HREF=item.get("href")

TeamURL.append(HREF)

URL2=TeamURL[c]

return URL2

就此得到了对应球队的URL2,接着观察URL2网页的内容,可以看到球员名称在标签a中<a target = "_blank" href = ....>下,同时也放置着对应球员的URL3,如下图:

 

此时,故依然通过requests模块与bs4模块进行相对应的索引,得到球员名称列表以及对应的URL3。

#自定义函数获取队员列表和对应的URL

def playerlists(URL2):

PlayerName=[]

PlayerURL=[]

GET2=requests.get(URL1)

soup2=BeautifulSoup(GET2.content,"lxml")

lables2=soup2.select("html body div div table tbody tr td b a")

for lable2 in lables2:

playername=lable2.get_text()

PlayerName.append(playername)

print(playername)

name=input("请输入球员名:") #此处可变为GUI界面中的按键值

d=PlayerName.index(name)

for item2 in lables2:

HREF2=item2.get("href")

PlayerURL.append(HREF2)

URL3=PlayerURL[d]

return URL3,name

现在就此得到了对应球队的URL3,接着观察URL3页面的内容,可以看到球员基本信息在标签p下,球员常规赛生涯数据与季后赛生涯数据在标签td下,如下图:

 

同样,依然通过requests模块与bs4模块进行相对应的索引,得到球员基本信息与职业数据,而对于球员的常规赛与季候赛的职业数据将进行筛选与储存,得到数据列表。

def Competition(URL3):

data=[]

GET3=requests.get(URL3)

soup3=BeautifulSoup(GET3.content,"lxml")

lables3=soup3.select("html body div div div div div div div div p")

lables4=soup3.select("div div table tbody tr td")

for lable3 in lables3:

introduction=lable3.get_text()

print(introduction) #球员基本信息

for lable4 in lables4:

competition=lable4.get_text()

data.append(competition)

for i in range(len(data)):

if data[i]=="职业生涯常规赛平均数据":

a=data[i+31]

a=data.index(a)

del(data[:a])

for x in range(len(data)):

if data[x]=="职业生涯季后赛平均数据":

b=data[x]

b=data.index(b)

del(data[b:])

return data

通过上述网络爬虫得到了以下的数据,提供可视化数据的同时替换绑定之后的GUI界面按键事件:

  • 获取NBA中的所有球队的标准名称;
  • 通过指定的一只球队获取球队中所有球员的标准名称;
  • 通过指定的球员获取到对应的基本信息以及常规赛与季后赛数据;

可视化部分

思路:创建文件夹创建表格和折线图

自定义函数创建表格,运用os模块进行编写,返回已创建文件夹的路径,代码如下:

def file_add(path):  #此时的内函数path可与GUI界面的Statictext绑定

creatpath=path+"Basketball"

try:

ifnot os.path.isdir(creatpath):

os.makedirs(creatpath)

except:

print("文件夹存在")

return creatpath

运用xlsxwriter模块在creatpath路径下的自定义函数创建excel表格同时添加数据与构造折线图,代码如下:

def player_chart(name,data,creatpath):

#此为表格名称——球员名称+chart

EXCEL=xlsxwriter.Workbook(creatpath+""+name+"chart.xlsx")

worksheet=EXCEL.add_worksheet(name)

bold=EXCEL.add_format({"bold":1})

headings=data[:18]

worksheet.write_row("A1",headings,bold) #写入表头

num=(len(data))//18

a=0

for i in range(num):

a=a+18

c=a+18

i=i+1

worksheet.write_row("A"+str(i+1),data[a:c]) #写入数据

chart_col = EXCEL.add_chart({"type": "line"}) #创建一个折线图

chart_col.add_series({

"name": "="+name+"!$R$1", #设置折线描述名称

"categories":"="+name+"!$A$2:$A$"+str(num), #设置图表类别标签范围

"values": "="+name+"!$R$2:$R$"+str(num-1), #设置图表数据范围

"line": {"color": "red"}, }) #设置图表线条属性

#设置图标的标题和想x,y轴信息

chart_col.set_title({"name": name+"生涯常规赛平均得分"})

chart_col.set_x_axis({"name": "年份 (年)"})

chart_col.set_y_axis({"name": "平均得分(分)"})

chart_col.set_style(1) #设置图表风格

worksheet.insert_chart("A14", chart_col, {"x_offset":25, "y_offset":3,}) #把图标插入工作台中并设置偏移

EXCEL.close()

数据表格效果展现,以詹姆斯为例如下

 

并且然后打开自动生成的Excel,对应的折线图就直接展现出来,无需再次整理!

 

现在结合任务一的网络爬虫与任务二的数据可视化,可以得到实时的球员常规赛数据与季后赛数据汇总,同时还有实时球员生涯折线图。便可以与上次的GUI界面任务设计中的”可视化”按钮事件绑定,研究者的读者可以自己进一步研究!

以上是 爬取NBA球员生涯数据,并在Excel中可视化显示[Python基础] 的全部内容, 来源链接: utcz.com/z/530499.html

回到顶部