在Python中检测软404重定向

时间:2013-12-28 12:40:48

标签: python http http-status-code-404 httprequest urllib2

我正在构建一个脚本,它不时地浏览在线故事档案并检测故事何时被删除。但是,当一个故事被删除时,我发现转到故事的URL并不会返回HTTP 404响应代码。相反,它会重定向到自定义的“找不到页面”页面,并返回200 OK响应代码。这意味着,与我原来的想法不同,我不能只检查404.

检测这些重定向404的最佳方法是什么,而不检测任何误报?

2 个答案:

答案 0 :(得分:1)

如果服务器没有返回404 HTTP代码(这很糟糕,实际上,你应该向网站管理员发送邮件),没有简单的方法可以做到。

  • 您可以保留可能仅在错误页面中的单词/句子列表 例如“找不到页面”,“404错误”等。在页面标题中搜索<h[1-3]>标签...

  • 对于每个域/网站,您可以尝试一个不存在的URL(随机放置512位字符串,99%的可能性是404错误页面),并检查页面是否相同(已授权某些变化......)

例如,我很确定https://stackoverflow.com/iapbFeq1X33hgg5Dy9zaFUbSnG7不是有效的网址。将此页面的HTML代码作为参考,如果您检查stackoverflow.com上的任何页面(例如stackoverflow.com/page1),请检查代码是否相同/几乎相同。如果是,那么stackoverflow.com/page1很可能也是404错误页面。

注意:我在这里假设即使在错误页面上,SO也会返回200个代码,这对于cours来说是错误的。首先检查HTTP错误代码,这样更容易:)

答案 1 :(得分:1)

除了解析软404页的文本之外,另一种实现方法是限制重定向并检查status_code是否为200。 (重定向页面通常返回301,302或更多)

您很可能会得到与以下类似的结果:

import requests
r = requests.get("http://httpbin.org/redirect/1")
r.status_code   #This will return 200

但是,如果您禁止重定向,页面将返回其他响应状态代码,例如301等。您可以使用allow_redirects参数执行此操作。

import requests
r = requests.get("http://httpbin.org/redirect/1", allow_redirects=False)
r.status_code   #This will return 302

请注意,如果出于其他目的实际需要重定向,此方法将无法正常工作。