#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