【问题标题】:Detecting soft 404 redirects in Python在 Python 中检测软 404 重定向
【发布时间】:2014-01-15 20:52:23
【问题描述】:
我正在构建一个脚本,它时不时地爬取在线故事存档并检测故事何时被删除。但是,当一个故事被删除时,我发现转到该故事的 URL 不会返回 HTTP 404 响应代码。相反,它重定向到自定义的“未找到页面”页面,并返回 200 OK 响应代码。这意味着,与我最初的想法不同,我不能只检查 404。
在不检测任何误报的情况下检测这些重定向 404 的最佳方法是什么?
【问题讨论】:
标签:
python
http
http-status-code-404
httprequest
urllib2
【解决方案1】:
如果服务器没有返回 404 HTTP 代码(这很糟糕,真的,你应该给网站管理员发邮件),没有简单的方法。
例如,我很确定 https://stackoverflow.com/iapbFeq1X33hgg5Dy9zaFUbSnG7 不是有效的 URL。将此页面的 HTML 代码作为参考,如果您检查 stackoverflow.com 上的任何页面(例如 stackoverflow.com/page1),请检查代码是否不同/几乎相同。如果是这样,stackoverflow.com/page1 很有可能也是 404 错误页面。
注意: 我在这里假设 SO 即使在示例的错误页面上也会返回 200 代码,这在现实中是错误的。首先检查HTTP错误代码,这更容易:)
【解决方案2】:
除了解析软 404page 的文本外,另一种实现方式是限制重定向并检查 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
请注意,如果出于其他目的实际需要重定向,则此方法将不起作用。