HEAD и запрос GET http возвращают разные коды состояния для одного и того же URL
Я пытаюсь проверить, являются ли некоторые URL-адреса, хранящиеся в моей БД, действительными ссылками или нет. Чтобы добиться этого, я использую httplib2 для запроса статуса HEAD, чтобы избежать загрузки всего содержимого страницы. И я был вполне доволен результатами.
Но затем я обнаружил некоторые случаи, когда код состояния, возвращаемый при использовании запроса HEAD, не похож на код, возвращенный с запросом GET.
Итак, на случай ошибки в библиотеке, я сделал несколько тестов с разными библиотеками (ниже мой "запрос" lib-теста):
> import requests
> rg = requests.get("https://fr.news.yahoo.com/chemin-dames-l-hommage-personnel-pr%C3%A9sident-121005844.html")
> rh = requests.head("https://fr.news.yahoo.com/chemin-dames-l-hommage-personnel-pr%C3%A9sident-121005844.html")
> print("GET status code:", rg.status_code)
('GET status code:', 200)
> print("HEAD status code:", rh.status_code)
('HEAD status code:', 404)
Но какую бы библиотеку я ни использовал, у меня все равно будет другой статус GET & HEAD для того же URL.
Таким образом, очевидно, что администратор сайта решил не возвращать идентичный код состояния для HEAD и GET-запроса... и это кажется законным, даже если не рекомендуется.
Есть ли способ избежать этой проблемы и все еще знать, является ли ссылка действительной, не загружая весь контент из почти 2 миллионов URL, которые мне нужно проверить?
Я могу перепроверить с запросом GET всякий раз, когда по запросу HEAD возвращается код состояния> 400, но это кажется мне грязной работой.
1 ответ
Кажется, что вам, возможно, придется сделать это ПОЛУЧИТЬ. В то время как HEAD должно возвращать 200, когда страница активна, на это просто нет никакой гарантии, и ее решение зависит от сервера. Кроме того, некоторые утверждают, что запрос HEAD должен возвращать 404. В спецификации просто говорится об этом около 404:
Этот код состояния обычно используется, когда сервер не хочет точно указать, почему запрос был отклонен
Также следует учитывать все ошибки и ошибки, которые могут присутствовать в реализации сервера. Простой поиск в Google покажет вам, сколько существует ошибок такого рода. Вполне возможно, что HEAD возвращает 200, но GET равен 404, поэтому предлагаемый вами метод двойной проверки только HEAD 404 с запросами GET также не будет на 100% надежным.