如何用Python遍历基于游标分页的REST API
问题分析与修复方案
核心问题
- 游标参数传递错误:你将
next游标放入请求头(headers)中,但这类分页API通常要求游标作为**URL查询参数(params)**传递。API未接收到游标参数,导致每次都返回第一页数据,游标始终为第一页对应的下一页值,最终引发无限循环且数据重复。 - 冗余的JSON序列化/反序列化:
response.json()已直接返回Python字典,无需先用json.dumps转成字符串再用json.loads转回,完全是多余操作。 - DataFrame追加效率低下:
final_df.append(df)每次都会创建新的DataFrame,处理大量数据时会拖慢运行速度。
修复后的代码
import requests import pandas as pd endpoint = "你的API地址" api_key = "Basic redacted" # 身份认证信息放在请求头 headers = {'Authorization': api_key} # 用列表存储每页的DataFrame,最后一次性合并 page_dfs = [] cursor = None # 初始游标设为None,适配API初始请求逻辑 while True: # 仅当游标存在时,才添加到查询参数中 query_params = {'next': cursor} if cursor is not None else {} # 发送请求,身份认证走headers,游标走查询参数 response = requests.get(endpoint, headers=headers, params=query_params) # 检查请求是否成功,失败则抛出异常 response.raise_for_status() json_data = response.json() # 解析当前页数据并加入列表 page_df = pd.json_normalize(json_data['results']) page_dfs.append(page_df) # 更新游标,判断是否终止循环 cursor = json_data.get('next') if cursor is None: break # 合并所有页数据,重置索引 final_df = pd.concat(page_dfs, ignore_index=True) print(f"最终数据总条数:{len(final_df)}")
关键修复说明
- 参数位置修正:严格区分请求头(存身份认证)和查询参数(存分页游标),符合REST API的常规设计规范。
- 移除冗余操作:直接使用
response.json()返回的字典处理数据,减少不必要的性能损耗。 - 优化数据合并:用列表暂存每页DataFrame,最后通过
pd.concat一次性合并,大幅提升处理大量数据时的效率。 - 完善循环逻辑:初始游标设为None,通过
cursor is None判断终止循环,避免初始空字符串导致的逻辑误差。 - 增加错误检查:
response.raise_for_status()会在请求失败时抛出异常,便于快速排查认证失败、服务器错误等问题。
内容的提问来源于stack exchange,提问作者kidchae
相关产品推荐
相关产品推荐

