2013-12-09 14 views
40

Ho cercato nella documentazione di Python Requests ma non riesco a vedere alcuna funzionalità per quello che sto cercando di ottenere.Libreria Python richieste reindirizza nuovo URL

Nel mio script sto impostando allow_redirects=True.

Mi piacerebbe sapere se la pagina è stata reindirizzata a qualcos'altro, qual è il nuovo URL.

Ad esempio, se l'URL partenza è stata: www.google.com/redirect

e l'URL finale è www.google.co.uk/redirected

Come faccio a ottenere l'URL?

risposta

83

Stai cercando il request history.

L'attributo response.history è un elenco di risposte che ha portato all'URL finale, che può essere trovato in 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" 

Demo:

>>> 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 
13

Penso requests.head invece di requests.get sarà più sicuro chiamare durante la manipolazione URL di reindirizzamento, controllare il problema github here:

r = requests.head(url, allow_redirects=True) 
print(r.url) 
+0

Questa dovrebbe essere la risposta accettata. Breve e dolce. – Volatil3

+1

@ Volatil3: non tutti i server rispondono a una richiesta HEAD allo stesso modo di un GET. – Blender

23

Questa è una domanda leggermente diversa, ma visto che mi sono bloccato su questo, spero di potrebbe essere utile per qualcun altro

Se si desidera utilizzare allow_redirects=False e arrivare direttamente al primo oggetto di reindirizzamento, piuttosto che seguire una catena di loro, e si desidera solo per ottenere la posizione di reindirizzamento direttamente fuori dell'oggetto 302 risposta, quindi r.url non funzionerà . Invece, è la "Location" intestazione:

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 
+0

Grazie - questo ha potenziato il mio script di riferimento agli URL (che aveva migliaia di URL) di alcuni secondi. – hinteractive02

2

Per python3.5, è possibile utilizzare il seguente codice:

import urllib.request 
res = urllib.request.urlopen(starturl) 
finalurl = res.geturl() 
print(finalurl)