• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

爬取NBA球员生涯数据,并在Excel中可视化显示

python 搞java代码 3年前 (2022-05-21) 31次浏览 已收录 0个评论

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

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

 

前言

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

 

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

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

项目主要涉及的Python模块:

  • requests
  • pandas
  • bs4

爬虫部分

爬虫部分整理思路如下

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

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

目标URL如下:

网址1:http://<a href="https://www.gaodaima.com/tag/nba" title="查看更多关于nba的文章" target="_blank">nba</a>.hupu.com/players/<span>
URL2(此处以湖人球队为例):https:</span>//nba.hupu.com/players/<span>lakers
URL3(此处以詹姆斯为例):https:</span>//nba.hupu.com/players/lebronjames-650.html

www#gaodaima.com来源gao@daima#com搞(%代@#码网搞代码

 

先引用模块

<span>from</span> bs4 <span>import</span><span> BeautifulSoup
</span><span>import</span><span> requests
</span><span>import</span><span> xlsxwriter
</span><span>import</span> os

 

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

 

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

<span>def</span><span> Teamlists(url):
    TeamName</span>=<span>[] 
    TeamURL</span>=<span>[] 
    GET</span>=<span>requests.get(URL1)
    soup</span>=BeautifulSoup(GET.content,<span>"</span><span>lxml</span><span>"</span><span>)
    lables</span>=soup.select(<span>"</span><span>html body div div div ul li span a</span><span>"</span><span>) 
    </span><span>for</span> lable <span>in</span><span> lables:
        ballname</span>=<span>lable.get_text()
        TeamName.append(ballname)
        </span><span>print</span><span>(ballname)
    teamname</span>=input(<span>"</span><span>请输入想查询的球队名:</span><span>"</span>)<span>#</span><span>此处可变为GUI界面中的按键值</span>
    c=<span>TeamName.index(teamname)
    </span><span>for</span> item <span>in</span><span> lables:
     HREF</span>=item.get(<span>"</span><span>href</span><span>"</span><span>)
     TeamURL.append(HREF)
    URL2</span>=<span>TeamURL[c] 
    </span><span>return</span> URL2

 

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

 

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

<span>#</span><span>自定义函数获取队员列表和对应的URL</span>
<span>def</span><span> playerlists(URL2):
    PlayerName</span>=<span>[] 
    PlayerURL</span>=<span>[] 
    GET2</span>=<span>requests.get(URL1)
    soup2</span>=BeautifulSoup(GET2.content,<span>"</span><span>lxml</span><span>"</span><span>)
    lables2</span>=soup2.select(<span>"</span><span>html body div div table tbody tr td b a</span><span>"</span><span>)
    </span><span>for</span> lable2 <span>in</span><span> lables2:
        playername</span>=<span>lable2.get_text()
        PlayerName.append(playername)
        </span><span>print</span><span>(playername)
    name</span>=input(<span>"</span><span>请输入球员名:</span><span>"</span>) <span>#</span><span>此处可变为GUI界面中的按键值</span>
    d=<span>PlayerName.index(name)
    </span><span>for</span> item2 <span>in</span><span> lables2:
     HREF2</span>=item2.get(<span>"</span><span>href</span><span>"</span><span>)
     PlayerURL.append(HREF2)
    URL3</span>=<span>PlayerURL[d]
    </span><span>return</span> URL3,name

 

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

 

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

<span>def</span><span> Competition(URL3):
    data</span>=<span>[]
    GET3</span>=<span>requests.get(URL3)
    soup3</span>=BeautifulSoup(GET3.content,<span>"</span><span>lxml</span><span>"</span><span>)
    lables3</span>=soup3.select(<span>"</span><span>html body div div div div div div div div p</span><span>"</span><span>)
    lables4</span>=soup3.select(<span>"</span><span>div div table tbody tr td</span><span>"</span><span>)
    </span><span>for</span> lable3 <span>in</span><span> lables3:
     introduction</span>=<span>lable3.get_text() 
     </span><span>print</span>(introduction)  <span>#</span><span>球员基本信息</span>
    <span>for</span> lable4 <span>in</span><span> lables4:
        competition</span>=<span>lable4.get_text()
        data.append(competition) 
    </span><span>for</span> i <span>in</span><span> range(len(data)):
        </span><span>if</span> data[i]==<span>"</span><span>职业生涯常规赛平均数据</span><span>"</span><span>:
            a</span>=data[i+31<span>]
            a</span>=<span>data.index(a)
    </span><span>del</span><span>(data[:a]) 
    </span><span>for</span> x <span>in</span><span> range(len(data)):
        </span><span>if</span> data[x]==<span>"</span><span>职业生涯季后赛平均数据</span><span>"</span><span>:
            b</span>=<span>data[x]
            b</span>=<span>data.index(b)
    </span><span>del</span><span>(data[b:])
    </span><span>return</span> data

 

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

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

