Извлечение данных json с разбивкой по страницам из API с использованием Python

#python #json #api #pagination

Вопрос:

Проблема: у меня есть онлайн-CRM-система с ограниченной функциональностью отчетности. Существует доступный API restful, и я могу извлекать нужные мне данные из PowerBI. Проблема в том, что API разбивает данные на страницы либо за 100, либо за 200 секунд. В текущем состоянии мне нужно извлекать более 45 тысяч записей каждый раз, когда мне нужно обновить данные. В PowerBI это занимает более 30 минут. Я думал (возможно, неправильно), что сценарий Python может быть решением. Поскольку я не специалист по Python, я помог себе с поиском в Google и придумал приведенный ниже простой скрипт для извлечения всех записей.

 import json
import requests

base_url = "https:##############"
entity = "payment"
session = requests.Session()
session.headers.update({'Authorization' : 'Bearer TOKEN',
            'Content-Type' : 'application/json',
            'Beacon-Application': 'developer_api'})


def main_request(base_url, entity):
    r = session.get(base_url   entity)
    return r.json()

def get_pages(response):
    pages = round(response['total'] / 100)
    return pages  


data = main_request(base_url, entity)
results = main_request(base_url, entity)['results']

pages = get_pages(data)

#print(pages)
#print(results[0])



payments = []

for page_num in range(pages   1):
     full_url =base_url   entity   '?page='   f"{page_num 1}"
     data_ = session.get(full_url).json()

     payments.extend(data_['results'])



print(len(payments))

with open('payments.json', 'w') as f:
       json.dump(payments, f)
 

Проблема в том, что это все еще занимает относительно много времени, но также создает большой файл json ~300 МБ для 45 тыс. записей.
Может ли кто-нибудь указать мне правильное направление? Каковы наилучшие методы?

Комментарии:

1. The problem is that it still takes relatively long time but also creates a large json file — 1. Это займет много времени, потому что вам все равно нужно отправить много запросов. Для 45 тысяч записей со 100 записями на странице это 450 запросов. 2. Аналогично с данными. Чем больше записей, тем больший размер они будут занимать. Это в среднем

2. Спасибо. Так что, я полагаю, все обстоит именно так? Я предполагаю, что будет способ извлекать только измененные и новые записи из API, так как есть измененная/созданная метка времени или, возможно, какая-то справочная таблица для первого извлечения и только для изменения / обновления, но, боюсь, это выходит за рамки моих навыков 🙂