Hay una manera fácil de solicitar una URL en python y NO seguir las redirecciones?

StackOverflow https://stackoverflow.com/questions/110498

  •  02-07-2019
  •  | 
  •  

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.

¿Fue útil?

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())
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top