JSON проблемы для CSV - PullRequest
       8

JSON проблемы для CSV

0 голосов
/ 03 ноября 2019

Я пытаюсь получить статистику на странице статистики НБА. Я придерживаюсь идеи этого урока https://towardsdatascience.com/using-python-pandas-and-plotly-to-generate-nba-shot-charts-e28f873a99cb

Основная идея - поместить данные в файл csv.

Поэтому я пробую этот код, чтобы получить данные из сети nba,пытаясь получить файл json и преобразовать его в csv:

import requests
import json
import pandas as pd
from pandas import DataFrame as df
import urllib.request



shot_data_url_start="https://stats.nba.com/events/?flag=3&CFID=33&CFPARAMS=2017-18&PlayerID="
player_id="202695"
shot_data_url_end="&ContextMeasure=FGA&Season=2017-18&section=player&sct=plot"

def shoy_chart(player_id):
   full_url = shot_data_url_start + str(player_id) + shot_data_url_end
   json = requests.get(full_url, headers=headers).json()
return(json)



data = json['resultSets'][0]['rowSets']
columns = json['resultSets'][0]['headers']


df = pd.DataFrame.from_records(data, columns=columns)

И эта ошибка, которую показывает мне блокнот:

TypeError                                 Traceback (most recent call last)
<ipython-input-42-a3452c3a4fc8> in <module>
 18 
 19 
 ---> 20 data = json['resultSets'][0]['rowSets']
 21 columns = json['resultSets'][0]['headers']
 22 

 TypeError: 'module' object is not subscriptable

Любой может мне помочь или узнатьдругой способ получить данные в файл .csv или excel?

Ответы [ 4 ]

1 голос
/ 03 ноября 2019

При импорте с import json имя json относится к модулю JSON стандартной библиотеки Python. Вы не можете использовать его как обычное имя переменной. Если вы переименуете свою переменную во что-то другое, например response_json, эта часть вашего кода будет работать.

Что касается остального кода, страница https://stats.nba.com/events/ не возвращает никакого текста JSON. Это обычная веб-страница с изображениями, меню, видеоплеером и т. д. Если вы хотите получить доступ к API, который возвращает снимки в формате JSON, вам придется использовать https://stats.nba.com/stats/shotchartdetail (справильная строка запроса). Эта конечная точка API упоминается в руководстве, на вкладке «Chrome XHR и полученное изображение json, связанное с URL».

0 голосов
/ 03 ноября 2019

Попробуйте это

import pandas as pd
from pandas import DataFrame as df

shot_data_url_start = "https://stats.nba.com/stats/shotchartdetail?AheadBehind=&CFID=33&CFPARAMS=2017-18&ClutchTime=&Conference=&ContextFilter=&ContextMeasure=FGA&DateFrom=&DateTo=&Division=&EndPeriod=10&EndRange=28800&GROUP_ID=&GameEventID=&GameID=&GameSegment=&GroupID=&GroupMode=&GroupQuantity=5&LastNGames=0&LeagueID=00&Location=&Month=0&OnOff=&OpponentTeamID=0&Outcome=&PORound=0&Period=0&PlayerID="
player_id = "204001"
shot_data_url_end = "&PlayerID1=&PlayerID2=&PlayerID3=&PlayerID4=&PlayerID5=&PlayerPosition=&PointDiff=&Position=&RangeType=0&RookieYear=&Season=2017-18&SeasonSegment=&SeasonType=Regular+Season&ShotClockRange=&StartPeriod=1&StartRange=0&StarterBench=&TeamID=0&VsConference=&VsDivision=&VsPlayerID1=&VsPlayerID2=&VsPlayerID3=&VsPlayerID4=&VsPlayerID5=&VsTeamID="

def get_shot_data(player_id):
    full_url = shot_data_url_start + player_id + shot_data_url_end
    data = requests.get(
        full_url,
        headers = {
            "User-Agent": "PostmanRuntime/7.4.0"
        }
    )
    return data.json()

shot_results = get_shot_data(player_id)

result_sets = shot_results['resultSets']

