HEAD和GET http请求返回相同URL的不同状态代码

时间:2017-04-16 13:16:18

标签: python python-requests http-status-codes httplib2

我试图检查存储在我的数据库中的某些URL是否仍然是有效链接。为了实现这一点,我使用httplib2来请求HEAD状态,以避免下载页面的整个内容。我对结果非常满意。

但后来我发现了一些情况,其中使用HEAD请求时返回的状态代码与使用GET请求返回的状态代码不同。

因此,如果库中存在错误,我会使用不同的库进行一些测试(下面是我的#34;请求" 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状态。

所以,显然网站维护者决定不为HEAD和GET请求返回相同的状态代码......即使不推荐,这似乎也是合法的。

有没有办法避免这个问题,仍然知道链接是否有效而无需下载我需要验证的近200万网址的全部内容?

每当在HEAD请求上返回> 400状态代码时,我都可以使用GET请求仔细检查,但这对我来说似乎是一件肮脏的工作。

1 个答案:

答案 0 :(得分:3)

看来你可能必须采用GET方式。当页面处于活动状态时,HEAD 返回200,但根本无法保证,并且由服务器决定如何实现它。此外,有些人会争辩说HEAD请求应该返回404.规范只是简单地说404:

  

此状态代码通常在服务器不希望时使用   明确说明请求被拒绝的原因

您还应该考虑服务器实现中可能出现的所有错误和错误。一个简单的谷歌搜索将显示有多少这种类型的错误。很可能HEAD返回200,但GET是404,所以建议的双重检查 HEAD 404s的方法,GET请求也不会100%可靠。