使用HTTP标头下载之前获取文件大小与从urlopen检索到的标头不匹配

时间:2014-07-05 09:27:02

标签: python python-requests urllib

为什么在使用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

我打算检查文件大小(以字节为单位),根据Range中的urllib2将缓冲区拆分为多个线程但如果我没有文件的实际大小,则以字节为单位不会工作..

只有len(requests.get(url).content)提供最接近但仍然不正确的38274,而且它正在下载我不想要的内容。

1 个答案:

答案 0 :(得分:8)

默认情况下,请求会将'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'