first_result_set = result_sets[0]
row_set = first_result_set['rowSet']
set_headers = first_result_set['headers']

df = pd.DataFrame.from_records(row_set, columns=set_headers)

Я вижу, как вы запутались с этим средним постом. Вы пропустили headers, а URL для API NBA был неправильным. Вот что @pierre пытался сказать в своем ответе. URL, который вы используете, неверен. Если вы перечитаете этот пост, за которым следите, вы увидите, что автор сказал, что ему нужно покопаться в инструментах разработки, чтобы найти фактический URL-адрес, чтобы использовать его для получения JSON.

Редактировать: Забылиупомянуть, что когда я не передал User-Agent в headers, запрос был бы прерван. Если вы не передадите это, вы не получите успешный ответ.

0 голосов
/ 03 ноября 2019
import requests
import json
import pandas as pd
from pandas import DataFrame as df
import urllib.request



shot_data_url_start="https://stats.nba.com/stats/shotchartdetail?AheadBehind=&CFID=33&CFPARAMS=2019-20&ClutchTime=&Conference=&ContextFilter=&ContextMeasure=FGA&DateFrom=&DateTo=&Division=&EndPeriod=10&EndRange=28800&GROUP_ID=&GameEventID=&GameID=&GameSegment=&GroupID=&GroupMode=&GroupQuantity=5&LastNGames=0&LeagueID=00&Location=&Month=0&OnOff=&OpponentTeamID=0&Outcome=&PORound=0&Period=0&PlayerID="
player_id="202330"
shot_data_url_end="&PlayerID1=&PlayerID2=&PlayerID3=&PlayerID4=&PlayerID5=&PlayerPosition=&PointDiff=&Position=&RangeType=0&RookieYear=&Season=2019-20&SeasonSegment=&SeasonType=Regular+Season&ShotClockRange=&StartPeriod=1&StartRange=0&StarterBench=&TeamID=0&VsConference=&VsDivision=&VsPlayerID1=&VsPlayerID2=&VsPlayerID3=&VsPlayerID4=&VsPlayerID5=&VsTeamID="

def shot_chart(player_id):
    full_url = shot_data_url_start + str(player_id) + shot_data_url_end
    response_json = requests.get(full_url).json()
    return(response_json)



    data = response_json['resultSets'][0]['rowSets']
    columns = response_json['resultSets'][0]['headers']


    df = pd.DataFrame.from_records(data, columns=columns)

shot_chart("202330")

Что сейчас происходит? ноутбук заправлен правильно знать

0 голосов
/ 03 ноября 2019

Хорошо, я изменил код следующим образом:

import requests
import json
import pandas as pd
from pandas import DataFrame as df
import urllib.request


def shot_chart(player_id):
full_url = "https://stats.nba.com/stats/shotchartdetail?AheadBehind=&CFID=33&CFPARAMS=2017-18&ClutchTime=&Conference=&ContextFilter=&ContextMeasure=FGA&DateFrom=&DateTo=&Division=&EndPeriod=10&EndRange=28800&GROUP_ID=&GameEventID=&GameID=&GameSegment=&GroupID=&GroupMode=&GroupQuantity=5&LastNGames=0&LeagueID=00&Location=&Month=0&OnOff=&OpponentTeamID=0&Outcome=&PORound=0&Period=0&PlayerID=202695&PlayerID1=&PlayerID2=&PlayerID3=&PlayerID4=&PlayerID5=&PlayerPosition=&PointDiff=&Position=&RangeType=0&RookieYear=&Season=2017-18&SeasonSegment=&SeasonType=Regular+Season&ShotClockRange=&StartPeriod=1&StartRange=0&StarterBench=&TeamID=0&VsConference=&VsDivision=&VsPlayerID1=&VsPlayerID2=&VsPlayerID3=&VsPlayerID4=&VsPlayerID5=&VsTeamID="
    response_json = requests.get(full_url, headers=headers)
    return(response_json)



    data = response_json['resultSets'][0]['rowSets']
    columns = response_json['resultSets'][0]['headers']


    df = pd.DataFrame.from_records(data, columns=columns)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...