2017-07-14 5 views
1

Ich versuche, JSON von dieser Website zu ziehen, aber es druckt die Daten nicht. Ich bin mir nicht sicher, ob es der Code ist, der versagt oder die Seite. Hier ist der Code:Ich kann JSON nicht aus Anfragen drucken

import requests 

season = '2016-17' 
player_id = 202322 
base_url = "http://stats.nba.com/stats/shotchartdetail?CFID=33&CFPARAMS=%s&ContextFilter=&ContextMeasure=FGA&DateFrom=&DateTo=&GameID=&GameSegment=&LastNGames=0&LeagueID=00&Location=&MeasureType=Base&Month=0&OpponentTeamID=0&Outcome=&PaceAdjust=N&PerMode=PerGame&Period=0&PlayerID=%s&PlusMinus=N&PlayerPosition=&Rank=N&RookieYear=&Season=%s&SeasonSegment=&SeasonType=Regular+Season&TeamID=0&VsConference=&VsDivision=&mode=Advanced&showDetails=0&showShots=1&showZones=0" 
shot_chart_url = base_url % (season, player_id, season) 

user_agent = 'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36' 
response = requests.get(shot_chart_url, headers={'User-Agent': user_agent}) 

headers = response.json()['resultSets'][0]['headers'] 

print(headers) 
+0

Ihr Skript erhängt, wenn ich es ausgeführt habe. – T4rk1n

+0

Ihre URL beim Einfügen mit Werten im Browser sagt 'Die VsDivision-Eigenschaft ist erforderlich.' – Bijoy

+0

@Bijoy: Wenn ich den Wert in' shot_chart_url' in meinen Browser (das ist nicht Safari) einfügen, erhalte ich eine JSON-Antwort wie erwartet. – martineau

Antwort

2

ich das Skript, indem einige Dinge laufen machen könnte:

season = '2016-17' 
player_id = 202322 
base_url = "http://stats.nba.com/stats/shotchartdetail?CFID=33&CFPARAMS=%s&ContextFilter=&ContextMeasure=FGA&DateFrom=&DateTo=&GameID=&GameSegment=&LastNGames=0&LeagueID=00&Location=&MeasureType=Base&Month=0&OpponentTeamID=0&Outcome=&PaceAdjust=N&PerMode=PerGame&Period=0&PlayerID=%s&PlusMinus=N&PlayerPosition=&Rank=N&RookieYear=&Season=%s&SeasonSegment=&SeasonType=Regular+Season&TeamID=0&VsConference=&VsDivision=&mode=Advanced&showDetails=0&showShots=1&showZones=0" 
shot_chart_url = base_url % (season, player_id, season) 
user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36' 

headers = { 
    'User-Agent': user_agent, 
    'x-nba-stats-origin': 'stats', 
    'x-nba-stats-token': 'true', 
    'Referer': 'http://stats.nba.com/events/', 
} 
response = requests.get(shot_chart_url, headers=headers) 
headers = response.json()['resultSets'][0]['headers'] 

print(headers) 

ich eine Seite in der nba Website verwaltet, die den gleichen api Endpunkt wie Sie verwenden, nach Überprüfung meiner Anfragen an den Server ich dies tat.

  • hinzugefügt, um eine Referer headers - es viele Server erforderlich (dies ist ASP.NET und aus meiner Erfahrung es sie wollen
  • Added 2 benutzerdefinierte Header von x-nba-stats
  • den Agenten Benutzer geändert

ich der User-Agent denke, das wichtigste ist, fühle ich mich wie sie ip + User Agents Kombinationen zu blockieren,

bearbeiten : Ich teile meine Art zu denken bei der Lösung dieser Ich sah auf den Kommentaren, dass dies tatsächlich auf den Browser funktioniert, in dem Wissen, wie HTTP funktioniert möglicherweise in Bezug auf: Cookies/Header/URL Params. Ich springe über die ursprüngliche Website und suche nach diesem Endpunkt, und tatsächlich funktionierte es für mich, ich prüfe die HTTP-Anfrage mit chroms DevTools und imitierte die Anfrage mit Anfragen :)

+0

Wie würde ein einfacher Sterblicher wissen oder herausfinden, was alleine gebraucht wurde? ** Das wäre meiner Meinung nach eine noch bessere Antwort. – martineau

+1

@martineau bearbeitet, Ich bin sterblich wie du bist, keine Magie, keine Tricks, ich mache Web-Crawling für meinen Lebensunterhalt, aber wirklich, es ist keine Hexenwerk. Ich hoffe meine Erklärung war klar :) –

+1

Freut mich zu hören, dass es nicht (; web) sockelwissenschaft '' '' '' '' '' '' '' '' '' '' '' '' ist. – martineau

Verwandte Themen