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

Python使用API After分页字段拉取全量数据遇无限循环问题

问题原因分析
  • 核心触发无限循环的原因是你仅通过返回的items长度判断是否继续分页:当接口无更多数据时,如果仍然重复返回最后一页的非空数据,会导致递归永远满足len(data) > 0的条件,持续调用自身。
  • 递归的分页方式本身存在缺陷:如果数据量超过Python默认的递归深度限制(一般是1000层),会直接触发栈溢出报错,不适合大数据量拉取场景。
  • 你没有用接口返回的total字段做终止校验,这个字段可以直接帮你确认是否已经拉取完全量数据,从逻辑上彻底避免无限循环。
修复后可运行的代码
import requests
import pandas as pd

api_token = "xxxxxxxxxxxxxxxxxx"
entries_per_page = 1000  # API limit
entries = []
payload={}
headers = {'x-api-key': api_token}
base_url = "https://api.atendesimples.com/customers/attendants/logs"

after = ""
total = None

while True:
    params = {
        "size": entries_per_page,
        "after": after
    }
    try:
        response = requests.get(base_url, headers=headers, params=params, timeout=30)
        response.raise_for_status() # 接口返回4xx/5xx错误时直接抛出异常
        all_data = response.json()
    except Exception as e:
        print(f"请求接口出错:{e}")
        break
    
    # 首次请求时获取总条目数
    if total is None:
        total = all_data.get("total", 0)
    
    data = all_data.get("items", [])
    entries.extend(data)
    # 满足两个终止条件任意一个就停止:已拉取到总条目数、返回条目为空
    if len(entries) >= total or len(data) == 0:
        break
    
    # 更新after参数拉取下一页
    after = all_data.get("after", "")

df = pd.DataFrame(entries)
print(f"共拉取到{len(df)}条数据")
关键修改说明
  • 把递归逻辑改为循环逻辑,彻底避免递归深度溢出问题
  • 新增total字段作为核心终止判断条件,只要已拉取条目数达到接口返回的总条目数就直接终止,从根上避免无限循环
  • 用requests自带的params参数传递查询参数,避免手动拼接URL字符串可能导致的编码错误
  • 新增了基础的异常捕获逻辑,避免接口超时、报错导致脚本直接崩溃
  • 用extend方法批量添加条目,替代循环append,代码更简洁运行效率也更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:24:01