Python Requests бібліотека перенаправляє нову URL-адресу


97

Я переглядав документацію щодо запитів Python, але не бачу жодної функціональності того, що намагаюся досягти.

У своєму сценарії я встановлюю allow_redirects=True.

Я хотів би знати, чи сторінку переспрямовано на щось інше, що таке нова URL-адреса.

Наприклад, якщо початковою URL-адресою було: www.google.com/redirect

І кінцева URL-адреса є www.google.co.uk/redirected

Як отримати цю URL-адресу?


Перевірте цей відповідь для вирішення urllib2
горокракс

Відповіді:


158

Ви шукаєте історію запитів .

response.historyАтрибут представляє собою список відповідей , які привели до остаточного URL, який можна знайти в 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")

Демо:

>>> 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

Це відповідає на дещо інше запитання, але оскільки я сам на цьому застряг, сподіваюся, це може бути корисним для когось іншого.

Якщо ви хочете використовувати allow_redirects=Falseі дістатись безпосередньо до першого об’єкта переспрямування, а не слідувати ланцюжку з них, і ви просто хочете отримати місце переспрямування безпосередньо з об’єкта відповіді 302, тоді r.urlце не буде працювати. Натомість це заголовок "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

Дякую - це збільшило мій сценарій переходу за URL-адресою (який мав тисячі URL-адрес) на кілька секунд.
ahinkle

Чи знаєте ви, що там r.next? Я думав, що міститиме PreparedRequestвказівку на URL-адресу для переадресації, але, схоже, це не так ...
Еліас Стреле


33

Думаю, request.head замість request.get буде більш безпечним для виклику при обробці перенаправлення URL-адреси, перевірте проблему github тут :

r = requests.head(url, allow_redirects=True)
print(r.url)

1
Це має бути прийнятою відповіддю. Короткий і солодкий.
Volatil3,

5
@ Volatil3: Не всі сервери відповідають на запит HEAD так само, як і з GET.
Blender

9

Для python3.5 ви можете використовувати такий код:

import urllib.request
res = urllib.request.urlopen(starturl)
finalurl = res.geturl()
print(finalurl)

це правильна відповідь для Python 3.5, мені знадобився час, щоб знайти, дякую
jjj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.