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

Python分页API请求问题:无法获取多页数据生成DataFrame

解决API分页数据拉取及DataFrame生成问题

原代码存在的核心问题

  • 缺少循环逻辑:仅请求第一页,即使hasMore为True,也只是对page变量+1,未发起下一页请求,无法获取后续数据
  • 数据收集方式错误:用timelogs.extend(x)处理DataFrame,会导致列表存入的是DataFrame的列名而非数据行,完全偏离预期
  • 输出逻辑缺陷:仅在hasMore为False时打印timelogs,但首次请求hasMore为True时不会触发打印,且函数无返回值,无法获取最终结果
  • 冗余解析响应:多次调用json.loads(response.text),既冗余也可能引发潜在问题
  • 无错误处理:未处理请求失败、JSON结构异常等场景,难以排查问题

修正后的代码

import requests
import pandas as pd

url = "https://xxxxxxxx.xxxxxxxxx.com/projects/api/v3/tasklists"

def get_all_tasklists(url, pageSize=100):
    page = 1
    all_page_dfs = []  # 存储每个页面的DataFrame
    
    while True:
        try:
            # 发起请求并校验HTTP状态
            response = requests.get(
                f"{url}?page={page}&pageSize={pageSize}",
                headers={"authorization": "xxxxxxxxxxxx"}
            )
            response.raise_for_status()
            response_data = response.json()  # 一次性解析响应JSON
            
            # 提取当前页数据(需根据API实际结构调整'data'字段名)
            # 多数API会把实际业务数据嵌套在特定key下,而非直接返回顶层
            current_page_data = response_data.get('data', [])
            page_df = pd.json_normalize(current_page_data)
            all_page_dfs.append(page_df)
            
            # 检查分页标记
            meta_info = response_data.get('meta', {})
            has_more = meta_info.get('page', {}).get('hasMore', False)
            
            if not has_more:
                break
            page += 1
            
        except requests.exceptions.RequestException as e:
            print(f"请求异常: {e}")
            break
        except KeyError as e:
            print(f"JSON结构异常,缺失字段: {e}")
            break
    
    # 合并所有页面数据
    if all_page_dfs:
        final_df = pd.concat(all_page_dfs, ignore_index=True)
        print(final_df)
        return final_df
    else:
        print("未获取到任何数据")
        return pd.DataFrame()

# 调用函数
get_all_tasklists(url, pageSize=100)

关键修改说明

  1. 新增循环逻辑:用while True持续请求,直到hasMore为False,确保拉取全部分页数据
  2. 调整数据收集方式:用列表存储每个页面的DataFrame,最后通过pd.concat合并成完整数据集,避免数据结构混乱
  3. 修正数据提取逻辑:明确从API响应的指定字段(如data)提取业务数据,需根据实际返回结构调整字段名
  4. 优化响应解析:仅调用一次response.json(),避免重复解析
  5. 增加错误处理:捕获请求异常和JSON结构异常,便于快速定位问题
  6. 完善返回逻辑:返回最终合并后的DataFrame,同时保留控制台输出,方便验证结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:33:23