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% надежным.

Другие вопросы по тегам