使用Python Requests库调用Twitter Decahose API时遭遇JSONDecodeError(Extra data)的解决咨询
解决Twitter Decahose API响应的JSONDecodeError问题
你遇到的问题根源在于Twitter Decahose API返回的不是标准的单个JSON对象/数组,而是换行分隔的JSON(NDJSON)格式——简单说就是每行对应一条独立的Tweet数据。直接调用r.json()会尝试把整个响应当作一个完整的JSON解析,当解析完第一个JSON对象后还有后续内容时,就会触发JSONDecodeError: Extra data错误。另外你用r.text或r.content时控制台崩溃,大概率是因为Decahose的数据流极大,一次性加载全部内容到内存导致内存溢出。
下面是针对性的解决方案:
正确处理方式:流式读取+逐行解析
因为Decahose是流式API,我们应该利用requests的流式处理能力,逐行读取并解析数据,避免一次性加载所有内容撑爆内存:
import requests import json # 替换为你的实际API信息 url = "你的Decahose API地址" username = "你的认证用户名" password = "你的认证密码" # 开启流式请求,避免一次性下载全部数据 with requests.get(url, auth=(username, password), stream=True) as r: r.raise_for_status() # 先确保请求本身没有错误 # 逐行读取响应内容 for line in r.iter_lines(decode_unicode=True): if line: # 跳过流式响应中的空白行 try: tweet_data = json.loads(line) # 在这里处理单条Tweet数据,比如打印、存储到数据库等 print(tweet_data["id"]) except json.JSONDecodeError as e: print(f"解析单行JSON失败: {e}")
关键细节说明
stream=True:告诉requests不要一次性下载全部响应,而是逐步获取数据,从根源避免内存过载。iter_lines():完美匹配Decahose的NDJSON格式,逐行读取每条Tweet的JSON数据。- 空行过滤:流式响应中偶尔会出现空白行,直接解析会报错,所以需要先判断
line是否非空。 - 异常捕获:偶尔可能会出现格式异常的行,捕获
JSONDecodeError可以保证程序持续运行,不会因单条错误数据崩溃。
为什么之前的方法会失效?
r.json():要求整个响应是一个合法的单个JSON结构,但Decahose返回的是多个独立JSON对象,解析到第二个对象时就会提示"Extra data"。r.text/r.content:一次性加载所有响应内容,而Decahose的数据流量级极大,短时间内就会占用大量内存,导致控制台或程序崩溃。
内容的提问来源于stack exchange,提问作者yashjinwala
相关产品推荐
相关产品推荐

