使用 python 获取 http header(获取 405)

Getting http header with python (getting 405)

我正在尝试在 python 中创建一个基本的 link 检查器。

使用以下代码时:

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

它通常有效,而且速度非常快,但有时 return HTTP 405(对于 link 并没有真正损坏)。

为什么我会收到 405(方法错误)错误?我该怎么做才能快速检查损坏的 link? 谢谢

根据 specification405 表示 Method not allowed,这意味着您不能将 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 是一种 "good" 错误 - 资源存在,但无法使用 HEAD。您还可以检查 Allow response header 值,其中 必须设置 以响应您的 HEAD 请求:

The Allow entity-header field lists the set of methods supported by the resource identified by the Request-URI. The purpose of this field is strictly to inform the recipient of valid methods associated with the resource. An Allow header field MUST be present in a 405 (Method Not Allowed) response.

如果你想抓取一些网页,你的请求可能是 GET 方法,如果没问题,它应该是 return 200,但也许某些 conf 在某些季节不允许程序中的 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

希望对您有所帮助!

对于 requests.get,您正在正确获取信息,因为 GET 方法意味着检索由 Request-URI 标识的任何信息(以实体的形式),而 requests.Head 服务器不't return 消息正文在响应中。

请注意,HEAD 方法与 GET 方法相同,只是服务器不得 return 响应中的消息正文。