使用Python获取HTTP头部信息(收到405错误)

9
我正在尝试用Python创建一个基本的链接检查器。
当使用以下代码时:
def get_link_response_code(link_to_check):  
    resp = requests.get(link_to_check)
    return resp.status_code

我总是得到正确的响应代码,但需要相当长的时间。
但是当使用此代码时:(requests.get 替换为 requests.head)
def get_link_response_code(link_to_check):  
    resp = requests.head(link_to_check)
    return resp.status_code

通常情况下它很快并且工作正常,但有时会返回HTTP 405错误(对于一个实际上并没有损坏的链接)。
我为什么会收到405(错误的方法)错误?我该怎么快速检查损坏的链接呢?谢谢。

这个链接会很有用。 - Hana Bzh
看起来到那个(有效的!)资源的“当前”路由上的代理/服务器之一配置为不接受HEAD方法。这与代码本身无关... - Ron Klein
3个回答

9
根据规范405表示方法不允许,这意味着您不能对此特定资源使用HEAD。请处理它并在这些情况下使用get()
def get_link_response_code(link_to_check):
    resp = requests.head(link_to_check)
    if resp.status_code == 405:
        resp = requests.get(link_to_check)
    return resp.status_code

作为附注,你可能不需要进行额外的 get() 操作,因为 405 是一种“好”的错误——资源存在,但不能使用 HEAD。你还可以检查 Allow response header 值,该值必须在 HEAD 请求的响应中设置:

允许实体头字段列出了由 Request-URI 标识的资源支持的方法集。该字段的目的严格是为了通知接收者与资源相关联的有效方法集。一个 405 (Method Not Allowed) 响应中必须存在 Allow 头字段。


顺便提一下,配置禁用HEAD方法的服务器通常是不良实践。 - Anzel
非常好的答案,谢谢。我会使用您修改后的代码,但是您的侧注是错误的 - 我尝试访问此“阻塞”网站上的另一页,即: www.domain-with-405.com/non-existent/ 通过浏览器我得到了404错误,但从代码中仍然得到了405。因此,如果我想检查特定页面是否存在,我必须在这些情况下使用get函数。 再次感谢。 - tomermes

2

对于requests.get方法,你正确地获取了信息,因为GET方法意味着检索由请求URI标识的任何信息(以实体形式),而requests.Head方法服务器在响应中不返回消息正文。

请注意,HEAD方法与GET方法相同,除了服务器在响应中不得返回消息正文。


0
如果您正在尝试爬取某个网页,您的请求可能是GET方法,如果一切正常,它应该返回200。但是,由于某些原因,有些配置不允许程序使用GET方法,这时您可以添加以下代码:
def get_link_response_code(link_to_check):
  try:
    resp = requests.head(link_to_check)
    if resp.status_code != 200:
      print "error"
    else:
      reutrun resp.status_code
  except Exception,error:
    print error

  return None

希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接