La bibliothèque de requêtes Python redirige une nouvelle URL

97

J'ai parcouru la documentation des demandes Python mais je ne vois aucune fonctionnalité pour ce que j'essaie de réaliser.

Dans mon script, je suis en train de définir allow_redirects=True.

Je voudrais savoir si la page a été redirigée vers autre chose, quelle est la nouvelle URL.

Par exemple, si l'URL de démarrage était: www.google.com/redirect

Et l'URL finale est www.google.co.uk/redirected

Comment obtenir cette URL?

Daniel Pilch
la source
Découvrez cette réponse pour traiter urllib2
horcrux

Réponses:

158

Vous recherchez l' historique des demandes .

L' response.historyattribut est une liste de réponses qui ont conduit à l'URL finale, qui peut être trouvée dans 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")

Démo:

>>> 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
la source
67

Cela répond à une question légèrement différente, mais comme je suis resté coincé moi-même, j'espère que cela pourrait être utile pour quelqu'un d'autre.

Si vous souhaitez utiliser allow_redirects=Falseet accéder directement au premier objet de redirection, plutôt que de suivre une chaîne d'entre eux, et que vous souhaitez simplement obtenir l'emplacement de la redirection directement à partir de l'objet de réponse 302, r.urlcela ne fonctionnera pas. Au lieu de cela, il s'agit de l'en-tête "Location":

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
la source
Merci - cela a boosté mon script de référence URL (qui contenait des milliers d'URL) de plusieurs secondes.
ahinkle
Savez-vous ce qui se passe r.next? Je pensais que cela contiendrait un PreparedRequestpointant vers l'URL de redirection, mais cela ne semble pas être le cas ...
Elias Strehle
33

Je pense que requests.head au lieu de requests.get sera plus sûr à appeler lors de la gestion de la redirection d'url, vérifiez le problème github ici :

r = requests.head(url, allow_redirects=True)
print(r.url)
Geng Jiawen
la source
1
Cela devrait être la réponse acceptée. Court et doux.
Volatil3
5
@ Volatil3: Tous les serveurs ne répondent pas à une requête HEAD de la même manière que le ferait avec un GET.
Blender
9

Pour python3.5, vous pouvez utiliser le code suivant:

import urllib.request
res = urllib.request.urlopen(starturl)
finalurl = res.geturl()
print(finalurl)
Shuai.Z
la source
c'est la bonne réponse pour Python 3.5, il m'a fallu un certain temps pour trouver, merci
jjj