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

如何用Python遍历基于游标分页的REST API

问题分析与修复方案

核心问题

  1. 游标参数传递错误:你将next游标放入请求头(headers)中,但这类分页API通常要求游标作为**URL查询参数(params)**传递。API未接收到游标参数,导致每次都返回第一页数据,游标始终为第一页对应的下一页值,最终引发无限循环且数据重复。
  2. 冗余的JSON序列化/反序列化:response.json()已直接返回Python字典,无需先用json.dumps转成字符串再用json.loads转回,完全是多余操作。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:22:43