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

使用Facebook Graph API游标分页提取月度帖子失败问题

问题分析与解决方案

你的代码核心问题是没有累加所有分页的帖子数据,每次循环都会用新页面的数据覆盖posts_data,最终只保存了最后一页的内容。另外需要确认API请求的时间参数和分页逻辑,确保遍历完所有符合时间范围的帖子。

具体修正点

  • 初始化空列表存储所有帖子,避免数据覆盖
  • 每次分页请求后,将当前页的data字段追加到总列表
  • 处理API返回的分页游标,确保遍历完所有页面
  • 添加基础错误处理,避免请求失败导致脚本中断
  • 明确时间参数的时区,避免时间范围过滤异常

修改后的代码

import pyfacebook
import pandas as pd
import time

# 初始化API连接
graph = pyfacebook.GraphAPI(access_token='my-access-token', version='v20.0')
page_id = 'my-page-id'

# 时间范围(明确时区,避免UTC与本地时间偏差)
from_date = '2024-05-01T00:00:00+0800'
to_date = '2024-05-30T23:59:59+0800'

# 初始化总数据列表
all_posts = []

# 第一次请求(设置limit减少分页次数)
posts_url = f'/{page_id}/feed?fields=attachments,created_time&since={from_date}&until={to_date}&limit=100'
try:
    response = graph._request(posts_url).json()
    if 'data' in response:
        all_posts.extend(response['data'])
    
    # 分页遍历所有内容
    while 'paging' in response and 'next' in response['paging']:
        next_url = response['paging']['next']
        time.sleep(2)
        response = graph._request(next_url).json()
        if 'data' in response:
            all_posts.extend(response['data'])
except Exception as e:
    print(f"请求出错: {e}")

# 生成CSV文件
if all_posts:
    df = pd.DataFrame(all_posts)
    # 按发布时间排序,确保数据顺序正确
    df['created_time'] = pd.to_datetime(df['created_time'])
    df = df.sort_values('created_time')
    df.to_csv('facebook_data.csv', index=False)
    print(f"成功保存{len(all_posts)}条帖子")
else:
    print("未获取到任何帖子数据")

额外说明

  1. 时区匹配:Facebook API默认使用UTC时间,指定时区偏移(如+0800)可以避免时间范围过滤时出现偏差,确保覆盖目标日期的所有帖子。
  2. Limit参数:设置limit=100能减少分页请求次数(默认每页25条),提升数据获取效率。
  3. 错误捕获:try-except块可以捕获令牌过期、权限不足等API异常,避免脚本直接崩溃。
  4. 数据排序:最后按created_time排序,保证CSV文件中的帖子按时间顺序排列,方便后续分析。

内容的提问来源于stack exchange,提问作者Zulkifli Arshad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:27:13