Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用请求不完全读取协议错误_Python_Python 2.7_Http_Python Requests - Fatal编程技术网

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天,它完全修复了协议错误,非常感谢您的回答!服务器在发送内容长度之前关闭了连接,您可以分享一个可复制的示例吗?我无法通过任何特定示例复制此错误,它的发生都是不规则的。@帕德雷克·坎宁安:但这是一个特定的领域吗?嗯,这是真的。我分析了日志,发现当我试图从同一个域获取图像时,所有这些都发生了@帕德雷坎宁厄姆