En regardant la source d'urllib2, il semble que la meilleure façon de le faire serait de sous-classer HTTPRedirectHandler et d'utiliser build_opener pour remplacer HTTPRedirectHandler par défaut, mais cela semble être beaucoup de travail (relativement compliqué) pour faire ce qui semble être assez simple.
Réponses
Trop de publicités?Dive Into Python a un bon chapitre sur la gestion des redirections avec urllib2. Une autre solution est 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
Il s'agit d'un gestionnaire urllib2 qui ne suivra pas les redirections :
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)
Le mot clé redirections
dans la méthode de requête httplib2
est un hareng rouge. Plutôt que de renvoyer la première demande, elle lèvera une exception RedirectLimit
si elle reçoit un code d'état de redirection. Pour renvoyer la réponse initiale, vous devez définir follow_redirects
sur False
sur l'objet Http
:
import httplib2
h = httplib2.Http()
h.follow_redirects = False
(response, body) = h.request("http://example.com")