Python Requests Bibliothek leitet neue URL um

95

Ich habe die Python Requests-Dokumentation durchgesehen, aber ich kann keine Funktionalität für das sehen, was ich erreichen möchte.

In meinem Skript stelle ich ein allow_redirects=True.

Ich würde gerne wissen, ob die Seite zu etwas anderem umgeleitet wurde, wie lautet die neue URL.

Zum Beispiel, wenn die Start-URL war: www.google.com/redirect

Und die endgültige URL ist www.google.co.uk/redirected

Wie bekomme ich diese URL?

Daniel Pilch
quelle
Schauen Sie sich diese Antwort für den Umgang mit urllib2
Horkrux

Antworten:

155

Sie suchen nach dem Anforderungsverlauf .

Das response.historyAttribut ist eine Liste von Antworten, die zur endgültigen URL geführt haben, die in zu finden ist 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
Martijn Pieters
quelle
67

Dies beantwortet eine etwas andere Frage, aber da ich selbst daran festgehalten habe, hoffe ich, dass es für jemand anderen nützlich sein könnte.

Wenn Sie allow_redirects=Falsedas erste Umleitungsobjekt verwenden und direkt darauf zugreifen möchten , anstatt einer Kette davon zu folgen, und Sie nur den Umleitungsort direkt aus dem 302-Antwortobjekt abrufen möchten, r.urlfunktioniert dies nicht. Stattdessen ist es der Header "Standort":

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
quelle
Vielen Dank - dies hat mein URL-Verweis-Skript (das Tausende von URLs hatte) um einige Sekunden erhöht.
Ahinkle
Weißt du was r.nextlos ist ? Ich dachte, das würde einen PreparedRequestHinweis auf die Weiterleitungs-URL enthalten, aber das scheint nicht der Fall zu sein ...
Elias Strehle
32

Ich denke, Requests.head anstelle von Requests.get ist sicherer beim Aufrufen der URL-Umleitung. Überprüfen Sie das Github-Problem hier :

r = requests.head(url, allow_redirects=True)
print(r.url)
Geng Jiawen
quelle
1
Dies sollte die akzeptierte Antwort sein. Kurz und bündig.
Volatil3
5
@ Volatil3: Nicht alle Server antworten auf eine HEAD-Anfrage genauso wie bei einem GET.
Blender
9

Für Python3.5 können Sie den folgenden Code verwenden:

import urllib.request
res = urllib.request.urlopen(starturl)
finalurl = res.geturl()
print(finalurl)
Shuai.Z
quelle
Dies ist die richtige Antwort für Python 3.5. Ich habe eine Weile
gebraucht