当我尝试使用 requests
下载一些图像时遇到了这个奇怪的错误,代码如下,
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 协议(protocol)强制请求,
import httplib
httplib.HTTPConnection._http_vsn = 10
httplib.HTTPConnection._http_vsn_str = 'HTTP/1.0'
然而,服务器只是返回一个403
状态码。
顺便说一句,更令人困惑的是 ProtocolError
并非每次都会发生,但有时会发生。
如有任何帮助,我们将不胜感激!
最佳答案
由于您使用的是 stream=True
,因此您应该遍历响应并将文件保存在 block 中:
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))
关于python - ProtocolError IncompleteRead 使用请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39116123/