【问题标题】:Check if a large file exists without downloading it检查是否存在大文件而不下载它
【发布时间】:2017-05-23 14:49:36
【问题描述】:

不确定这是否可行,但我想在不下载大文件的情况下检查 HTTP 请求的状态代码;我只是想检查它是否存在于服务器上。

是否可以用 Python 的requests 做到这一点?我已经知道如何检查状态码,但我只能在文件下载后才能这样做。

我想我要问的是,您能否发出 GET 请求并在收到响应标头后立即停止它?

【问题讨论】:

  • 也许this post可以帮助你。
  • @dot.Py 使用对 ssh 的子进程调用来检查 SSH 服务器上是否存在文件……情况不同,但谢谢。

标签: python-3.x web-scraping http-headers python-requests


【解决方案1】:

使用requests.head()。这只会返回请求的头部,而不是所有的内容——换句话说,它不会返回消息的正文,但是你可以从头部获取所有的信息。

HEAD 方法与 GET 相同,只是服务器不能 在响应中返回消息体。包含的元信息 在响应 HEAD 请求的 HTTP 标头中应该相同 响应 GET 请求而发送的信息。 这种方法可以 用于获取有关实体隐含的元信息 请求而不传输实体主体本身。这种方法是 通常用于测试超文本链接的有效性、可访问性、 以及最近的修改。

例如:

import requests
url = 'http://lmsotfy.com/so.png'
r = requests.head(url)
r.headers

输出:

{'Content-Type': 'image/png', 'Content-Length': '6347', 'ETag': '"18cb-4f7c2f94011da"', 'Accept-Ranges': 'bytes', 'Date': 'Mon, 09 Jan 2017 11:23:53 GMT', 'Last-Modified': 'Thu, 24 Apr 2014 05:18:04 GMT', 'Server': 'Apache', 'Keep-Alive': 'timeout=2, max=100', 'Connection': 'Keep-Alive'}

此代码不下载图片,而是返回图片信息的标头,其中包含大小、类型和日期。如果图片不存在,则不会有此类信息。

【讨论】:

    【解决方案2】:

    通常,您使用 HEAD 方法而不是 GET 来处理此类事情。如果您在 Web 上查询某个随机服务器,请准备好它可能被配置为返回不一致的结果(这对于需要注册的服务器来说很典型)。在这种情况下,您可能希望使用带有 Range header 的 GET 请求来仅下载少量字节。

    【讨论】:

      【解决方案3】:

      使用HEAD 方法。 例如urllib

      import urllib.request
      
      response = urllib.request.urlopen(url)
      if response.getcode() == 200:
          print(response.headers['content-length'])
      

      你的情况是requests

      import requests
      
      response = requests.head(url)
      if response.status_code == 200:
          print(response.headers['content-length'])
      

      【讨论】:

      • urllib.request.urlopen 下载整个文件。
      猜你喜欢
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 2020-03-17
      相关资源
      最近更新 更多