python - 如何使用 NBA.com 的数据?

标签 python html web-scraping text-processing string-parsing

我找到了 Greg Reda 关于从 nba.com 抓取 HTML 的博客文章:

http://www.gregreda.com/2015/02/15/web-scraping-finding-the-api/

我尝试使用他在那里编写的代码:

import requests
import json

url = 'http://stats.nba.com/stats/leaguedashteamshotlocations?Conference=&DateFr' + \
      'om=&DateTo=&DistanceRange=By+Zone&Division=&GameScope=&GameSegment=&LastN' + \
      'Games=0&LeagueID=00&Location=&MeasureType=Opponent&Month=0&OpponentTeamID' + \
      '=0&Outcome=&PORound=0&PaceAdjust=N&PerMode=PerGame&Period=0&PlayerExperien' + \
      'ce=&PlayerPosition=&PlusMinus=N&Rank=N&Season=2014-15&SeasonSegment=&Seas' + \
      'onType=Regular+Season&ShotClockRange=&StarterBench=&TeamID=0&VsConference=&VsDivision='

response = requests.get(url)
response.raise_for_status()
shots = response.json()['resultSets']['rowSet']

avg_percentage = shots['OPP_FG_PCT']

print(avg_percentage)

但它返回:

Traceback (most recent call last):
  File "C:\Python34\nba.py", line 91, in <module>
    avg_percentage = shots['OPP_FG_PCT']
TypeError: list indices must be integers, not str

我只懂基本的Python,所以我不知道如何从数据中获取整数列表。谁能解释一下吗?

最佳答案

显然,自从 Greg Reda 写那篇文章以来,数据结构已经发生了变化。在探索数据之前,我建议您通过 pickling 将其保存到文件中。这样,您就不必在每次修改并重新运行脚本时不断访问 NBA 服务器并等待下载。

以下脚本检查腌制数据是否存在,以避免不必要的下载:

import requests
import json

url = 'http://stats.nba.com/stats/leaguedashteamshotlocations?Conference=&DateFr' + \
      'om=&DateTo=&DistanceRange=By+Zone&Division=&GameScope=&GameSegment=&LastN' + \
      'Games=0&LeagueID=00&Location=&MeasureType=Opponent&Month=0&OpponentTeamID' + \
      '=0&Outcome=&PORound=0&PaceAdjust=N&PerMode=PerGame&Period=0&PlayerExperien' + \
      'ce=&PlayerPosition=&PlusMinus=N&Rank=N&Season=2014-15&SeasonSegment=&Seas' + \
      'onType=Regular+Season&ShotClockRange=&StarterBench=&TeamID=0&VsConference=&VsDivision='
print(url)

import sys, os, pickle
file_name = 'result_sets.pickled'

if os.path.isfile(file_name):
  result_sets = pickle.load(open(file_name, 'rb'))
else: 
  response = requests.get(url)
  response.raise_for_status()
  result_sets = response.json()['resultSets']
  pickle.dump(result_sets, open(file_name, 'wb'))

print(result_sets.keys())
print(result_sets['headers'][1])
print(result_sets['rowSet'][0])
print(len(result_sets['rowSet']))

一旦您掌握了result_sets,您就可以检查数据。如果你打印它,你会发现它是一本字典。您可以提取字典键:

print(result_sets.keys())

目前的键是'headers''rowSet''name'。您可以检查标题:

print(result_sets['headers'])

我对这些统计数据的了解可能比你少。然而,通过查看数据,我发现 result_sets['rowSet'] 包含 30 行,每行 23 个元素。这 23 列由 result_sets['headers'][1] 标识。试试这个:

print(result_sets['headers'][1])

这将显示 23 个列名称。现在看一下第一行团队数据:

print(result_sets['rowSet'][0])

现在您可以看到为亚特兰大老鹰队报告的 23 个值。您可以迭代 result_sets['rowSet'] 中的行来提取您感兴趣的任何值并计算汇总信息,例如总计和平均值。

关于python - 如何使用 NBA.com 的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30002888/

相关文章:

Python如何用字典中的值替换一个列表中的值?

python - 在 python 中并行读取多个大小为 10GB 的大型 csv 文件

html - 我怎样才能使用 flexbox 来实现内容环绕侧边栏的 float 侧边栏布局?

Python Mechanize 说现有控件不存在

python - 用 numpy 最小二乘法拟合线性表面

python类方法和继承

javascript - CSS 插入阴影不起作用,创建垂直线

html - 居中动态div

python - 无法从网页中获取一些分散的项目

javascript - 您可以自动将产品从在线商店添加到 WooCommerce 吗?