【问题标题】:How do I check the HTTP status code of an object without downloading it?如何在不下载对象的情况下检查对象的 HTTP 状态代码?
【发布时间】:2010-12-16 10:07:08
【问题描述】:
>>> a=urllib.urlopen('http://www.domain.com/bigvideo.avi')
>>> a.getcode()
404
>>> a=urllib.urlopen('http://www.google.com/')
>>> a.getcode()
200

我的问题是...bigvideo.avi 是 500MB。我的脚本是否首先下载文件,然后检查它?或者,它可以不保存文件就立即检查错误代码吗?

【问题讨论】:

    标签: python http


    【解决方案1】:

    您实际上想告诉服务器不要发送文件的全部内容。 HTTP 对此有一种称为“HEAD”的机制,它可以替代“GET”。它的工作方式相同,但服务器只向您发送标头,没有实际内容。

    这将至少为你们节省一个带宽,而根本不执行 read() 将不会打扰获取完整文件。

    试试这个:

    import httplib
    c = httplib.HTTPConnection(<hostname>)
    c.request("HEAD", <url>)
    print c.getresponse().status
    

    将打印状态代码。 Url 只能是一个段,例如“/foo”,主机名应该是“www.example.com”。

    【讨论】:

    • 在 py3k 中是 http.client 而不是 httplib 其余部分完全相同。
    【解决方案2】:

    是的,它将获取文件。

    我认为您真正想要做的是发送一个 HTTP HEAD 请求(它基本上不是向服务器询问数据本身,而是仅询问标头)。你可以看here

    【讨论】:

      【解决方案3】:

      我认为您的代码已经做到了。 您永远不会在响应中调用 read() 方法,因此您永远不会真正下载文件的内容。

      更好的是...您可以使用 httplib 发送 HTTP HEAD 请求,而不是像您的 urllib 代码那样执行 HTTP GET。

      【讨论】:

      • 也就是说……如果我要检查一个 500GB 文件的状态码……只需要一秒钟?
      • 这并不完全正确。因为 urllib 向服务器发送了一个完整的请求,服务器将开始转储它,即使它没有一直到达应用程序。
      • Ken,我知道你的意思,但他的问题是如何在不下载文件的情况下做到这一点。在这种情况下,客户端在响应头之后不会读取任何内容
      • @corey:它可能仍然会阻塞,你在浪费带宽。
      • 没错,但他真正想要的是HEAD,不会浪费两边的带宽。
      猜你喜欢
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多