Existe-t-il un moyen simple de demander une URL en python et de ne PAS suivre les redirections?
Question
Si vous examinez la source de urllib2, le moyen le plus simple consiste à sous-classer HTTPRedirectHandler, puis à utiliser build_opener pour remplacer le paramètre par défaut HTTPRedirectHandler. cela devrait être assez simple.
La solution
Voici la méthode Requêtes :
import requests
r = requests.get('http://github.com', allow_redirects=False)
print(r.status_code, r.headers['Location'])
Autres conseils
Plonger dans Python contient 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)
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)
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, il générera une exception RedirectLimit
s'il 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")
J'appuie le second pointeur sur Plongez dans Python . Voici une implémentation utilisant des gestionnaires de redirection urllib2, plus de travail qu'il ne devrait en être? Peut-être, haussement d'épaules.
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)
Cependant, le chemin le plus court est
class NoRedirect(urllib2.HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, hdrs, newurl):
pass
noredir_opener = urllib2.build_opener(NoRedirect())