【问题标题】: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 代码(这很糟糕,真的,你应该给网站管理员发邮件),没有简单的方法。

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

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

例如,我很确定 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
    

    请注意,如果出于其他目的实际需要重定向,则此方法将不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-11
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2022-12-20
      • 1970-01-01
      • 2011-06-06
      相关资源
      最近更新 更多