python爬虫+数据分析之NBA球员LBJ13个赛季的数据分析

本文利用python爬虫从stat-nba.com获取NBA数据,对LBJ的13个赛季常规赛数据进行分析。分析内容包括得分分布统计和五项关键能力值的可视化展示,使用了flask框架和百度echart.js进行图表展示。
摘要由CSDN通过智能技术生成

python爬虫

最近在看数据分析的书籍,想着自己分析一点东西来,本人比较喜欢NBA,自然就先拿NBA作为分析的对象了,首先要获得最全的NBA数据,根据搜索的结果对比发现,stat-nba.com该网站的数据非常全面详细,真是业界良心。
数据源找到后第一件事情自然就是获取数据,这里用python的原生代码直接爬取的,个人觉的,beautifulSoup还是比较好的,只是一开始没有用,也就后来没用了,废话少叙,直接上代码。

#coding=utf-8
import urllib
import re
import csv
import sys

#计数,初始化
count = 0
#以下定义的与之对应的是球员姓名、赛季、胜负、比赛、首发、时间、投篮命中率、投篮命中数、投篮出手数、三分命中率、三分命中数、三分出手数、罚球命中率、罚球命中数、罚球次数、总篮板数、前场篮板数、后场篮板数、助攻数、抢断数、盖帽数、失误数、犯规数、得分
list0 = []
list1 = []
list2 = []
list3 = []
list4 = []
list5 = []
list6 = []
list7 = []
list8 = []
list9 = []
list10 = []
list11 = []
list12 = []
list13 = []
list14 = []
list15 = []
list16 = []
list17 = []
list18 = []
list19 = []
list20 = []
list21 = []
list22 = []
list23 = []
list24 = []
list25 = []
list26 = []
#定义获取页面函数
def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html
#获取数据并存入数据库中
for k in range(0,51):
    #获取当前页面,该页面只有LBJ的职业生涯常规赛的数据,截止到2016.12.26
    html = getHtml(
        "http://www.stat-nba.com/query.php?QueryType=game&GameType=season&Player_id=1862&crtcol=season&order=1&page=" + str(
            k))

    # 获取球员姓名、赛季、胜负、比赛、首发、时间、投篮命中率、投篮命中数、投篮出手数、三分命中率、三分命中数、三分出手数、罚球命中率、罚球命中数、罚球次数、总篮板数、前场篮板数、后场篮板数、助攻数、抢断数、盖帽数、失误数、犯规数、得分
    #正则得到相对应的数值
    playerdata = re.findall(r'<td  class ="normal player_name_out change_color col1 row.+"><a.*>(.*)</a></td>'
                            r'\s*<td  class ="current season change_color col2 row.+"><a.*>(.*)</a></td>'
                            r'\s*<td  class ="normal wl change_color col3 row.+">(.*)</td>'
                            r'\s*<td  class ="normal result_out change_color col4 row.+"><a.*>(\D*|76人)(\d+)-(\d+)(\D*)</a></td>'
                            r'\s*<td  class ="normal gs change_color col5 row.+">(.*)</td>'
                            r'\s*<td  class ="normal mp change_color col6 row.+">(.*)</td>'
                            r'\s*<td  class ="normal fgper change_color col7 row.+">(.*%|\s*)</td>'
                            r'\s*<td  class ="normal fg change_color col8 row.+">(.*)</td>'
                            r'\s*<td  class ="normal fga change_color col9 row.+">(.*)</td>'
                            r'\s*<td  class ="normal threepper change_color col10 row.+">(.*%|\s*)</td>'
                            r'\s*<td  class ="normal threep change_color col11 row.+">(.*)</td>'
                            r'\s*<td  class ="normal threepa change_color col12 row.+">(.*)</td>'
                            r'\s*<td  class ="normal ftper change_color col13 row.+">(.*%|\s*)</td>'
                            r'\s*<td  class ="normal ft change_color col14 row.+">(.*)</td>'
                            r'\s*<td  class ="normal fta change_color col15 row.+">(.*)</td>'
                            r'\s*<td  class ="normal trb change_color col16 row.+">(.*)</td>'
                            r'\s*<td  class ="normal orb change_color col17 row.+">(.*)</td>'
                            r'\s*<td  class ="normal drb change_color col18 row.+">(.*)</td>'
                            r'\s*<td  class ="normal ast change_color col19 row.+">(.*)</td>'
                            r'\s*<td  class ="normal stl change_color col20 row.+">(.*)</td>'
                            r'\s*<td  class ="normal blk change_color col21 row.+">(.*)</td>'
                            r'\s*<td  class ="normal tov change_color col22 row.+">(.*)</td>'
                            r'\s*<td  class ="normal pf change_color col23 row.+">(.*)</td>'
                            r'\s*<td  class ="normal pts change_color col24 row.+">(.*)</td>', html)
    #获取每条数据,
    for data in playerdata:

        #将元组数据复制给列表,进行修改,数据中有空值,和含有%号的值,进行处理,得到数值
        data1 = [data[0], data[1], data[2], data[3], int(data[4]), data[5], data[6], data[7], data[8], data[9],
                 data[10], data[11], data[12], data[13], data[14], data[15], data[16], data[17], data[18], data[19],
                 data[20], data[21], data[22], data[23], data[24], data[25], data[26]]
