2015-05-02 1 views
2

я нашел в блоге Грега Реда в о выскабливание HTML от nba.com:Как работать с данными с NBA.com?

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, поэтому я не мог понять, как получить список целых чисел из данные. Может кто-нибудь объяснить?

ответ

4

Очевидно, структура данных изменилась с тех пор, как Грег Реда написал этот пост. Прежде чем исследовать данные, я рекомендую сохранить их в файле с помощью травления. Таким образом, вам не нужно постоянно ударять по серверу 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'], чтобы извлечь все интересующие вас значения и вычислить агрегированную информацию, такую ​​как итоговые значения и средние значения.

+0

Когда я использую [0], то она возвращает TraceBack (самый последний вызов последнего): Файл "C: \ Python34 \ nba.py", строка 13, в выстрелов = response.json() [ 'результирующих' ] [0] ['rowSet'] KeyError: 0 –

+0

Я вижу, в чем проблема. Я обновил свой ответ с кучей новой информации. –

+0

Я написал ваш код с печатью (result_sets.keys()), и он вернулся: Traceback (последний последний вызов): Файл «C: \ Python34 \ nba.py», строка 16, в result_sets = pickle. load (open (имя_файла)) TypeError: 'str' не поддерживает интерфейс буфера –

Смежные вопросы