Pushshift API拉Reddit数据转DataFrame时偶发列不存在报错
报错根因
这个报错的触发原因和列名格式、接口返回结构的一致性完全无关:当你请求的时间窗口内没有匹配的提交数据时,Pushshift返回的data字段会为空列表。此时pd.DataFrame(空列表)会生成一个没有任何列的空DataFrame,后续尝试选取指定的7个字段时,就会抛出“目标列全部不存在于现有列中”的提示。
你可以在本地复现完全一致的报错:
import pandas as pd empty_df = pd.DataFrame([]) # 执行下面的代码行就会触发和你线上一模一样的报错 empty_df[['author', 'id', 'title', 'score', 'created_utc', 'permalink', 'num_comments']]
112个请求里94次成功、18次失败的原因,就是那18个时间窗口没有被Pushshift索引到的对应子版块帖子,返回了空数据。
修复实现
直接在逻辑里加上空数据判断、列缺失补全的兼容处理即可,修改后的代码如下:
import pandas as pd import requests # 预先定义需要保留的列,避免重复写列表 TARGET_COLS = ['author', 'id', 'title', 'score', 'created_utc', 'permalink', 'num_comments'] for i in reversed(range(2, 113)): after_ = i before_ = i - 1 link = f"https://api.pushshift.io/reddit/search/submission/?size=100&before={before_}d&after={after_}d&sort_type=num_comments&sort=desc&subreddit=wallstreetbets" path = f"/content/drive/MyDrive/UsersWSB/Posts/days_after_{after_}.csv" try: resp = requests.get(link, timeout=30) sample = resp.json() # 第一步:判断返回的data是否为空 if not sample.get('data'): print(f"after={after_}d 对应的时间区间无有效返回数据,跳过") continue df = pd.DataFrame(sample['data']) # 第二步:兼容单条数据缺列的场景,缺失的列用空值填充 for col in TARGET_COLS: if col not in df.columns: df[col] = pd.NA # 第三步:选取需要的列后保存 df = df[TARGET_COLS] df.to_csv(path) except Exception as e: print(f"after={after_}d 处理失败,错误:{e}")
可选优化建议
- 给请求增加1-2次重试逻辑,应对Pushshift接口偶发的服务端超时、限流问题
- 空数据的场景可以生成仅包含目标列的空CSV文件,保持所有输出文件的结构一致,方便后续统一拼接处理
内容的提问来源于stack exchange,提问作者yudhiesh
相关产品推荐
相关产品推荐

