使用tweepy流式获取的Twitter JSON文件无法用json.loads()解析怎么办
问题原因
- 核心报错原因是采集阶段的存储逻辑错误:tweepy的
Stream.on_data方法传入的data参数本身是bytes类型的原始JSON字节流,你直接print(data)后将控制台输出重定向到文件时,Python会输出bytes对象的字面量表示,自动在JSON内容外包裹b'前缀和'后缀,最终存储的不是纯JSON字符串,而是Python bytes对象的格式化输出内容。JSON解析器读取到首字符为b而非{,就会触发JSONDecodeError: Expecting value: line 1 column 1 (char 0)报错。 - 附带的采集代码bug:
self.t_count += 0的逻辑永远不会让计数增长,永远不会触发5000条的停止条件。
解决方案
方案1:修改采集代码(推荐,后续采集的文件可直接解析)
把on_data方法内的输出逻辑改为先解码bytes为UTF-8字符串再输出,同时修复计数bug,修改后的代码如下:
import sys from tweepy import Stream class MyListener(Stream): t_count = 0 def on_data(self, data): # 先解码bytes为UTF-8字符串再输出,避免生成b'前缀 print(data.decode('utf-8')) self.t_count += 1 # 修复计数逻辑,每采集1条计数加1 if self.t_count >= 5000: sys.exit("采集完成,正常退出") return True def on_error(self, status): print(status) if __name__ == '__main__': # 替换为自己的开发者密钥即可 consumer_key = "你的consumer_key" consumer_secret = "你的consumer_secret" access_token = "你的access_token" access_token_secret = "你的access_token_secret" stream = MyListener(consumer_key, consumer_secret, access_token, access_token_secret) stream.filter(track=['corona'], languages = ["en"])
后续新采集的文件直接使用你原来的读取代码即可正常解析。
方案2:修复现有已采集的旧文件
如果已经采集了大量数据不想重新采集,可以在读取阶段对每行内容做预处理,去掉外层的b'前缀和'后缀后再做JSON解析,代码如下:
import json with open("covid-test-out", "r", encoding="utf-8") as f: count = 0 for line in f: line = line.strip() # 跳过空行 if not line: continue # 移除外层的b'前缀和'后缀 json_str = line.lstrip("b'").rstrip("'") data = json.loads(json_str) # 后续数据处理逻辑 count += 1
内容的提问来源于stack exchange,提问作者Tianhe Wang
相关产品推荐
相关产品推荐

