在Python中有没有简单的方法请求一个URL并且不跟随重定向?

153 投票
7 回答
122403 浏览
提问于 2025-04-11 09:18

从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'])

撰写回答