使用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
相关产品推荐
相关产品推荐

