#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, так как есть измененная/созданная метка времени или, возможно, какая-то справочная таблица для первого извлечения и только для изменения / обновления, но, боюсь, это выходит за рамки моих навыков 🙂