python - ProtocolError IncompleteRead 使用请求

标签 python python-2.7 http python-requests

当我尝试使用 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/

相关文章:

python : vi mode when reading from stdin

python-2.7 - 如何为图像像素调用添加条件? numpy opencv

rest - flutter http post “type ' int'不是类型转换中 'String'类型的子类型”

python - 从除一列以外的所有列中删除逗号

python套接字,无效参数

Python XML 比较树

python-2.7 - 在pygame中只加载图像的一部分?

c# - C# 中的 HTTP 请求

http - 在最大缓存时间到期后检查 HTTP 资源是否发生更改

python - EmbeddedDocument 中的 MongoEngine ListField 在验证时抛出 TypeError