122

查看 urllib2 的源代码,看起来最简单的方法是将 HTTPRedirectHandler 子类化,然后使用 build_opener 覆盖默认的 HTTPRedirectHandler,但这似乎需要做很多(相对复杂的)工作来完成它应该做的事情很简单。

4

7 回答 7

233

这是请求方式:

import requests
r = requests.get('http://github.com', allow_redirects=False)
print(r.status_code, r.headers['Location'])
于 2013-02-03T22:42:27.047 回答
37

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
于 2008-09-21T08:33:12.700 回答
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)
于 2011-03-18T13:33:06.233 回答
9

请求方法中的redirections关键字是红鲱鱼。如果接收到重定向状态代码httplib2,它将引发异常,而不是返回第一个请求。RedirectLimit要返回您需要在对象上设置follow_redirects的初始响应:FalseHttp

import httplib2
h = httplib2.Http()
h.follow_redirects = False
(response, body) = h.request("http://example.com")
于 2012-05-14T16:45:38.060 回答
8

我想这会有所帮助

from httplib2 import Http
def get_html(uri,num_redirections=0): # put it as 0 for not to follow redirects
conn = Http()
return conn.request(uri,redirections=num_redirections)
于 2008-09-21T13:51:30.080 回答
5

我第二个 olt 的指针指向Dive into Python。这是一个使用 urllib2 重定向处理程序的实现,比它应该做的工作更多?也许,耸耸肩。

import sys
import urllib2

class RedirectHandler(urllib2.HTTPRedirectHandler):
    def http_error_301(self, req, fp, code, msg, headers):  
        result = urllib2.HTTPRedirectHandler.http_error_301( 
            self, req, fp, code, msg, headers)              
        result.status = code                                 
        raise Exception("Permanent Redirect: %s" % 301)

    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                                
        raise Exception("Temporary Redirect: %s" % 302)

def main(script_name, url):
   opener = urllib2.build_opener(RedirectHandler)
   urllib2.install_opener(opener)
   print urllib2.urlopen(url).read()

if __name__ == "__main__":
    main(*sys.argv) 
于 2008-09-21T11:31:20.713 回答
5

然而,最短的方法是

class NoRedirect(urllib2.HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, hdrs, newurl):
        pass

noredir_opener = urllib2.build_opener(NoRedirect())
于 2012-02-29T05:26:46.340 回答