Код перенаправления 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()