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

