我在Python进度条和下载的答案中遇到了一些问题。
如果下载的数据是gzip编码的,则在
因此,进度条会变得越来越长,一旦超过单行长度,就会开始在终端上泛滥。
以下是该问题的工作示例(这个网站是我在谷歌上找到的第一个同时具有content-length和gzip编码的网站)。
如果下载的数据是gzip编码的,则在
for data in response.iter_content():
中连接它们后,内容长度和总长度不同,因为自动解压缩gzip编码响应。因此,进度条会变得越来越长,一旦超过单行长度,就会开始在终端上泛滥。
以下是该问题的工作示例(这个网站是我在谷歌上找到的第一个同时具有content-length和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,因为\r在Windows上不起作用,如果我没记错的话)
我正在使用requests.Session处理cookies(和gzip),所以我不想使用urllib和其他模块的解决方案
response.raw
来获取服务器的原始套接字响应,而不需要执行iter_content
所有的处理。 - Michael Foukarakis