2017-11-19 16 views
0

私は必要なコンテンツのコードを持っていますが、これまでURLで再生していたすべてのgameIdを実行したいと思います。私は2017020001を変更して、それを2017021272に、または1272周りのシーズンが終わるまで調べてみたいと思います。下のコードでどうすればいいですか?ゲームIDは、その後順番に番号が付けられている場合は、ネストのような単純なものでしょう複数のURLでWebを掻き集める

import csv 
import requests 
import os 

for x in range(2017020001, 2017021273): 
    req = requests.get('https://statsapi.web.nhl.com/api/v1/game/%s/feed/live?site=en_nhl' % x) 
    data = req.json() 

    my_data = [] 
    pk = data['gameData']['game']['pk'] 
    for item in data['liveData']['plays']['allPlays']: 
     players = item.get('players') 
     if players: 
      player_a = players[0]['player']['fullName'] if len(players) > 0 else None 
      player_b = players[1]['player']['fullName'] if len(players) > 1 else None 
     else: 
      player_a, player_b = None, None 
     event = item['result']['event'] 
     time = item['about']['periodTime'] 
     triCode = item.get('team', {}).get('triCode') 
     coordinates_x, coordinates_y = item['coordinates'].get('x'), item['coordinates'].get('y') 
     my_data.append([pk, player_a, player_b, event, time, triCode, coordinates_x, coordinates_y]) 

    headers = ["pk", "player_a", "player_b", "event", "time", "triCode", "coordinates_x", "coordinates_y"] 

    with open("NHL_2017020001.csv", "a", newline='') as f: 
     writer = csv.writer(f) 
     writer.writerow(headers) 
     writer.writerows(my_data) 
    f.close() 

答えて

1

あなたはforループ

はこのような何かが動作するはず使用してコードを反復処理する必要がありますすべてのゲームIDを繰り返し処理し、str.format()を使用してforループの下にあるすべてのコードは、数字に必要な詰め物を追加します。

import csv 
import requests 
import os 

for i in range(1, 1273): 
    url = 'https://statsapi.web.nhl.com/api/v1/game/201702{:04d}/feed/live?site=en_nhl'.format(i) 
    req = requests.get(url) 
    req.raise_for_status() 
    data = req.json() 
    my_data = [] 
    pk = data['gameData']['game']['pk'] 
    for item in data['liveData']['plays']['allPlays']: 
     players = item.get('players') 
     if players: 
      player_a = players[0]['player']['fullName'] if len(players) > 0 else None 
      player_b = players[1]['player']['fullName'] if len(players) > 1 else None 
     else: 
      player_a, player_b = None, None 
      event = item['result']['event'] 
      time = item['about']['periodTime'] 
      triCode = item.get('team', {}).get('triCode') 
     coordinates_x, coordinates_y = item['coordinates'].get('x'), item['coordinates'].get('y') 
     my_data.append([pk, player_a, player_b, event, time, triCode, coordinates_x, coordinates_y]) 

     headers = ["pk", "player_a", "player_b", "event", "time", "triCode", "coordinates_x", "coordinates_y"] 

    with open("NHL_201702{:04d}.csv".format(i), "a", newline='') as f: 
     writer = csv.writer(f) 
     writer.writerow(headers) 
     writer.writerows(my_data) 

最後に、with ... asを使用すると、ファイルを明示的に閉じる必要がなくなります。 str.format()の使用に関する追加情報が見つかりましたhere

+0

['range']の' 2017021272'の 'stop'値は' 2017021272 +1 'でなければなりません。(https://docs.python.org/ 2/library/functions.html#range)。結果のシーケンスに停止値が含まれないためです。 – aneroid

2

import csv 
import requests 
import os 

req = requests.get('https://statsapi.web.nhl.com/api/v1/game/2017020001/feed/live?site=en_nhl') 
data = req.json() 

my_data = [] 
pk = data['gameData']['game']['pk'] 
for item in data['liveData']['plays']['allPlays']: 
    players = item.get('players') 
    if players: 
     player_a = players[0]['player']['fullName'] if len(players) > 0 else None 
     player_b = players[1]['player']['fullName'] if len(players) > 1 else None 
    else: 
     player_a, player_b = None, None 
    event = item['result']['event'] 
    time = item['about']['periodTime'] 
    triCode = item.get('team', {}).get('triCode') 
    coordinates_x, coordinates_y = item['coordinates'].get('x'), item['coordinates'].get('y') 
    my_data.append([pk, player_a, player_b, event, time, triCode, coordinates_x, coordinates_y]) 

headers = ["pk", "player_a", "player_b", "event", "time", "triCode", "coordinates_x", "coordinates_y"] 

with open("NHL_2017020001.csv", "a", newline='') as f: 
    writer = csv.writer(f) 
    writer.writerow(headers) 
    writer.writerows(my_data) 
f.close() 
+0

'range 'の[' stop'は '1272 + 1'](https://docs.python.org/2/library/functions.html#range)でなければなりません。結果のシーケンス。 – aneroid

+1

はい、あなたは正しいです。私はそれを修正しました。ありがとう – julius383

+0

それは上記のコードで動作しません。あなたはそれを偶然に試しましたか? –

関連する問題