首页 > 解决方案 > 如何使用 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
)
response = requests.get(
    BASE_URL + '/vacancies',
    headers={'User-Agent': generate_user_agent()},
    params=params,
)
response

items = response.json()['items']
vacancies = []
for item in items:
    vacancies.append(dict(
        id=item['id'],
        name=item['name'],
        salary_from=item['salary']['from'] if item['salary'] else None,
        salary_to=item['salary']['to'] if item['salary'] else None,
        currency = item['salary']['currency'] if item['salary'] else None,
        created=item['published_at'],
        company=item['employer']['name'],
        area = item['area']['name'],
        url=item['alternate_url']
    ))

我遍历字典,如果字典中有结果,我将 +1 作为迭代器添加到页面参数:

while vacancies == True:
  params['page'] += 1

结果字典参数 ['page'] = 零剩余(API 中的页面从零开始)。

启动循环后调用 params 时,结果为:

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

也许我做的循环不正确,从逻辑开始,虽然字典中有结果,但必须执行循环。

标签: pythonapiiterator

解决方案


while vacancies == True: # 
  params['page'] += 1

True无论其内容如何,​​都不会评估为文字。蟒蛇dict的; 甚至认为他们是真实的他们不是True。你需要减少声明的严格性。

if vacancies: # is truthy if it's len > 0, falsey otherwise
    # Do something

或者您可以明确检查它是否有内容

if len(vacancies) > 0:
    # Do something

这解决了如何基于对象进行评估的问题,但并没有解决整体逻辑问题。

for _ in vacancies:
    params["page"] += 1
    # Does something for every item in vacancies

您在每个循环中所做的操作将取决于问题,并且需要另一个问题!

固定在下面

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

为每个页面制作空缺

results = []
for page in pages:
  vacancies = []
  for item in page:
      vacancies.append(dict(
          id=item['id'],
          name=item['name'],
          salary_from=item['salary']['from'] if item['salary'] else None,
          salary_to=item['salary']['to'] if item['salary'] else None,
          currency = item['salary']['currency'] if item['salary'] else None,
          created=item['published_at'],
          company=item['employer']['name'],
          area = item['area']['name'],
          url=item['alternate_url']
      ))
  results.append(vacancies)

结果将是所有项目的精细列表。


推荐阅读