2017-04-16 149 views
2

我试图检查存储在我的数据库中的某些URL是否仍然有效链接。为了实现这一点,我使用httplib2来请求HEAD状态,以避免下载页面的全部内容。我对结果很满意。HEAD和GET http请求为同一个URL返回不同的状态代码

但后来我发现了一些使用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) 

但我使用任何lib下,我仍然有不同的GET &相同URL的HEAD状态。

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

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

只要在HEAD请求上返回大于400的状态代码,但对于我来说这似乎是一个肮脏的工作,我可以仔细检查GET请求。

回答

2

看来你可能不得不这样做GET的方式。虽然HEAD 应当在页面生效时返回200,但根本没有保证,并且服务器如何实现它。此外,有些人认为HEAD请求应返回404规范只是说这个约404:

这个状态码是常用的当服务器不希望 透露究竟为什么请求已被拒绝

您还应该考虑到服务器实现中可能存在的所有错误和错误。一个简单的谷歌搜索会告诉你有多少这样的错误。它很可能是HEAD返回200,但GET是404,所以你建议的双重检查方法只有 HEAD 404s,GET请求也不会100%可靠。

相关问题