我找到了 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/