Как вызывать и циклировать API с разбивкой на страницы с помощью python

Я пытаюсь вызвать API-интерфейс Python, чтобы получить набор результатов, который составляет около 21 500 записей с ограничением PageSize или по умолчанию на 4000 записей. Я также не знаю общего количества страниц, и нет ссылок «next_url» или «last_page_url». Единственное данное - это общее количество результатов, которое равно 21205, и я могу разделить его на предел PageSize 4000, равный 5,30125 страниц.
Есть 2 возможных способа, как я думаю, просто я не уверен, как поместить это в код.

Сначала выполните цикл while, чтобы увидеть, установлен ли результат = PageSize of 4000, чем перебрать другую страницу.

Во-вторых, для каждого цикла, и если общее количество страниц равно 5,3, округлите его до 6, чтобы получить все записи и разбить их на страницы. =+1
Наконец, мне нужно добавить все записи в фрейм данных ta pandas, чтобы я мог экспортировать в sql таблица. Любая помощь приветствуется.


url = "https://api2.enquiresolutions.com/v3/?Id=XXXX&ListId=161585&PageSize=4000"

auth =  { 'Ocp-Apim-Subscription-Key': 'XXX', 'Content-Type': 'application/json'}

params = {'PageNumber': page}  

res = requests.get(url=url,  headers=auth, params=params).json()

df = pd.DataFrame(res['result'])
total_result= df['total'][0]
total_pages = int(total_result) /4000

properties = json_normalize(df['individuals'],record_path=['properties'],meta= 
['casenumber','individualid','type'])

properties['Data'] = properties.label.str.cat(properties.id,sep='_')

properties = properties.drop(['label','id'],axis=1)

pivotprop = properties.pivot(index='individualid', columns='Data', values='value')

data = pivotprop.reset_index()  

data.to_sql('crm_Properties',con=engine, if_exists='append'

person TB_new    schedule 18.12.2019    source источник


Ответы (1)


вы ищете что-то вроде этого? Вы просто выполняете цикл до тех пор, пока размер результата не станет меньше 4000, и объединяете данные в список.

url = "https://api2.enquiresolutions.com/v3/?Id=XXXX&ListId=161585&PageSize=4000"

auth =  { 'Ocp-Apim-Subscription-Key': 'XXX', 'Content-Type': 'application/json'}
page = 0
params = {'PageNumber': page}  

pages_remaining = True
full_res = []

while pages_remaining:
    res = requests.get(url=url,  headers=auth, params=params).json()
    full_res.append(res['result'])
    page += 4000
    params = {'PageNumber' : page}
    if not len(res['result']) == 4000:
        pages_remaining = False
person Maxime    schedule 18.12.2019
comment
Привет, Максим, не совсем потому, что набор результатов помещается в список. Мне нужно иметь возможность помещать результаты в кадр данных pandas. Это то, что я получаю, когда делаю df=pd.DataFrame(full_res) ....... результат 0 {'всего': '20238', 'отдельные': [{'casenumbe... - person TB_new; 19.12.2019
comment
Привет, Максим, не совсем потому, что набор результатов помещается в список. Мне нужно иметь возможность помещать результаты в кадр данных pandas. Это то, что я получаю, когда делаю df=pd.DataFrame(full_res) ....... результат 0 {'всего': '20238', 'отдельные': [{'casenumbe... - person TB_new; 19.12.2019
comment
Здравствуйте, @TB_new. Я просто дал вам общий метод, вы можете его адаптировать, насколько я знаю, pd.dataframe может принимать итерируемые объекты, поэтому он может принимать список в качестве параметра. - person Maxime; 19.12.2019