Python Requests library redirect new url
Solution 1
You are looking for the request history.
The response.history
attribute is a list of responses that led to the final URL, which can be found 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
Solution 2
This is answering a slightly different question, but since I got stuck on this myself, I hope it might be useful for someone else.
If you want to use allow_redirects=False
and get directly to the first redirect object, rather than following a chain of them, and you just want to get the redirect location directly out of the 302 response object, then r.url
won't work. Instead, it's the "Location" header:
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
Solution 3
the documentation has this blurb https://requests.readthedocs.io/en/master/user/quickstart/#redirection-and-history
import requests
r = requests.get('http://www.github.com')
r.url
#returns https://www.github.com instead of the http page you asked for
Solution 4
I think requests.head
instead of requests.get
will be more safe to call when handling url redirect. Check a GitHub issue here:
r = requests.head(url, allow_redirects=True)
print(r.url)
Solution 5
For python3.5, you can use the following code:
import urllib.request
res = urllib.request.urlopen(starturl)
finalurl = res.geturl()
print(finalurl)
Daniel Pilch
Updated on January 27, 2022Comments
-
Daniel Pilch over 2 years
I've been looking through the Python Requests documentation but I cannot see any functionality for what I am trying to achieve.
In my script I am setting
allow_redirects=True
.I would like to know if the page has been redirected to something else, what is the new URL.
For example, if the start URL was:
www.google.com/redirect
And the final URL is
www.google.co.uk/redirected
How do I get that URL?
-
ahinkle over 7 yearsThank you - this boosted my URL referral script (which had thousands of urls) by several seconds.
-
Volatil3 about 7 yearsThis should be the accepted answer. Short and sweet.
-
Blender about 7 years@Volatil3: Not all servers respond to a HEAD request the same way the would with a GET.
-
Elias Strehle over 5 yearsDo you know what is up with
r.next
? I thought that would contain aPreparedRequest
pointing to the redirect URL, but that does not seem to be the case... -
jjj over 4 yearsthis is the correct answer for Python 3.5, it took me a while to find, thanks
-
Preston Badeer over 3 yearshttpbin.org is giving 404s for some reason, but httpbingo.org (same URL scheme) worked just fine for me.
-
Martijn Pieters over 3 years@PrestonBadeer: This is a known issue: github.com/postmanlabs/httpbin/issues/617. It's not crucial that the demo works for the answer, luckily.
-
Vladimir Despotovic almost 3 yearsCan you finish your answer please, If you found out how to do redirect with python3? Thanks.
-
Nioooooo almost 3 yearsWorth adding that this answer will only give you the first redirect URL. if this url, when visited, would have normally redirect again to a new url, you will miss it.