Python 断点续传
HTTP请求头Range
- range是请求资源的部分内容(不包括响应头的大小),单位是byte,即字节,从0开始;
- 如果服务器能够正常响应的话,服务器会返回 206 Partial Content 的状态码及说明;
- 如果不能处理这种Range的话,就会返回整个资源以及响应状态码为 200 OK
Range请求头格式
Range: bytes=start-end
Range头域
Range头域可以请求实体的一个或者多个子范围。例如,
- 表示头500个字节:bytes=0-499
- 表示第二个500字节:bytes=500-999
- 表示最后500个字节:bytes=-500
- 表示500字节以后的范围:bytes=500-
- 第一个和最后一个字节:bytes=0-0,-1
- 同时指定几个范围:bytes=500-600,601-999
- 注意,这个表示[start,end],即是包含请求头的start及end字节的,所以,下一个请求,应该是上一个请求的[end+1, nextEnd]
🌰及梳理
Response = requests.get(url, stream=True, verify=False)
total_size = int(Response.headers.get('content-length', 0))
# 【1】判断本地文件是否存在,存在则读取文件数据大小
if Path(paths).exists():
temp_size = os.path.getsize(paths)
else:temp_size = 0
if temp_size >= total_size:
print("下载完成")
return paths
# 【2】重新请求网址,加入新的请求头的
header = {"Range": f"bytes={temp_size}-{total_size}"}
Req = requests.get(url,headers=header,stream=True, verify=False)
# 【3】"ab"表示追加形式写入文件
with open(paths, "ab") as file, tqdm(
# 【4】tqdm设置参数:initial
initial=temp_size,
desc="正在下载",
total=total_size,
unit='',
unit_scale=True,
unit_divisor=1024,
) as bar:
for data in Req.iter_content(chunk_size=1024): # 边下载边存硬盘
size = file.write(data)
bar.update(size)
return paths