【问题标题】:How to read the next page on API using python iterator?如何使用 python 迭代器阅读 API 的下一页?
【发布时间】:2021-03-28 10:41:09
【问题描述】:

有一个 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']
    ))

我循环遍历字典,如果字典中有结果,我给page参数加+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"'}

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

【问题讨论】:

    标签: python api iterator


    【解决方案1】:
    while vacancies == True: # 
      params['page'] += 1
    

    无论其内容如何,​​都不会评估为文字 True。 Python dict's;甚至认为他们是Truthy 他们不是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)
    

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

    【讨论】:

    • 这段代码if len (vacancies)> 0:转到下一页,但不转到下一页,不保存所有页面的完整结果。它只给出我去的页面的结果,我需要收集所有页面的结果。
    • 奇怪此代码为 i in vacancys: params["page"] += 1 找到一百页。虽然结果只有五页。
    • 你可以看我的 colab colab.research.google.com/drive/… 吗?
    • 我已修改 Colab 以执行每页每项的计算并编辑我的答案以显示更新的代码
    • 对不起,我忘了打开编辑器模式,结果没有保存。如果不难,再编辑。
    【解决方案2】:

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

    while vacancies:
      # some code logic
    

    这样,Python 将自动转换为布尔列表。 如果你的列表是里面的东西 (len(your_list) > 0),bool(your_list) 评估为True,否则它是False

    另外,你可以这样写你的字典,而不是使用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
    }
    

    这更pythonic。

    【讨论】:

    • 你能显示你的api请求的响应吗?没看到这个逻辑不好,确实会死循环
    • 我正在向 google colab 提出请求。他没有给出答案,它只是在牢房里转来转去。您可以在链接colab.research.google.com/drive/… 中查看我的 colab
    猜你喜欢
    • 2017-12-30
    • 1970-01-01
    • 2021-12-30
    • 2017-08-16
    • 1970-01-01
    • 2020-08-08
    • 2020-11-26
    • 1970-01-01
    • 2017-06-21
    相关资源
    最近更新 更多