You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中使用while循环实现带lastKey分页的多轮API请求

如何实现分页获取API数据(支持lastKey续传)?

我需要调用一个单次最多返回200条结果的API。如果数据总量超过200条,API会返回lastKey参数,我需要把这个参数传入下一次请求;当所有数据返回完成后,API就不会再返回lastKey了。目前我已经写了首次请求并判断lastKey的代码,但不知道怎么用while循环完成完整的获取流程。

以下是我当前的首次请求代码:

url = 'https://example.com'
moreData = False
with requests.Session() as api:
    data = requests.get(url)
    try:
        data.raise_for_status()
    except HTTPError as e:
        return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    result = data.json()
    if 'lastKey' in result:
        url = 'https://example.com&lastKey=' + result['lastKey']
        moreData = True

完整的while循环实现方案

先提下你现有代码里的两个小细节问题:一是创建了requests.Session()实例api却没用到,直接用了requests.get,浪费了会话复用的优势;二是手动拼接URL容易出现编码问题,建议用params参数传递查询参数更稳妥。

下面是优化后的完整实现,逻辑清晰且简洁:

import requests
from requests.exceptions import HTTPError
# 假设你用的是Django的Response,若为其他框架请自行调整
from django.http import Response
from django.http import status

def fetch_all_api_data():
    base_url = 'https://example.com'
    all_results = []
    last_key = None

    # 用Session保持连接,提升批量请求的效率
    with requests.Session() as session:
        while True:
            # 构造请求参数:首次请求不带lastKey,后续请求自动带上
            request_params = {'lastKey': last_key} if last_key else {}
            try:
                response = session.get(base_url, params=request_params)
                response.raise_for_status()  # 主动捕获HTTP错误状态码
            except HTTPError as e:
                return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
            
            result = response.json()
            # 把当前页的数据合并到总列表(假设API返回的数据集在'results'字段,可根据实际调整)
            all_results.extend(result.get('results', []))
            
            # 更新lastKey,判断是否还有下一页数据
            last_key = result.get('lastKey')
            if not last_key:
                break  # 没有更多数据,退出循环
    
    # 所有数据获取完成,返回完整结果
    return Response(all_results, status=status.HTTP_200_OK)

关键逻辑说明

  • 会话复用:requests.Session()会自动复用TCP连接,减少重复握手的开销,适合批量分页请求场景。
  • 循环控制:用while True配合break灵活控制循环,只要API返回lastKey就继续请求,直到无lastKey时终止。
  • 参数传递:用params字典传递查询参数,避免手动拼接URL导致的特殊字符编码错误。
  • 异常处理:每次请求都通过raise_for_status()捕获HTTP错误,保证出错时能及时返回错误响应。
  • 数据聚合:用extend()方法将每一页的数据合并到总列表,最终返回完整的数据集。

如果你的API返回的结果字段不是results,只需要把result.get('results', [])替换成实际的字段名即可。

内容的提问来源于stack exchange,提问作者lr_optim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 22:23:11