通过HTTP头获取下载前的文件大小与urlopen获取的不匹配
为什么使用 requests
和 urlopen(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
我本来想检查文件的字节大小,以便根据 Range
在 urllib2
中将缓冲区分成多个线程,但如果我没有文件的实际字节大小,这个方法就行不通了。
只有 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'