通过HTTP头获取下载前的文件大小与urlopen获取的不匹配

5 投票
1 回答
6888 浏览
提问于 2025-04-18 12:11

为什么使用 requestsurlopen(url).info() 时,内容的长度会不同呢?

>>> url = 'http://pymotw.com/2/urllib/index.html'

>>> requests.head(url).headers.get('content-length', None)
'8176'
>>> urllib.urlopen(url).info()['content-length']
'38227'
>>> len(requests.get(url).content)
38274

我本来想检查文件的字节大小,以便根据 Rangeurllib2 中将缓冲区分成多个线程,但如果我没有文件的实际字节大小,这个方法就行不通了。

只有 len(requests.get(url).content) 返回的值是 38274,这个数字是最接近的,但仍然不正确,而且它还在下载内容,这正是我不想要的。

1 个回答

15

默认情况下,发送请求时会包含一个叫做 'Accept-Encoding': 'gzip' 的请求头,这样服务器会返回压缩过的内容:

>>> r = requests.head('http://pymotw.com/2/urllib/index.html')
r>>> r.headers['content-encoding'], r.headers['content-length']
('gzip', '8201')

但是,如果你手动设置了请求头,那么你就会收到未压缩的内容:

>>> r = requests.head('http://pymotw.com/2/urllib/index.html',headers={'Accept-Encoding': 'identity'})
>>> r.headers['content-length']
'38227'

撰写回答