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.