我试图检查存储在我的数据库中的某些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请求仔细检查,但这对我来说似乎是一件肮脏的工作。
答案 0 :(得分:3)
看来你可能必须采用GET方式。当页面处于活动状态时,HEAD 应返回200,但根本无法保证,并且由服务器决定如何实现它。此外,有些人会争辩说HEAD请求应该返回404.规范只是简单地说404:
此状态代码通常在服务器不希望时使用 明确说明请求被拒绝的原因
您还应该考虑服务器实现中可能出现的所有错误和错误。一个简单的谷歌搜索将显示有多少这种类型的错误。很可能HEAD返回200,但GET是404,所以建议的双重检查仅 HEAD 404s的方法,GET请求也不会100%可靠。