Python3进度条和gzip下载

2024-04-26 02:29:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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和其他模块的解决方案不是我想要的


Tags: 数据in编码fordataresponsesyscontent
2条回答

你可以替换。。。在

dl += len(byte)

…有:

dl = response.raw.tell()

documentation

tell(): Obtain the number of bytes pulled over the wire so far. May differ from the amount of content returned by :meth:HTTPResponse.read if bytes are encoded on the wire (e.g, compressed).

也许您应该尝试禁用gzip压缩,或者用其他方法来解释它。在

关闭请求的方法(按您所说的那样使用会话时):

import requests

s = requests.Session()
del s.headers['Accept-Encoding']

发送的头现在将是:Accept-Encoding: Identity,服务器不应尝试使用gzip压缩。如果您试图下载一个gzip编码的文件,那么您不应该遇到这个问题。您将收到Content-Type,共application/x-gzip-compressed。如果该网站是gzip压缩的,您将收到一个Content-Typetext/html和一个Content-Encoding的{}。在

如果服务器总是提供压缩的内容,那么您就倒霉了,但是没有服务器应该这样做。在


如果要使用请求的函数API执行某些操作:

^{pr2}$

通过函数API(甚至在对session.get的调用中)将头值设置为None,可以从请求中删除该头。在

相关问题 更多 >