Код перенаправления Http 3XX в запросах python

Я пытаюсь захватить http-код состояния 3XX/302 для URL-адреса перенаправления. Но я не могу получить его, потому что он дает код статуса.

Вот код:

import requests
r = requests.get('http://goo.gl/NZek5')
print r.status_code

Я предполагаю, что это должно вызывать 301 или 302, поскольку оно перенаправляется на другую страницу. Я попробовал несколько перенаправляющих URL-адресов (например, http://fb.com), но опять же он выдает 200. Что нужно сделать, чтобы правильно записать код перенаправления?

Ответы

Ответ 1

requests обрабатывает перенаправления для вас, см. перенаправление и историю.

Установите allow_redirects=False, если вы не хотите, чтобы requests обрабатывал перенаправления, или вы можете проверить ответы перенаправления, содержащиеся в списке r.history.

Демо:

>>> import requests
>>> r = requests.get('http://goo.gl/NZek5')
>>> r.history
(<Response [301]>,)
>>> r.history[0].status_code
301
>>> r.history[0].headers['Location']
'http://docs.python-requests.org/en/latest/user/quickstart/'
>>> r.url
u'http://docs.python-requests.org/en/latest/user/quickstart/'
>>> r = requests.get('http://goo.gl/NZek5', allow_redirects=False)
>>> r.status_code
301
>>> r.url
u'http://goo.gl/NZek5'

Так что, если allow_redirects - True, последующие переадресации выполняются, а окончательный ответ - окончательная страница после следующих переадресаций. Если allow_redirects - False, возвращается первый ответ, даже если он является перенаправлением.

Ответ 2

requests.get разрешает необязательный аргумент ключевого слова allow_redirects, который по умолчанию равен True. Настройка allow_redirects на False автоматически отключится после перенаправления, как показано ниже:

In [1]: import requests
In [2]: r = requests.get('http://goo.gl/NZek5', allow_redirects=False)
In [3]: print r.status_code
301

Ответ 3

Это решение идентифицирует перенаправление и отображает историю перенаправления, и оно будет обрабатывать распространенные ошибки. Это потребует вашего URL-адреса в консоли.

import requests

def init():
    console = input("Type the URL: ")
    get_status_code_from_request_url(console)


def get_status_code_from_request_url(url, do_restart=True):
    try:
        r = requests.get(url)
        if len(r.history) < 1:
            print("Status Code: " + str(r.status_code))
        else:
            print("Status Code: 301. Below are the redirects")
            h = r.history
            i = 0
            for resp in h:
                print("  " + str(i) + " - URL " + resp.url + " \n")
                i += 1
        if do_restart:
            init()
    except requests.exceptions.MissingSchema:
        print("You forgot the protocol. http://, https://, ftp://")
    except requests.exceptions.ConnectionError:
        print("Sorry, but I couldn't connect. There was a connection problem.")
    except requests.exceptions.Timeout:
        print("Sorry, but I couldn't connect. I timed out.")
    except requests.exceptions.TooManyRedirects:
        print("There were too many redirects.  I can't count that high.")


init()