美文网首页聊聊NBA
Python爬取NBA球员生涯数据及简单可视化

Python爬取NBA球员生涯数据及简单可视化

作者: 蜂蜜猎人 | 来源:发表于2020-03-26 22:50 被阅读0次

    由于全球疫情的原因

    NBA宣布无限期推迟比赛

    也被迫随之进入了长草期

    image

    紧接着

    狂摸话筒戈贝尔

    连坐队友米切尔

    网络小帅杜兰特

    绿军硬汉斯马特

    等十名球员相继官宣感染

    洛杉矶湖人两人感染

    但未公布名单

    社区论坛里便开始疯狂YY

    不能看球的日子

    就少了一种摸鱼的消遣

    但是

    虽然看不了比赛

    不能少了对🏀的热情

    作为一个老JRS

    小编决定用python

    拿虎扑上球星的数据开开刀

    (重点内容分割线)


    以虎扑网站上

    勒布朗詹姆斯的数据页面为例

    用requests+lxml解析

    import requests
    from lxml import etree
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    url='https://nba.hupu.com/players/lebronjames-650.html'
    data=requests.get(url).text
    s=etree.HTML(data)
    

    访问如下网址:

    'https://nba.hupu.com/players/lebronjames-650.html'

    Ctrl+Shift+C进入开发页面

    image

    选中所需的数据内容

    右键->Copy->Copy Xpath

    获取“赛季”和“球队”字段的Xpath

    //*[@id="in_box"]

    /div/div[1]/table[2]/tbody/tr[1]/td[1]

    //*[@id="in_box"]

    /div/div[1]/table[2]/tbody/tr[1]/td[2]

    仔细观察可以发现

    tr[1]/td[1]和tr[1]/td[2]

    是区分不同字段的关键

    用循环匹配的方式就可以定位字段

    再将数据逐一下载保存

    但是效果却并不好

    用TXT存储数据

    数据杂乱没有分行

    且每个字段数据都掺入了

    奇怪的符号“ ''' ”

    image

    对代码进行进一步优化

    将输出的字符串“掐头去尾”

    并用.csv文件存储

    d=[[]for j in range(20)]
    for j in range(20):
      for i in range (19):
        a=s.xpath('//*[@id="in_box"]/div/div[1]/table[2]/tbody/tr['+str(j)+']/td['+str(i)+']/text()')
        b=str(a)
        c=b[2:-2]
        d[j].append(c)
    ​
    data1 = pd.DataFrame(d)
    data1.to_csv('output.csv')
    

    效果一下子好了许多

    image

    用同样的方法进行爬取

    对库里、杜兰特、字母哥、

    哈登、伦纳德和詹姆斯

    六位球员生涯常规赛和季后赛

    数据进行了汇总

    image

    有了数据下一步就要进行分析工作了

    先对球员数据进行预处理

    1.将季后赛数据和常规赛数据合并
    2.选取需要分析的数据,包括时间、命中率、篮板、助攻、失误、得分(均为场均数据)
    3.对除了命中率外的各项数据进行归一化

    接下来就用到了matplotlib包

    我们需要用它来画雷达图和折线图

    plt.rcParams['font.sans-serif'] = ['KaiTi']  # 显示中文
    labels = np.array([u'时间', u'命中率', u'篮板',u'助攻',u'失误',u'得分']) # 标签
    dataLenth = 6  # 数据维度
    data_radar = np.array([james[0],james[1],james[2],james[3],james[4],james[5]]) # 数据
    angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False)  # 分割圆周长
    data_radar = np.concatenate((data_radar, [data_radar[0]]))  # 闭合
    angles = np.concatenate((angles, [angles[0]]))  # 闭合
    plt.polar(angles, data_radar, 'bo-', linewidth=1)  # 做极坐标系
    plt.thetagrids(angles * 180/np.pi, labels)  # 做标签
    plt.fill(angles, data_radar, facecolor='magenta', alpha=0.25)# 填充  c  maroon
    plt.title(u'james生涯场均数据')
    plt.show()
    ​
    

    雷达图便于显示该球员

    在六个维度的属性和能力

    image

    很明显,詹姆斯在六人的比较当中

    四项数据名列前茅

    由于扬尼斯的存在

    篮板稍微逊色一些

    同样将其他球员数据做成图片

    库里:

    image

    杜兰特:

    image

    字母哥:

    image

    哈登:

    image

    伦纳德:

    image

    以上数据均为场均数据

    接下来对总得分趋势进行分析

    plt.title('詹杜卡库哈扬生涯得分')
    plt.plot(x, curry, color='green', label='curry')
    plt.plot(x, durant, color='red', label='durant')
    plt.plot(x, giannis,  color='skyblue', label='giannis')
    plt.plot(x, harden,  color='blue', label='harden')
    plt.plot(x, kawhi,  color='yellow',label='kawhi')
    plt.plot(x, james,  color='magenta',label='james')
    plt.legend() # 显示图例
    plt.xlabel('赛季')
    plt.ylabel('得分')
    plt.show()
    

    将詹杜卡库哈扬生涯累计得分

    绘制折线图进行分析

    image

    横轴表示03赛季至19赛季

    纵轴表示球员生涯累计得分

    老詹一骑绝尘呐,哈哈

    对上图进行处理之后

    image

    可以看到

    詹姆斯的得分能力仍旧具有统治力

    三十岁之后数据有所下滑

    但是哈登和杜兰特得分能力紧追不舍

    作为老詹蜜

    今年是湖人和老詹最有希望的一年

    希望疫情赶快过去

    还卧虎一个总冠军

    image

    相关文章

      网友评论

        本文标题:Python爬取NBA球员生涯数据及简单可视化

        本文链接:https://www.haomeiwen.com/subject/fwohuhtx.html