所以当我试图了解requests
模块时,我有点意外。
>>> furl = 'http://www.downvids.net/downloads/07275feaf477cc0f5a7a67cba965594d5c83/'
>>> resp = requests.get(furl, headers={'Accept-Encoding': 'identity'})
>>> resp.headers['content-length']
'7254371'
>>> resp2 = requests.head(furl)
>>> resp2.headers['content-length']
'20'
但是requests.get
我认为它正在将整个文件下载到缓冲区,从中获取内容长度!!!
那么,如果是url重定向的情况,那么获取正确内容长度的正确方法应该是什么呢?这似乎是因为我尝试resp2.status_code
给了我302
答案 0 :(得分:0)
执行HEAD
请求时,默认情况下requests
将allow_redirects
设置为False;这与默认情况下重定向跟随 on 的所有其他HTTP方法不同。请参阅Redirection and History文档:
默认情况下,Requests将为除HEAD之外的所有动词执行位置重定向。
您可以通过设置allow_redirects=True
:
resp2 = requests.head(furl, allow_redirects=True)
您的GET确实遵循了重定向(从原始网址到https://scontent-b-ams.xx.fbcdn.net/hvideo-xpa1/v/t42.1790-2/1598692_10153946120225652_1024334852_n.mp4?oh=de27dad30979955f4e8fef28b85f9af9&oe=53D50345
);您的HEAD
请求没有。
HEAD的服务器SHOULD return the same headers和GET一样,但RFC动词应该这也意味着如果实施成本过高或服务器成本过高,服务器可能会忽略该要求任何其他原因。
通过设置stream=True
,您始终可以发出不下载正文的GET请求:
resp = requests.get(furl, stream=True)