如何使用python迭代器阅读API的下一页?

如何使用python迭代器阅读API的下一页?,python,api,iterator,Python,Api,Iterator,有一个API每页只生成100个结果。我试图做一个while循环,这样它就可以遍历所有页面并从所有页面获取结果,但它不起作用。如果你能帮我解决这个问题,我将不胜感激 params = dict( order_by='salary_desc', text=keyword, area=area, period=30, # days per_page=100, page = 0, no_magic='false', # disable m

有一个API每页只生成100个结果。我试图做一个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']=0剩余(API中的页面从零开始)

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

{'area': 1,
'no_magic': 'false',
'order_by': 'salary_desc',
'page': 0,
'per_page': 100,
'period': 30,
'search_field': 'name',
'text': '"python"'}
也许我的循环做得不正确,从逻辑开始,虽然字典中有结果,但必须执行循环

while vacancies == True: # 
  params['page'] += 1
无论其内容如何,都不会计算为literal
True
。Python
dict
;即使它们是真的,它们也不是真的。你需要减少陈述的严格性

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)

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

空缺
永远不会
正确
。 如果要测试“空缺”的布尔值,可以使用
bool(空缺)
。 但是对于Python,您可以使用

while vacancies:
  # some code logic
这样,Python将自动转换为bool列表。 如果您的列表作为内部内容(
len(您的列表)>0
),则
bool(您的列表)
评估为
True
,否则为
False

此外,您可以通过以下方式编写dict,而不是使用
dict()

params = {
    '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
}

哪个更像python。

不起作用,进入了一个无休止的循环。您能显示api请求的响应吗?我没有看到这一条的逻辑不好,你确实会得到一个无休止的循环,我正在谷歌colab上提出请求。他没有回答,只是在牢房里旋转。如果len(空缺)>0:转到下一页,但不转到下一页,也不保存所有页的完整结果,则可以在链接处看到我的colab此代码。它只给出我所访问的页面的结果,我需要收集所有页面的结果。奇怪的是,我的代码是:params[“page”]+=1查找100页。虽然只有五页的结果。你可以看我的colab吗?我已经修改了以执行每页每项的计算,并编辑了我的答案以显示更新的代码抱歉,我忘记打开编辑器模式,结果未保存。如果不难,请重新编辑。