2015-06-09 4 views
0

Я пытаюсь получить всю информацию о пользователях из GitHub API, используя библиотеку запросов Python. Вот мой код:Python append json to json file в цикле while

import requests 
import json 

url = 'https://api.github.com/users' 
token = "my_token" 
headers = {'Authorization': 'token %s' % token} 

r = requests.get(url, headers=headers) 
users = r.json() 
with open('users.json', 'w') as outfile: 
    json.dump(users, outfile) 

Я могу свернуть первую страницу пользователей в json-файл. Я также могу найти «следующий» URL страницы:

next_url = r.links['next'].get('url') 
r2 = requests.get(next_url, headers=headers) 
users2 = r2.json() 

Поскольку я не знаю, сколько страниц еще, как я могу добавить 2, 3 ... страницу в «users.json» последовательно в то время как можно быстрее?

Спасибо!

ответ

0

Во-первых, вам нужно открыть файл в «в» режиме, в противном случае подпоследовательности записи перезаписывает все,

import requests 
import json 

url = 'https://api.github.com/users' 
token = "my_token" 
headers = {'Authorization': 'token %s' % token} 

outfile = open('users.json', 'a') 

while True: 
    r = requests.get(url, headers=headers) 
    users = r.json() 
    json.dump(users, outfile) 
    url = r.links['next'].get('url') 
    # I don't know what Github return in case there is no more users, so you need to double check by yourself 
    if url == '': 
     break 

outfile.close() 
+0

Большое спасибо! Лимит скорости API GitHub составляет 5000 запросов/час. Следуйте за своим ответом, как я могу продолжить запись в файл в новом прогоне после того, как предыдущий запуск остановился на ограничение? –

+0

Вы должны добавить 'time.sleep (1)' после каждого запроса –

0

Добавить данные, полученные из запроса requests, в список и перейти к следующему запросу.

После того, как у вас есть все необходимые данные, перейдите к объединению данных в файл или в объект. Вы также можете использовать threading для параллельного выполнения нескольких запросов, но, скорее всего, будет ограничение скорости на api.

+0

Спасибо за ваш ответ. Я могу отметить только рабочий код. Ваша рекомендация абсолютно верна. –