Python HTTP HEAD - 正确处理重定向?

时间:2012-04-01 19:37:26

标签: python redirect urllib2 head

我可以使用urllib2来生成HEAD请求,如下所示:

import urllib2
request = urllib2.Request('http://example.com')
request.get_method = lambda: 'HEAD'
urllib2.urlopen(request)

问题在于,当重定向后,它会使用GET而不是HEAD。

此HEAD请求的目的是检查我即将下载的URL的大小和内容类型,以便我可以确保不下载某些大文档。 (该URL由随机互联网用户通过IRC提供)。

如何在重定向后使用HEAD请求?

2 个答案:

答案 0 :(得分:13)

您可以使用requests库执行此操作:

>>> import requests
>>> r = requests.head('http://github.com', allow_redirects=True)
>>> r
<Response [200]>
>>> r.history
[<Response [301]>]
>>> r.url
u'https://github.com/'

答案 1 :(得分:3)

好问题!如果您已开始使用urllib2,则需要查看this answer有关构建您自己的重定向处理程序的信息。

简而言之(阅读:从前一个答案公然被盗):

import urllib2

#redirect_handler = urllib2.HTTPRedirectHandler()

class MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
    def http_error_302(self, req, fp, code, msg, headers):
        print "Cookie Manip Right Here"
        return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)

    http_error_301 = http_error_303 = http_error_307 = http_error_302

cookieprocessor = urllib2.HTTPCookieProcessor()

opener = urllib2.build_opener(MyHTTPRedirectHandler, cookieprocessor)
urllib2.install_opener(opener)

response =urllib2.urlopen("WHEREEVER")
print response.read()

print cookieprocessor.cookiejar

此外,如勘误表中所述,您可以使用Python Requests