Hay una manera fácil de solicitar una URL en python y NO seguir las redirecciones?
Pregunta
Mirando la fuente de urllib2 parece que la manera más sencilla de hacerlo sería subclase HTTPRedirectHandler y, a continuación, utilizar build_opener para reemplazar el valor predeterminado HTTPRedirectHandler, pero esto parece como un montón de (relativamente complicado) de trabajo para hacer lo que parece que debería ser bastante simple.
Solución
Aquí está el Las solicitudes de manera:
import requests
r = requests.get('http://github.com', allow_redirects=False)
print(r.status_code, r.headers['Location'])
Otros consejos
Inmersión En Python tiene un buen capítulo sobre el manejo de las redirecciones con urllib2.Otra solución es 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
Este es un urllib2 controlador que no siga las redirecciones:
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)
supongo que esto sería de ayuda
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)
El redirections
palabra clave en el httplib2
método de petición es un arenque rojo.En lugar de volver a la primera solicitud que se va a recaudar un RedirectLimit
excepción si recibe una redirección de código de estado.Para volver a la inicial de la respuesta que usted necesita para establecer follow_redirects
a False
en el Http
objeto:
import httplib2
h = httplib2.Http()
h.follow_redirects = False
(response, body) = h.request("http://example.com")
En la segunda olt del puntero Inmersión en Python.He aquí una aplicación con urllib2 redirigir los controladores, más trabajo de lo que debería ser?Tal vez, encogiéndose de hombros.
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)
El camino más corto, sin embargo, es
class NoRedirect(urllib2.HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, hdrs, newurl):
pass
noredir_opener = urllib2.build_opener(NoRedirect())