puede - python para que sirve
¿Hay alguna manera fácil de solicitar una URL en python y NO seguir las redirecciones? (7)
Mirando la fuente de urllib2 parece que la forma más fácil de hacerlo sería subclase HTTPRedirectHandler y luego usar build_opener para reemplazar el HTTPRedirectHandler predeterminado, pero esto parece mucho trabajo (relativamente complicado) para hacer lo que parece que debería ser bastante simple.
Aquí está la forma de las Requests :
import requests
r = requests.get(''http://github.com'', allow_redirects=False)
print(r.status_code, r.headers[''Location''])
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())
Este es un controlador urllib2 que no seguirá los redireccionamientos:
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)
La palabra clave redirections
en el método de solicitud httplib2
es una httplib2
falsa. En lugar de devolver la primera solicitud, se generará una excepción RedirectLimit
si recibe un código de estado de redirección. Para devolver la respuesta inicial, debe establecer follow_redirects
en False
en el objeto Http
:
import httplib2
h = httplib2.Http()
h.follow_redirects = False
(response, body) = h.request("http://example.com")
Yo segundo el puntero de Olt para bucear en Python . Aquí hay una implementación que usa los manejadores de redirección urllib2, ¿más trabajo de lo que debería ser? Tal vez, encogerse 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)
supongo que esto ayudaría
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)
Dive Into Python tiene un buen capítulo sobre el manejo de 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