如何在使用urllib2.urlopen时访问包含重定向的原始响应头?

2 投票
1 回答
1798 浏览
提问于 2025-04-16 11:33

我正在尝试解析通过使用urllib2.urlopen得到的HTTP响应中的位置头(location header),但是我收到的响应头只来自目标重定向,而不是包含位置头的原始响应。

我查阅了Stack Overflow上的其他问题,建议我去子类化urllib2.HTTPRedirectHandler,但我还是不太明白怎么才能访问urlopen最终跟随的原始响应。

这里有一个问题的例子:

import urllib2

req = urllib2.urlopen("http://wp.me")

print req.info()

打印的输出显示的是重定向请求目标的响应头。我想看到的是原始的响应头。

任何帮助都将不胜感激。

1 个回答

6

urllib2会自动处理重定向,也就是说,当你请求一个网址时,如果这个网址被转到另一个网址,它会帮你完成这个过程。不过,正如你所说的,你可以创建一个HTTPRedirectHandler的子类,然后用这个子类来获取你需要的值。

import urllib2

class SmartRedirectHandler(urllib2.HTTPRedirectHandler):
    def http_error_302(self, req, fp, code, msg, headers):
        result = urllib2.HTTPRedirectHandler.http_error_302(self, req, fp,
                                                                 code, msg,
                                                                 headers)
        result.status = code
        result.headers = headers
        return result

request = urllib2.Request("http://wp.me")
opener = urllib2.build_opener(SmartRedirectHandler())
obj = opener.open(request)
print 'The original headers where', obj.headers
print 'The Redirect Code was', obj.status

在SmartRedirectHandler中,你可以为你的请求设置更多的属性,这些属性会通过结果提供给你。

撰写回答