Python Requests library redirect new url

234,585

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)
Share:
234,585
Daniel Pilch
Author by

Daniel Pilch

Updated on January 27, 2022

Comments

  • Daniel Pilch
    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
    ahinkle over 7 years
    Thank you - this boosted my URL referral script (which had thousands of urls) by several seconds.
  • Volatil3
    Volatil3 about 7 years
    This should be the accepted answer. Short and sweet.
  • Blender
    Blender about 7 years
    @Volatil3: Not all servers respond to a HEAD request the same way the would with a GET.
  • Elias Strehle
    Elias Strehle over 5 years
    Do you know what is up with r.next? I thought that would contain a PreparedRequest pointing to the redirect URL, but that does not seem to be the case...
  • jjj
    jjj over 4 years
    this is the correct answer for Python 3.5, it took me a while to find, thanks
  • Preston Badeer
    Preston Badeer over 3 years
    httpbin.org is giving 404s for some reason, but httpbingo.org (same URL scheme) worked just fine for me.
  • Martijn Pieters
    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
    Vladimir Despotovic almost 3 years
    Can you finish your answer please, If you found out how to do redirect with python3? Thanks.
  • Nioooooo
    Nioooooo almost 3 years
    Worth 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.