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

Kre*_*air 8 python redirect urllib2 head

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

import urllib2
request = urllib2.Request('http://example.com')
request.get_method = lambda: 'HEAD'
urllib2.urlopen(request)
Run Code Online (Sandbox Code Playgroud)

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

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

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

jte*_*ace 13

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

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


MrG*_*mez 3

好问题!如果您决定使用urllib2,您将需要查看有关构建您自己的重定向处理程序的答案。

简而言之(阅读:公然从之前的答案中窃取):

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
Run Code Online (Sandbox Code Playgroud)

此外,正如勘误表中提到的,您可以使用 Python Requests