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

如何实现从分页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链接,直到获取到目标数据量或没有下一页链接为止。核心步骤:

  1. 初始化存储总数据的DataFrame
  2. 从初始链接发起请求,解析JSON数据
  3. 将批次数据转为DataFrame并合并到总结果
  4. 检查是否存在下一页链接,且未达到目标数据量,满足则继续循环
  5. 循环结束后返回最终数据

完整代码示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:35:35