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

Python中如何实现分页REST API的查询终止逻辑

美国政府分页REST API对接解决方案

问题分析

  1. 对象不可序列化错误:直接将requests.Response对象传入pd.normalize(),该对象无法被序列化处理,需先解析为JSON数据。
  2. 循环跳出逻辑失效:原代码中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:24:33