La biblioteca de solicitudes de Python redirige una nueva URL

97

He estado revisando la documentación de Python Requests pero no veo ninguna funcionalidad para lo que estoy tratando de lograr.

En mi guión estoy configurando allow_redirects=True.

Me gustaría saber si la página ha sido redirigida a otra cosa, cuál es la nueva URL.

Por ejemplo, si la URL de inicio fuera: www.google.com/redirect

Y la URL final es www.google.co.uk/redirected

¿Cómo obtengo esa URL?

Daniel Pilch
fuente
Echa un vistazo a esta respuesta para hacer frente a urllib2
horcrux

Respuestas:

158

Está buscando el historial de solicitudes .

El response.historyatributo es una lista de respuestas que llevaron a la URL final, que se puede encontrar en response.url.

response = requests.get(someurl)
if response.history:
    print("Request was redirected")
    for resp in response.history:
        print(resp.status_code, resp.url)
    print("Final destination:")
    print(response.status_code, response.url)
else:
    print("Request was not redirected")

Manifestación:

>>> import requests
>>> response = requests.get('http://httpbin.org/redirect/3')
>>> response.history
(<Response [302]>, <Response [302]>, <Response [302]>)
>>> for resp in response.history:
...     print(resp.status_code, resp.url)
... 
302 http://httpbin.org/redirect/3
302 http://httpbin.org/redirect/2
302 http://httpbin.org/redirect/1
>>> print(response.status_code, response.url)
200 http://httpbin.org/get
Martijn Pieters
fuente
67

Esto responde a una pregunta ligeramente diferente, pero como me quedé atascado en esto, espero que pueda ser útil para otra persona.

Si desea usar allow_redirects=Falsey llegar directamente al primer objeto de redireccionamiento, en lugar de seguir una cadena de ellos, y solo desea obtener la ubicación de redireccionamiento directamente del objeto de respuesta 302, entonces r.urlno funcionará. En cambio, es el encabezado "Ubicación":

r = requests.get('http://github.com/', allow_redirects=False)
r.status_code  # 302
r.url  # http://github.com, not https.
r.headers['Location']  # https://github.com/ -- the redirect destination
hwjp
fuente
Gracias, esto impulsó mi secuencia de comandos de referencia de URL (que tenía miles de URL) en varios segundos.
ahinkle
¿Sabes lo que pasa r.next? Pensé que contendría un PreparedRequestapunte a la URL de redireccionamiento, pero ese no parece ser el caso ...
Elias Strehle
33

Creo que será más seguro llamar a las solicitudes.head en lugar de las solicitudes.get cuando se maneja la redirección de URL, verifique el problema de github aquí :

r = requests.head(url, allow_redirects=True)
print(r.url)
Geng Jiawen
fuente
1
Esta debería ser la respuesta aceptada. Corto y dulce.
Volatil3
5
@ Volatil3: No todos los servidores responden a una solicitud HEAD de la misma manera que lo harían con un GET.
Blender
9

Para python3.5, puede usar el siguiente código:

import urllib.request
res = urllib.request.urlopen(starturl)
finalurl = res.geturl()
print(finalurl)
Shuai.Z
fuente
esta es la respuesta correcta para Python 3.5, me tomó un tiempo encontrarla, gracias
jjj