Python 使用请求不完全读取协议错误
当我尝试使用Python 使用请求不完全读取协议错误,python,python-2.7,http,python-requests,Python,Python 2.7,Http,Python Requests,当我尝试使用请求下载一些图像时,我遇到了这个wierd错误,代码非常简短,如下所示 import requests import StringIO r = requests.get(image_url, stream=True) if r.status_code == 200: r.raw.decode_content = True data = StringIO.StringIO(r.raw.data) # other code to deal with data
请求下载一些图像时,我遇到了这个wierd错误,代码非常简短,如下所示
import requests
import StringIO
r = requests.get(image_url, stream=True)
if r.status_code == 200:
r.raw.decode_content = True
data = StringIO.StringIO(r.raw.data)
# other code to deal with data
然后我得到这个错误
ProtocolError: ('Connection broken: IncompleteRead(15060 bytes read, 55977 more expected)', IncompleteRead(15060 bytes read, 55977 more expected))
我在谷歌上搜索了类似的问题,并尝试使用HTTP/1.0协议强制请求,如下所示
import httplib
httplib.HTTPConnection._http_vsn = 10
httplib.HTTPConnection._http_vsn_str = 'HTTP/1.0'
但是,服务器只返回一个403
状态代码
顺便说一下,更令人困惑的是协议错误并非每次都会发生,但有时会发生
任何帮助都将不胜感激 由于您使用的是stream=True
,您应该迭代响应并将文件分块保存:
with open('pic1.jpg', 'wb') as handle:
response = requests.get(image_url, stream=True)
if response.ok:
for block in response.iter_content(1024):
if not block:
break
handle.write(block)
请注意,这将保存实际文件,但可以修改为使用StringIO
:
with StringIO() as handle:
response = requests.get(image_url, stream=True)
if response.ok:
for block in response.iter_content(1024):
if not block:
break
handle.write(str(block))
谢谢你的回答!其实我以前也这么想,但正如我上面提到的,让我更困惑的是,并不是所有的请求都出现了这个问题。如果我使用了错误的方法,为什么会有这种差异?@streethacker不确定,我想如果响应大小足够小,那么它可以一次读取,因此不会出现incompleread
。恐怕这不是关键,因为我再次分析日志文件,发现一个超过102KB(100666字节)的图像已成功下载,而我上面发布的错误消息显示问题图像只有71KB(71037字节,15060+55977)。无论如何,非常感谢您的回答,我会先试试。@DeepSpace我尝试了您的建议,并跟踪日志超过10天,它完全修复了协议错误,非常感谢您的回答!服务器在发送内容长度之前关闭了连接,您可以分享一个可复制的示例吗?我无法通过任何特定示例复制此错误,它的发生都是不规则的。@帕德雷克·坎宁安:但这是一个特定的领域吗?嗯,这是真的。我分析了日志,发现当我试图从同一个域获取图像时,所有这些都发生了@帕德雷坎宁厄姆