检查大文件是否存在而不下载它

24

不确定是否可能,但我想检查HTTP请求的状态码,而不必下载一个大文件; 我只想检查它是否在服务器上存在。

使用Python的requests,是否可以实现这一点? 我已经知道如何检查状态码,但只能在文件下载完成后才能进行。

我想问的是是否可以发出GET请求,并在接收到响应头后立即停止?


也许这篇帖子可以帮到你。 - dot.Py
@dot.Py 使用子进程调用 ssh 命令来检查 SSH 服务器上文件的存在性... 虽然情况不同但还是谢谢。 - Juicy
3个回答

24

使用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'}

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


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 下载整个文件。 - tejasvi88

2

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


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