如何在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
相关产品推荐
相关产品推荐

