149 votes

Existe-t-il un moyen facile de demander une URL en python et de NE PAS suivre les redirections ?

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.

273voto

Marian Points 488

Voici le mode Demandes :

import requests
r = requests.get('http://github.com', allow_redirects=False)
print(r.status_code, r.headers['Location'])

35voto

olt Points 899

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

12voto

Carles Barrobés Points 5283

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)

9voto

Ian Mackinnon Points 1993

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")

8voto

Ashish Points 275

je suppose que cela aiderait

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X