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?


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

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

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)

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)

Dies ist die richtige Antwort für Python 3.5. Ich habe eine Weile
gebraucht
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.