Если все, что вам нужно, это остановить перенаправление, то есть простой способ сделать это. Например, я хочу получать только cookie-файлы и для лучшей производительности не хочу, чтобы меня перенаправляли на любую другую страницу. Также я надеюсь, что код сохраняется как 3xx. давайте использовать, например, 302.
class MyHTTPErrorProcessor(urllib2.HTTPErrorProcessor):
def http_response(self, request, response):
code, msg, hdrs = response.code, response.msg, response.info()
# only add this line to stop 302 redirection.
if code == 302: return response
if not (200 <= code < 300):
response = self.parent.error(
'http', request, response, code, msg, hdrs)
return response
https_response = http_response
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), MyHTTPErrorProcessor)
Таким образом, вам даже не нужно заходить в urllib2.HTTPRedirectHandler.http_error_302 ()
Еще более распространенным случаем является то, что мы просто хотим остановить перенаправление (при необходимости):
class NoRedirection(urllib2.HTTPErrorProcessor):
def http_response(self, request, response):
return response
https_response = http_response
И обычно используйте это так:
cj = cookielib.CookieJar()
opener = urllib2.build_opener(NoRedirection, urllib2.HTTPCookieProcessor(cj))
data = {}
response = opener.open('http://www.example.com', urllib.urlencode(data))
if response.code == 302:
redirection_target = response.headers['Location']