Цикл итерации не работает должным образом для API

#python #api #iterator #iteration

#python #API #итератор #итерация

Вопрос:

Существует API, который выдает только сто результатов на страницу. Я пытаюсь создать цикл while, чтобы он просматривал все страницы и получал результаты со всех страниц, но он не работает должным образом.

Этот скрипт просматривает страницы:

 params = dict(
    order_by='salary_desc',
    text=keyword,
    area=area,
    period=30, # days
    per_page=100,
    page = 0,
    no_magic='false',  # disable magic
    search_field='name'  # available: name, description, company_name
)
pages = []
while True:
  params["page"]  = 1
  response = requests.get(BASE_URL   '/vacancies', headers={'User-Agent': generate_user_agent()}, params=params,)
  items = response.json()['items']
  if not items:
    break
  pages.append(items) # Do it for each page
response
 

При запуске:

 params
 
 {'area': 1,
 'no_magic': 'false',
 'order_by': 'salary_desc',
 'page': 5,
 'per_page': 100,
 'period': 30,
 'search_field': 'name',
 'text': '"python"'}
 

Он видит пять страниц.

Когда я смотрю на переменную после выполнения:

 len(pages)
4
 

Он видит только четыре страницы.

Если я правильно понял, он не видит нулевую страницу (страницы в api начинаются с нуля).

Пожалуйста, скажите мне, как вы можете исправить эту ошибку?

Завершите сценарий в colab по этой ссылке https://colab.research.google.com/drive/14KddVLTyH3LkcE-LmHm7EooTYMM7b0zB?usp=sharing

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

1. Код увеличивает страницу перед выборкой, поэтому вы никогда не выполняете выборку на странице 0.

2. Спасибо за ответ, но я не понимаю, как это исправить, чтобы страница начиналась с нуля.

3. Переместите приращение страницы в нижнюю часть цикла for вместо верхней.

4. Я думаю, вы ошибаетесь. Когда вызывается переменная params, она выводит правильное количество из пяти страниц. Но когда мы смотрим на переменную с готовыми страницами результатов, она выдает четыре страницы. Я думаю, что здесь есть логическая ошибка, но я не понимаю, почему он добавляет только четыре страницы из пяти.

5. страница начинается с нуля и увеличивается до 1 перед отправкой запроса, поэтому страница 0 никогда не извлекается. Я не знаю, как объяснить проблему проще, чем это.

Ответ №1:

Вы увеличиваете страницу до получения ответа. Просто измените порядок следующим образом.

 while True:
  response = requests.get(BASE_URL   '/vacancies', headers={'User-Agent': generate_user_agent()}, params=params,)
  items = response.json()['items']
  if not items:
    break
  pages.append(items) # Do it for each page
  params["page"]  = 1