可视化部分

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

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

<span>def</span> file_add(path):  <span>#</span><span>此时的内函数path可与GUI界面的Statictext绑定</span>
    creatpath=path+<span>"</span><span>Basketball</span><span>"</span> 
    <span>try</span><span>:
     </span><span>if</span> <span>not</span><span> os.path.isdir(creatpath):
      os.makedirs(creatpath)       
    </span><span>except</span><span>:
     </span><span>print</span>(<span>"</span><span>文件夹存在</span><span>"</span><span>)
    </span><span>return</span> creatpath

 

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

<span>def</span><span> player_chart(name,data,creatpath):
    </span><span>#</span><span>此为表格名称——球员名称+chart</span>
    EXCEL=xlsxwriter.Workbook(creatpath+<span>"</span><span></span><span>"</span>+name+<span>"</span><span>chart.xlsx</span><span>"</span><span>)
    worksheet</span>=<span>EXCEL.add_worksheet(name) 
    bold</span>=EXCEL.add_format({<span>"</span><span>bold</span><span>"</span>:1<span>}) 
    headings</span>=data[:18<span>]
    worksheet.write_row(</span><span>"</span><span>A1</span><span>"</span>,headings,bold) <span>#</span><span>写入表头</span>
    num=(len(data))//18<span>
    a</span>=<span>0
    </span><span>for</span> i <span>in</span><span> range(num):
        a</span>=a+18<span>
        c</span>=a+18<span>
        i</span>=i+1<span>
        worksheet.write_row(</span><span>"</span><span>A</span><span>"</span>+str(i+1),data[a:c]) <span>#</span><span>写入数据</span>
    chart_col = EXCEL.add_chart({<span>"</span><span>type</span><span>"</span>: <span>"</span><span>line</span><span>"</span>}) <span>#</span><span>创建一个折线图</span>
<span>    chart_col.add_series({
        </span><span>"</span><span>name</span><span>"</span>: <span>"</span><span>=</span><span>"</span>+name+<span>"</span><span>!$R$1</span><span>"</span>, <span>#</span><span>设置折线描述名称</span>
        <span>"</span><span>categories</span><span>"</span>:<span>"</span><span>=</span><span>"</span>+name+<span>"</span><span>!$A$2:$A$</span><span>"</span>+str(num), <span>#</span><span>设置图表类别标签范围</span>
        <span>"</span><span>values</span><span>"</span>: <span>"</span><span>=</span><span>"</span>+name+<span>"</span><span>!$R$2:$R$</span><span>"</span>+str(num-1),    <span>#</span><span>设置图表数据范围</span>
        <span>"</span><span>line</span><span>"</span>: {<span>"</span><span>color</span><span>"</span>: <span>"</span><span>red</span><span>"</span>}, })   <span>#</span><span>设置图表线条属性</span>
    <span>#</span><span>设置图标的标题和想x,y轴信息</span>
    chart_col.set_title({<span>"</span><span>name</span><span>"</span>: name+<span>"</span><span>生涯常规赛平均得分</span><span>"</span><span>}) 
    chart_col.set_x_axis({</span><span>"</span><span>name</span><span>"</span>: <span>"</span><span>年份 (年)</span><span>"</span><span>}) 
    chart_col.set_y_axis({</span><span>"</span><span>name</span><span>"</span>: <span>"</span><span>平均得分(分)</span><span>"</span><span>})
    chart_col.set_style(</span>1) <span>#</span><span>设置图表风格</span>
    worksheet.insert_chart(<span>"</span><span>A14</span><span>"</span>, chart_col, {<span>"</span><span>x_offset</span><span>"</span>:25, <span>"</span><span>y_offset</span><span>"</span>:3,}) <span>#</span><span>把图标插入工作台中并设置偏移</span>
    EXCEL.close()

 

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

 

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

 

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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:爬取NBA球员生涯数据,并在Excel中可视化显示

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址