La libreria Python Requests reindirizza il nuovo URL


95

Ho esaminato la documentazione delle richieste Python ma non riesco a vedere alcuna funzionalità per ciò che sto cercando di ottenere.

Nella mia sceneggiatura sto impostando allow_redirects=True.

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

Ad esempio, se l'URL di inizio era: www.google.com/redirect

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

Come ottengo quell'URL?


Dai un'occhiata a questa risposta per trattare con urllib2
horcrux

Risposte:


156

Stai cercando la cronologia delle richieste .

L' response.historyattributo è un elenco di risposte che hanno 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

67

Questo sta rispondendo a una domanda leggermente diversa, ma dal momento che sono rimasto bloccato su questo da solo, spero che possa essere utile per qualcun altro.

Se si desidera utilizzare allow_redirects=Falsee arrivare direttamente al primo oggetto di reindirizzamento, invece di seguirne una catena, e si desidera solo ottenere la posizione di reindirizzamento direttamente dall'oggetto di risposta 302, allora r.urlnon funzionerà. Invece, è l'intestazione "Posizione":

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

Grazie - questo ha potenziato il mio script di referral URL (che aveva migliaia di URL) di diversi secondi.
ahinkle

Sai cosa succede r.next? Pensavo che contenesse un PreparedRequestpuntamento all'URL di reindirizzamento, ma non sembra essere il caso ...
Elias Strehle


32

Penso che requests.head invece di requests.get sarà più sicuro da chiamare quando gestisci il reindirizzamento dell'URL, controlla il problema di github qui :

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

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

5
@ Volatil3: Non tutti i server rispondono a una richiesta HEAD nello stesso modo in cui farebbero con un GET.
Blender

9

Per python3.5, puoi usare il seguente codice:

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

questa è la risposta corretta per Python 3.5, mi ci è voluto un po 'per trovarla, grazie
jjj
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.