#将百分号去掉,只保留数值部分
        if (data1[15] == ' '):
            data1[15] = 0
        else:
            data1[15] = float("".join(re.findall(r'(.*)%', data1[15])))
        if (data1[9] == ' '):
            data1[9] = 0
        else:
            data1[9] = float("".join(re.findall(r'(.*)%', data1[9])))
        if (data1[12] == ' '):
            data1[12] = 0
        else:
            data1[12] = float("".join(re.findall(r'(.*)%', data1[12])))


        list0.append(data1[0])
        list1.append(data1[1])
        list2.append(data1[2])
        list3.append(data1[3])
        list4.append(data1[4])
        list5.append(data1[5])
        list6.append(data1[6])
        list7.append(data1[7])
        list8.append(data1[8])
        list9.append(data1[9])
        list10.append(data1[10])
        list11.append(data1[11])
        list12.append(data1[12])
        list13.append(data1[13])
        list14.append(data1[14])
        list15.append(data1[15])
        list16.append(data1[16])
        list17.append(data1[17])
        list18.append(data1[18])
        list19.append(data1[19])
        list20.append(data1[20])
        list21.append(data1[21])
        list22.append(data1[22])
        list23.append(data1[23])
        list24.append(data1[24])
        list25.append(data1[25])
        list26.append(data1[26])
        # 记录数据数量
        count += 1

#建立csv存储文件,wb写 a+追加模式
csvfile = file('nbadata.csv', 'ab+')
writer = csv.writer(csvfile)
#将提取的数据合并
data2 = []

for i in range(0,count):
    data2.append((list0[i],list1[i],list2[i],list3[i],list4[i],list5[i],list6[i],list7[i],list8[i]
                  ,list9[i],list10[i],list11[i],list12[i],list13[i],list14[i],list15[i],list16[i]
                  ,list17[i],list18[i],list19[i],list20[i],list21[i],list22[i],list23[i],list24[i]
                  , list25[i],list26[i]))

#将合并的数据存入csv
writer.writerows(data2)
csvfile.close()

经过爬取数据后得到了nbadata.csv文件,数据到手,下面就是分析了。

数据分析及可视化

这里只是简单的对LBJ职业生涯常规赛数据进行了分析,时间有限,就做了两个分析,一个是对常规赛的得分相同的次数进行统计。得出每个的分段的得分总次数;另一个是对过去13个赛季的五项能力(包括得分、篮板、助攻、盖帽、抢断)进行分析得出13个能力值图。
可视化部分应用的是flask框架搭建的web网站,前端用百度echart.js进行图像的搭建(强烈推荐echart,作图太666
直接上代码:
mydata.py

#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
from flask import Flask,render_template
from flask_bootstrap import Bootstrap
from pandas import DataFrame,Series
import pandas as pd
import numpy as np
import csv

#文件路径
srcFilePath = "c:/myflask/nbadata.csv"
#读取cvs格式的数据文件
reader = csv.reader(file(srcFilePath,'rb'))
#csv中各列属性代表的含义(1)代表第一列
# 球员姓名(1)、赛季(2)、胜负(3)、对手球队名称(4)、对手球队总得分(5)、己方球队总得分(6)
# 、己方球队名称(7)、首发(8)【1为首发,0为替补】、上场时间(9)、投篮命中率(10)、投篮命中数(11)
# 、投篮出手数(12)、三分命中率(13)、三分命中数(14)、三分出手数(15)、罚球命中率(16)
# 、罚球命中数(17)、罚球次数(18)、总篮板数(19)、前场篮板数(20)、后场篮板数(21)、助攻数(22)
# 、抢断数(23)、盖帽数(24)、失误数(25)、犯规数(26)、得分(27)

records = [line for line in reader]

frame = DataFrame(records)

#获取得分数对应的场次数目

pts_count = frame[26].value_counts()
a = []
b = []

for i in pts_count.keys():
    a.append(i)
for i in pts_count:
    b.append(i)
c = {}
for i in range(0,len(a)):
    c[int(a[i])] = int(b[i])

d = sorted(c.items(), key=lambda c:c[0])
#存储得分分数
e = []
#存储相应分数的次数
f = []
for i in d:
    e.append(i[0])
    f.append(i[1])

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值