在自动化下载中,处理断点续传是一个重要的功能,尤其是在下载大文件时。断点续传允许用户在下载中断后,从中断的地方继续下载,而不是从头开始。以下是实现断点续传的一些步骤和方法:
确保目标服务器支持 HTTP Range 请求。通过发送带有 Range 头的请求,可以指定要下载的文件的字节范围。
在开始下载之前,检查本地是否已经存在部分下载的文件,并获取其大小。这可以通过 os.path.getsize() 方法实现。
根据已下载的文件大小,计算出需要下载的字节范围。例如,如果已下载 500 KB,而文件总大小为 2 MB,则需要下载的范围是从 500 KB 到 2 MB。
在下载时,使用 Range 头部指定要下载的字节范围。如果文件已经部分下载,可以从上次中断的地方继续下载。
在下载过程中,确保将新下载的数据追加到已存在的文件中,而不是覆盖它。
实现错误处理机制,以便在下载失败时能够重试。可以设置最大重试次数,避免无限重试。
以下是一个简单的 Python 示例,演示如何实现断点续传:
python复制import os
import requests
def download_file(url, local_filename):
# 检查已下载的文件大小
if os.path.exists(local_filename):
resume_header = {'Range': f'bytes={os.path.getsize(local_filename)}-'}
else:
resume_header = {}
# 发送请求
response = requests.get(url, headers=resume_header, stream=True)
# 检查响应状态
if response.status_code not in (200, 206):
print(f"Error: {response.status_code}")
return
# 以追加模式打开文件
with open(local_filename, 'ab') as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
print(f"Downloaded: {local_filename}")
if __name__ == "__main__":
url = "http://example.com/largefile.zip"
local_filename = "largefile.zip"
download_file(url, local_filename)