当我们需要校验下载链接是否可正常访问时,通常的做法是直接发起请求,检查它是否可以下载文件。但是当下载的文件比较大,或者要检查的下载链接比较多时,就会占用很大的存储空间,浪费大量的网络带宽。
如果只想检测下载链接是否可访问,又不需要下载文件,该怎么办呢?
方法1:requests.get(stream=True)
stream参数介绍:
‘stream’ 参数是 Python requests 库中 get() 方法的一个可选参数,用于控制是否立即下载响应的内容。当 stream 参数设置为 True 时,表示以流的形式获取响应内容,而不会立即下载整个响应主体。
通常情况下,当你使用 get() 方法获取一个较大的响应内容时,如果立即下载整个响应主体,会占用大量内存。但是,如果你将 stream 参数设置为 True,则可以通过迭代器逐行读取响应内容,这样可以节省内存空间,并且适用于处理大型响应或需要长时间下载的内容。
当你设置 stream 参数为 True 时,你可以通过迭代响应对象的 iter_content() 方法来逐行读取响应内容,或者通过 iter_lines() 方法逐行读取响应内容的文本行。也可以选择不读取响应内容。
使用 stream=True 的另一个常见场景是下载大文件时,因为它可以避免将整个文件加载到内存中,而是逐个读取文件的小块。
import requests
def check_apk_download_get(download_url):
try:
# 发送 GET 请求检测是否能够正常下载
response = requests.get(download_url, stream=True, allow_redirects=True, timeout=5, headers=headers)
if response.status_code == 200:
# 如果返回状态码为 200,说明可以正常下载
is_ok = True
print("GET OK download success:", download_url)
else:
# 如果返回状态码不是 200,说明下载失败
is_ok = False
print("GET Failed ===>> download failed: status_code=", response.status_code, url)
response.close()
except requests.exceptions.RequestException as e:
# 发生异常时,说明下载失败
is_ok = False
print("GET Error RequestException:", e)
return is_ok
方法2:requests.head()
前提:确保目标 URL 支持 HEAD 请求方式。
requests.head() 是 Python requests 库中的一个方法,用于发起 HTTP HEAD 请求。与 HTTP GET 请求类似,HEAD 请求也是一种用于获取资源的请求,但不同的是,服务器在响应中只返回响应头部信息,而不返回响应主体内容。
使用 requests.head() 方法可以实现以下几个作用:
- 检查资源的存在性: 你可以使用 HEAD 请求来检查某个 URL 是否存在,而不需要下载整个资源内容。如果服务器返回 200 状态码,则表示资源存在;如果返回 404 状态码,则表示资源不存在。
- 获取资源的元数据: 通过 HEAD 请求,你可以获取到资源的一些元数据信息,如响应头部中的 Content-Type、Content-Length、Last-Modified 等字段,而不必下载整个资源内容。
- 节省带宽和资源: 由于 HEAD 请求只返回响应头部信息,不返回响应主体内容,因此可以节省带宽和服务器资源,特别是当你只是想获取资源的一些元数据信息时。
import requests
url = 'https://example.com'
response = requests.head(url)
if response.status_code == 200:
print("URL exists")
print("Content-Type:", response.headers['Content-Type'])
print("Content-Length:", response.headers['Content-Length'])
print("Last-Modified:", response.headers['Last-Modified'])
else:
print("URL does not exist")