我对Python progress bar and downloads上的答案有点问题
如果下载的数据是gzip编码的,那么将它们加入for data in response.iter_content():
后的内容长度和数据的总长度是不同的,因为它会自动解压缩gzip编码的响应
因此,酒吧变得越来越长,一旦它成为一个单一的线路,它开始淹没终端
这个问题的一个可行的例子(该网站是我在谷歌上找到的第一个同时获得内容长度和gzip编码的网站):
import requests,sys
def test(link):
print("starting")
response = requests.get(link, stream=True)
total_length = response.headers.get('content-length')
if total_length is None: # no content length header
data = response.content
else:
dl = 0
data = b""
total_length = int(total_length)
for byte in response.iter_content():
dl += len(byte)
data += (byte)
done = int(50 * dl / total_length)
sys.stdout.write("\r[%s%s]" % ('=' * done, ' ' * (50-done)))
sys.stdout.flush()
print("total data size: %s, content length: %s" % (len(data),total_length))
test("http://www.pontikis.net/")
ps,我在linux上,但它也会影响到其他操作系统(除了windows,因为它不能在iirc上工作)
我正在使用请求。会话对于cookies(和gzip)处理,所以使用urllib和其他模块的解决方案不是我想要的
你可以替换。。。在
dl += len(byte)
…有:
dl = response.raw.tell()
从documentation:
也许您应该尝试禁用gzip压缩,或者用其他方法来解释它。在
关闭请求的方法(按您所说的那样使用会话时):
发送的头现在将是:}。在
Accept-Encoding: Identity
,服务器不应尝试使用gzip压缩。如果您试图下载一个gzip编码的文件,那么您不应该遇到这个问题。您将收到Content-Type
,共application/x-gzip-compressed
。如果该网站是gzip压缩的,您将收到一个Content-Type
的text/html
和一个Content-Encoding
的{如果服务器总是提供压缩的内容,那么您就倒霉了,但是没有服务器应该这样做。在
如果要使用请求的函数API执行某些操作:
^{pr2}$通过函数API(甚至在对
session.get
的调用中)将头值设置为None
,可以从请求中删除该头。在相关问题 更多 >
编程相关推荐