Python中如何实现分页REST API的查询终止逻辑
美国政府分页REST API对接解决方案
问题分析
- 对象不可序列化错误:直接将
requests.Response对象传入pd.normalize(),该对象无法被序列化处理,需先解析为JSON数据。 - 循环跳出逻辑失效:原代码中
break仅跳出最内层分页循环,但需确保后续正常执行外层y_list循环;同时无法动态判断分页终止时机,固定range(0,1000)既不灵活也可能浪费请求。
可行实现方案
利用API响应中的分页标识(多数政府API会返回next分页链接、has_more布尔值或total条目数)动态控制分页循环,同时修复JSON解析和循环逻辑:
代码示例
import requests import pandas as pd for x in x_list: for y in y_list: page = 0 has_more = True while has_more: # 构造带分页参数的URL(根据API文档调整参数名,比如page/offset等) url = f"目标API地址?x={x}&y={y}&page={page}" response = requests.get(url) # 处理非200状态码:终止当前分页,回到外层y循环 if response.status_code != 200: has_more = False break # 解析响应为JSON(修复序列化错误的核心步骤) try: response_json = response.json() except ValueError: # 响应非有效JSON,终止当前分页 has_more = False continue # 转换为DataFrame(注意正确函数名是pd.json_normalize) df = pd.json_normalize(response_json, record_path=['results']) # 处理当前页数据 do_stuff_to_converted_dataframe(df) # 根据API返回的分页标识判断是否继续请求 # 示例1:API返回next链接 has_more = 'next' in response_json and response_json['next'] is not None # 示例2:API返回has_more布尔值 # has_more = response_json.get('has_more', False) # 示例3:API返回总页数 # total_pages = response_json.get('total_pages', 1) # has_more = page < total_pages - 1 page += 1
关键修复点
- 序列化错误修复:新增
response.json()将响应解析为JSON对象,再传入pd.json_normalize()(原代码误用了pd.normalize,正确函数为pd.json_normalize)。 - 动态分页控制:用
while循环替代固定范围的for循环,通过API返回的分页标识动态判断是否继续请求,无需提前设定分页上限。 - 循环逻辑优化:遇到非200状态码或无效JSON时,设置
has_more=False跳出分页循环,自动回到外层y_list循环继续执行。
额外注意事项
- 查看目标API官方文档,确认分页参数(如
page/offset)和分页响应字段(如next/has_more),调整代码对应逻辑。 - 添加请求重试机制,避免临时网络波动导致请求失败。
- 遵守API请求频率限制,添加
time.sleep()控制请求间隔,防止被封禁。
内容的提问来源于stack exchange,提问作者jd_h2003
相关产品推荐
相关产品推荐

