在Python中有没有简单的方法请求一个URL并且不跟随重定向?
从urllib2的源代码来看,最简单的方法似乎是创建一个HTTPRedirectHandler的子类,然后用build_opener来替换掉默认的HTTPRedirectHandler。不过,这样做看起来要花不少(相对复杂的)功夫,而这件事情本身似乎应该很简单。
7 个回答
12
这是一个 urllib2 的处理器,它不会自动跟随重定向:
class NoRedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_302(self, req, fp, code, msg, headers):
infourl = urllib.addinfourl(fp, headers, req.get_full_url())
infourl.status = code
infourl.code = code
return infourl
http_error_300 = http_error_302
http_error_301 = http_error_302
http_error_303 = http_error_302
http_error_307 = http_error_302
opener = urllib2.build_opener(NoRedirectHandler())
urllib2.install_opener(opener)
36
Dive Into Python 这本书里有一章专门讲怎么用 urllib2 处理网页重定向。还有一个解决方案是 httplib。
>>> import httplib
>>> conn = httplib.HTTPConnection("www.bogosoft.com")
>>> conn.request("GET", "")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
301 Moved Permanently
>>> print r1.getheader('Location')
http://www.bogosoft.com/new/location
288
这里是使用Requests库的方法:
import requests
r = requests.get('http://github.com', allow_redirects=False)
print(r.status_code, r.headers['Location'])