如何实现从分页JSON链接自动批量获取数据并生成Pandas DataFrame
问题
需要开发Python脚本实现以下逻辑:
- 从JSON链接获取数据,再通过返回结果里的
['paging']['next']链接自动重复获取下一批数据,无需手动操作 - 每次JSON返回25条数据,目标是一次性获取1000条最新数据
现有模拟JSON结构:
{ 'data': [ {'created_time': 'time created', 'message': 'message', 'id': 'fake_id0'}, {'created_time': 'created time', 'message': 'id', 'id': 'fake_id1'}, {'created_time': 'time created', 'message': 'fake message', 'id': 'fake_id2'} ], 'paging': { 'cursors': {'before': 'before code ', 'after': 'after code'}, 'next': 'link to next JSON Script' } }
已实现将JSON数据转为Pandas DataFrame的函数:
import pandas as pd def JSON_dataframe(x): time, caption, user_and_post_id = [],[],[] for result in x['data']: time.append(result[u'created_time']) caption.append(result[u'message']) user_and_post_id.append(result[u'id']) df = pd.DataFrame([time, caption, user_and_post_id]).T df_1 = df.rename(columns={0: "Time", 1: "Caption", 2: "User_and_Post_ID"}) return(df_1)
解决方案
核心实现思路
通过循环自动请求next链接,直到获取到目标数据量或没有下一页链接为止。核心步骤:
- 初始化存储总数据的DataFrame
- 从初始链接发起请求,解析JSON数据
- 将批次数据转为DataFrame并合并到总结果
- 检查是否存在下一页链接,且未达到目标数据量,满足则继续循环
- 循环结束后返回最终数据
完整代码示例
import pandas as pd import requests def JSON_dataframe(x): time, caption, user_and_post_id = [],[],[] for result in x['data']: time.append(result['created_time']) caption.append(result['message']) user_and_post_id.append(result['id']) df = pd.DataFrame([time, caption, user_and_post_id]).T df_1 = df.rename(columns={0: "Time", 1: "Caption", 2: "User_and_Post_ID"}) return df_1 def fetch_all_data(initial_url, target_count=1000): total_df = pd.DataFrame() current_url = initial_url fetched_count = 0 while current_url and fetched_count < target_count: # 发起请求并处理异常 response = requests.get(current_url) response.raise_for_status() json_data = response.json() # 转换并合并批次数据 batch_df = JSON_dataframe(json_data) total_df = pd.concat([total_df, batch_df], ignore_index=True) # 更新已获取数据量 fetched_count += len(batch_df) # 安全获取下一页链接(避免KeyError) current_url = json_data.get('paging', {}).get('next') # 若数据超出目标,自动截断 if len(total_df) > target_count: total_df = total_df.head(target_count) return total_df # 使用示例 initial_link = "你的初始JSON链接" final_data = fetch_all_data(initial_link, 1000) print(final_data.shape) # 验证结果行数
关键细节说明
- 错误处理:
response.raise_for_status()会在请求失败时直接抛出异常,避免静默报错 - 边界防护:循环同时判断
next链接存在性和数据量,防止无限循环 - 兼容性:用
get()方法替代直接索引,避免因paging或next字段缺失导致崩溃 - 数据截断:最后一次请求可能超出目标量,自动截断到指定条数
优化建议
- 加请求延迟:如果目标网站有反爬,可加入
time.sleep(1)控制请求频率 - 日志记录:添加print或logging代码,实时打印当前获取进度
- 断点续传:每次获取批次数据后写入本地文件,避免中断前功尽弃
内容的提问来源于stack exchange,提问作者Ursa Major
相关产品推荐
相关产品推荐

