2017-04-16 130 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%可靠。

相關問題