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)
关键修改说明
- 新增循环逻辑:用
while True持续请求,直到hasMore为False,确保拉取全部分页数据 - 调整数据收集方式:用列表存储每个页面的DataFrame,最后通过
pd.concat合并成完整数据集,避免数据结构混乱 - 修正数据提取逻辑:明确从API响应的指定字段(如
data)提取业务数据,需根据实际返回结构调整字段名 - 优化响应解析:仅调用一次
response.json(),避免重复解析 - 增加错误处理:捕获请求异常和JSON结构异常,便于快速定位问题
- 完善返回逻辑:返回最终合并后的DataFrame,同时保留控制台输出,方便验证结果
内容的提问来源于stack exchange,提问作者Michael Mesa
相关产品推荐
相关产品推荐

