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

posted @ 2022-05-02 12:47  青山原  阅读(252)  评论(0编辑  收藏  举报