使用Python获取音频流遇HTTP响应无状态码,如何处理该异常?
解决Python获取HTTP/0.9音频流的BadStatusLine异常
问题根源
服务器返回的是HTTP/0.9协议响应——这种早期HTTP协议没有状态行和响应头,直接返回原始二进制音频数据。而Python的urllib会严格校验HTTP状态行,因此抛出http.client.BadStatusLine异常。
解决方案:用http.client底层连接跳过状态行校验
绕过高层的HTTP协议校验逻辑,手动建立连接并读取原始响应体:
import http.client # 替换为实际的服务器信息和请求路径 server = "<server>" port = 81 request_path = "/audiostream.cgi?user=<user>&pwd=<password>&streamid=0&filename=" # 建立HTTP连接 conn = http.client.HTTPConnection(server, port) conn.request("GET", request_path) # 获取响应,HTTP/0.9无状态行,直接读取内容 response = conn.getresponse() # 方式1:一次性读取全部数据(适合小音频文件) audio_data = response.read() # 保存到本地文件 with open("audio_stream.raw", "wb") as f: f.write(audio_data) # 方式2:流式读取(适合大音频流,边读边处理) # with open("audio_stream.raw", "wb") as f: # while True: # chunk = response.read(1024) # 每次读取1KB数据 # if not chunk: # break # f.write(chunk) # 关闭连接 conn.close()
补充说明
- curl通过
--http0.9参数允许接收HTTP/0.9响应,因此能正常获取数据; - Firefox内置了老旧HTTP协议的兼容性处理,可自动识别并直接读取二进制数据;
urllib无法直接跳过状态行校验,因此推荐使用底层的http.client实现。
内容的提问来源于stack exchange,提问作者alexeynl
相关产品推荐
相关产品推荐

