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

使用Python爬取Facebook数据生成空JSON文件,触发KeyError: 'paging'

解决Facebook爬虫的KeyError: 'paging'与空JSON问题

刚入门爬虫就碰到这种卡壳的情况太闹心了,我来帮你拆解下问题根源,一步步解决:

核心问题分析

控制台没报错但JSON为空,加上调试时触发KeyError: 'paging',本质是两个关联问题:要么你的请求根本没拿到有效数据,要么返回的数据结构和教程里的旧版本不一样,导致代码里硬取的paging字段不存在。

具体排查与解决步骤

1. 先确认API权限与访问合法性

Facebook的Graph API现在对数据访问限制极严,哪怕是公开内容:

  • 你跟着的教程大概率是比较旧的,当时可能不需要严格的访问令牌(access token),但现在几乎所有接口都要求有效令牌才能返回数据。
  • 如果没有令牌或者令牌权限不足,服务器可能返回空JSON,或者只返回少量无意义的字段,自然不会有paging。
  • 解决:检查你的请求是否携带了有效的access token,确认你要爬取的内容(比如公共页面帖子)是否允许通过API访问,必要时去Facebook开发者平台申请对应的权限。

2. 别硬取字典键,用安全的方式访问

教程里的代码可能直接写了response['paging'],但如果返回的JSON里没有这个字段(比如数据为空、结构更新),就会触发KeyError。

  • 解决:改用字典的get()方法,它允许你设置默认值,避免报错:
    # 代替直接response['paging']
    paging_info = response.get('paging', {})  # 不存在就返回空字典
    
  • 另外,先打印完整的响应内容,看看实际返回的结构是什么样的,这能帮你快速定位问题:
    import json
    print(json.dumps(response.json(), indent=2))  # 格式化打印响应数据
    

3. 检查请求参数是否正确

可能你漏传了关键参数,比如fields:Facebook API默认不会返回所有字段,如果你没指定要获取的内容,可能只返回一个空的结构或者仅ID字段。

  • 比如爬取页面帖子时,要明确指定字段:
    url = "https://graph.facebook.com/v18.0/[页面ID]/posts?fields=id,message,created_time&access_token=[你的令牌]"
    

4. 模拟浏览器请求,避开反爬

Facebook会检测非浏览器的请求,如果你的请求头太简单,可能被拦截,返回空数据:

  • 给请求加上模拟浏览器的User-Agent:
    import requests
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
    }
    response = requests.get(url, headers=headers)
    
  • 同时控制请求频率,每次请求后加个延时,避免被限流:
    import time
    time.sleep(2)  # 每次请求后暂停2秒
    

快速测试示例

给你一个安全处理响应的代码片段,你可以替换成自己的API URL和令牌:

import requests
import json
import time

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
}

# 替换成你的请求URL
api_url = "https://graph.facebook.com/v18.0/[页面ID]/posts?fields=id,message&access_token=[你的令牌]"
response = requests.get(api_url, headers=headers)
data = response.json()

# 先判断数据是否有效
if not data or 'data' not in data:
    print("警告:请求未返回有效数据,请检查权限、令牌或请求URL")
else:
    # 安全处理分页
    paging_data = data.get('paging', "无分页信息")
    print(f"分页状态:{paging_data}")
    
    # 保存数据到JSON
    with open('facebook_data.json', 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)
    print("数据已成功保存到facebook_data.json")

内容的提问来源于stack exchange,提问作者Lucas Maraal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:11:08