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

时间:2017-01-09 10:54:23

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

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

是否可以使用Python requests执行此操作?我已经知道如何检查状态代码,但我只能在下载文件后才这样做。

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

3 个答案:

答案 0 :(得分:5)

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

  

HEAD方法与GET相同,只是服务器不能   在响应中返回一个消息体。元信息包含   在HTTP头中响应HEAD请求应该是相同的   响应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'}

此代码不下载图片,但返回图片信息的标题,其中包含大小,类型,日期。如果图片不存在,就没有这样的信息。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

使用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'])