Код состояния HTTP 404 (не найден) отображается как 302 - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь получить код состояния HTTP для списка URL-адресов в python, используя следующий фрагмент кода:

try:
    r = requests.head(testpoint_url)
    print(testpoint_url+" : "+str(r.status_code))
    # prints the int of the status code.
except requests.ConnectionError:
    print("failed to connect")

Удивительно, но для некоторых URL-адресов я получаю код состояния 302в то время как при просмотре в браузере вы видите код 404!

enter image description here

Что происходит?Как я могу получить реальный код статуса (например, 404)?

1 Ответ

0 голосов
/ 11 октября 2018

302 - это перенаправление HTTP.Веб-браузер будет выполнять перенаправление на URL-адрес, указанный в заголовке ответа Location.При запросе следующего URL-адреса он будет иметь собственный код ответа, который может включать 404.

Ваш код Python не следует перенаправлению, что объясняет, почему вместо него получается исходный 302.

Согласно документации Запросы :

Перенаправление и история

По умолчанию запросы выполняют перенаправление местоположения для всех глаголов , кромеHEAD .

Мы можем использовать свойство history объекта Response для отслеживания перенаправления.

Список Response.history содержит Response объекты, которые были созданы для того, чтобызавершить запрос.Список отсортирован от самого старого до самого последнего ответа.

...

Если вы используете GET, OPTIONS, POST, PUT, PATCH или DELETE, вы можете отключить обработку перенаправленияс параметром allow_redirects:

>>> r = requests.get('https://github.com/', allow_redirects=False)

>>> r.status_code
301

>>> r.history
[]

Если вы используете HEAD, вы также можете включить перенаправление :

>>> r = requests.head('https://github.com/', allow_redirects=True)

>>> r.url
'https://github.com/'

>>> r.history
[<Response [301]>]

Итак,в своем коде измените это:

r = requests.head(testpoint_url)

На это:

r = requests.head(testpoint_url, allow_redirects=True)

Тогда r.status_code будет окончательным кодом состояния (т. е. 404) после всех перенаправлений.

...