为何调用DataFrame构造函数时出现ValueError错误?
问题分析与解决
错误原因
你直接用pd.DataFrame(json['message'])和pd.DataFrame(json['error'])会报错,是因为Reddit API返回的错误响应里:
json['message']是字符串类型json['error']是整数类型
而pandas的DataFrame构造函数需要接收可迭代结构(比如列表、字典数组等),直接传入单个字符串/数字不符合要求,所以触发ValueError。
另外,你当前的请求没有设置User-Agent头,Reddit的API会拒绝无标识的请求,这大概率是你拿到错误响应的根本原因。
修正代码
import requests import pandas as pd url= 'https://www.reddit.com/r/Wallstreetbets/top.json?limit=10&t=year' # 必须添加User-Agent标识,否则Reddit会拒绝请求 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'} r= requests.get(url, headers=headers) json_data = r.json() # 处理两种情况:请求失败/请求成功 if 'error' in json_data: # 将错误信息包装成可迭代的字典列表,再构造DataFrame error_df = pd.DataFrame([{'错误码': json_data['error'], '错误信息': json_data['message']}]) print(error_df) else: # 正常提取帖子数据:从data->children中取出每条帖子的详情 posts = [item['data'] for item in json_data['data']['children']] message_df = pd.DataFrame(posts) print(message_df.head())
关键说明
- User-Agent必须设置:可以用浏览器的标识(比如示例中的Chrome信息),否则Reddit会返回429或错误响应。
- 错误响应处理:把单个的错误码和信息包装成
[{'键': 值}]这种列表结构,让DataFrame能正确识别列和行。 - 正常数据提取:Reddit的帖子数据嵌套在
json_data['data']['children']里,每个子项的data字段才是单条帖子的完整信息,需要遍历提取后再构造DataFrame。
内容的提问来源于stack exchange,提问作者Orion
相关产品推荐
相关产品推荐

