如何将抓取的推文从批量JSON转为单个JSON对象存储?
解决推文独立JSON对象保存的两种方法
嘿,这个问题我之前做推特爬虫的时候也踩过坑,其实核心就是别把所有推文的参数混到一个字典里,而是把每条推文当成单独的字典,再根据需求选择保存方式:
方式一:每条推文单独存为一个JSON文件
如果需要每条推文都有独立的文件(比如后续要单独处理某条),可以循环遍历抓取到的推文列表,给每条生成一个单独的JSON文件:
import json # 这里替换成你实际抓取到的推文列表,每个元素是单条推文的字典 scraped_tweets = [ {"tweet_id": "123456", "text": "今天天气不错", "username": "user1"}, {"tweet_id": "789012", "text": "分享一个爬虫技巧", "username": "user2"} ] # 循环保存每条推文 for index, tweet in enumerate(scraped_tweets, start=1): # 可以用推文ID或者索引作为文件名,避免重复 file_name = f"tweet_{tweet['tweet_id']}.json" with open(file_name, "w", encoding="utf-8") as json_file: # dump单个推文字典到文件,确保编码和格式友好 json.dump(tweet, json_file, ensure_ascii=False, indent=4)
这样每个文件里都是一个完整的独立JSON对象,打开后直接就是单条推文的所有数据,不会出现参数合并的问题。
方式二:所有推文作为JSON数组存到一个文件(更常用)
如果想把所有推文统一管理,但每条依然是独立的JSON对象,可以把所有推文字典放到一个列表里,然后保存为JSON数组格式:
import json scraped_tweets = [ {"tweet_id": "123456", "text": "今天天气不错", "username": "user1"}, {"tweet_id": "789012", "text": "分享一个爬虫技巧", "username": "user2"} ] # 保存为包含多个独立JSON对象的数组 with open("all_scraped_tweets.json", "w", encoding="utf-8") as json_file: json.dump(scraped_tweets, json_file, ensure_ascii=False, indent=4)
保存后的文件内容是类似这样的格式:
[ { "tweet_id": "123456", "text": "今天天气不错", "username": "user1" }, { "tweet_id": "789012", "text": "分享一个爬虫技巧", "username": "user2" } ]
加载的时候直接用json.load()就能得到推文列表,遍历列表就能拿到每条独立的JSON对象,既方便管理又不会出现参数合并覆盖的问题。
关键注意点
- 别把所有推文的键值对合并到一个大字典里!比如如果直接
all_data.update(tweet),会导致重复键(比如每个推文都有tweet_id)被最后一条覆盖,这就是你现在出现“参数合并加载”的原因。 - 保存时用
ensure_ascii=False可以保留中文、表情等非ASCII字符,indent=4让JSON格式缩进,方便阅读和调试。
内容的提问来源于stack exchange,提问作者Vow
相关产品推荐
相关产品推荐

