python 文件下载之断点续传的实现
作者:不侠居 发布时间:2023-07-18 21:57:16
1.前序
当下载突然断开后,断点续传就需要了,继续前面下载的内容下载。解决了不需要重复下载
2.技术原理
HTTP/1.1 开始支持断点续传,一般断点下载会用到 Range 和 Content-Range 实体头
Range是请求头,Content-Range是响应头
2.1 Content-Range
用于响应头中
语法:
Content-Length: <length>
2.2 Range
Range
HTTP 请求头表示服务器应返回的文档部分。可以同时用一个头请求多个部件,服务器可以在多部分文档中发回这些范围。如果服务器发回范围,则使用 206 部分内容进行响应。如果范围无效,服务器会返回 416 范围不可满足的错误。服务器还可以忽略标题,然后返回整个文档,并返回 200 状态代码。
语法:
Range: <unit>=<range-start>-
Range: <unit>=<range-start>-<range-end>
Range: <unit>=<range-start>-<range-end>, <range-start>-<range-end>
Range: <unit>=<range-start>-<range-end>, <range-start>-<range-end>, <range-start>-<range-end>
Range: <unit>=-<suffix-length>
unit
:指定范围的单位,通常是bytes。range-start
:指示请求范围开始的给定单元中的整数。range-end
:给定单元中的整数,指示所请求范围的末尾。此值是可选的,如果省略,文档的末尾将被视为范围的末尾。suffix-length
:给定单位中的整数,指示要返回的文件末尾的单位数。
例子:
(1)从文件中请求三个范围。第一个范围为第200字节到第1000个字节的位置;第二个范围为第2000个字节位置到第6576个字节的位置;第三个范围为第19000字节位置之后的全部
Range: bytes=200-1000, 2000-6576, 19000-
(2)请求文件的前 500 和最后 500 字节。如果范围重叠,服务器可能会拒绝该请求。
Range: bytes=0-499, -500
3. 代码实现
import requests
import os
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36'
}
file_path = './video/1.mp4' # 存储地址
url = 'https://v3-dy-o.zjcdn.com/410b9087e76fe2360e320463f8586ed8/6185ea7a/video/tos/cn/tos-cn-ve-15-alinc2/62427caf076b4d7d9dbbdbea98f97c9f/?a=6383&br=2690&bt=2690&cd=0%7C0%7C0&ch=26&cr=0&cs=0&cv=1&dr=0&ds=3&er=&ft=jal9w1-eTz7ThWR7Wlct&l=021636162458101fdbd400a040000000a70125e00000141b4be97&lr=all&mime_type=video_mp4&net=0&pl=0&qs=0&rc=M3U8bDw6ZmZsODMzNGkzM0ApPDY3Ozs7Mzw7NzY6N2g0aWdqNGVfcjRnZG5gLS1kLTBzczU2MV40Ly40NmAtLV8xLWI6Yw%3D%3D&vl=&vr='
r = requests.get(url,headers=header)
total_size = int(r.headers['Content-Length']) # 查看文件大小,并转换为整数类型
print(r.headers)
# 查看本地下载了多少
if os.path.exists(file_path):
temp_size = os.path.getsize(file_path) # 本地已经下载的文件大小
else:
temp_size = 0
print('已下载:' + temp_size)
print('总共需要下载:' + total_size)
header['Range'] = 'bytes={}-'.format(temp_size) # 向头加入Range信息
print(header) # 打印头信息
r = requests.get(url, headers=header, stream=True)
with open(file_path, "ab") as f:
for chunk in r.iter_content(chunk_size=1024):
if chunk:
temp_size += len(chunk)
f.write(chunk)
现在不知到怎么做突然下载被停止后,数据能写入文件了,所以现在是手动模拟下载断开。
在写入文件中加入了一个判断,当文件下载了5M时停止下载,之后再删掉这段代码,在重新下载。
with open(file_path, "ab") as f:
for chunk in r.iter_content(chunk_size=1024):
if chunk:
temp_size += len(chunk)
f.write(chunk)
if temp_size > 1024 *1024 * 5:
break
第一次下载
第二次下载
来源:https://blog.csdn.net/m0_46778548/article/details/121174049
猜你喜欢
- 使用Python爬虫登录系统之后,能够实现的操作就多了很多,下面大致介绍下如何使用Python模拟登录。我们都知道,在前端的加密验证,只要把
- 如下所示:import h5pyimport numpy as np#HDF5的写入:imgData = np.zeros((2,4))f
- 一、分析网页网站的页面是 JavaScript 渲染而成的,我们所看到的内容都是网页加载后又执行了JavaScript代码之后才呈现出来的,
- 这篇文章主要介绍了Python如何使用Gitlab API实现批量的合并分支,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的
- 本文以YOLOv5-6.1版本为例一、Add1.在common.py后加入如下代码# 结合BiFPN 设置可学习参数 学习不同分支的权重#
- 集合数据类型的添加操作在 “redis-py” 中也是通过 “sadd&
- UPDATE语句的速度更新查询的优化同SELECT查询一样,需要额外的写开销。写速度依赖于更新的数据大小和更新的索引的数量。没有更改的索引不
- 与部门同事做了个小小的交流,话题杂而浅,在此做一个小纪录。1、什么是设计工业设计、环境设计、建筑设计、平面设计、网页设计、服装设计、信息设计
- 文件操作是开发中经常遇到的场景,那么如何判断一个对象是文件对象呢?下面我们总结了3种常见的方法。方法1:比较类型第一种方法,就是判断对象的t
- python2和python3对于字符串的处理有很大的区别熟悉了python2的写法用python3时真的会遇到很多问题啊……区别pytho
- 一、前言刚开始学Python的小伙伴可能会觉得每次写Python打开Cmd或者idle有点烦躁,没有代码补全也没有格式提示等。所以直接上手了
- 元素是文档结构的基础,在CSS中,每个元素生成了一个包含了元素内容的框(box,也译为“盒子”)。但是不同的元素显示的方式会有所不同,例如&
- 鼠标回调函数:def setMouseCallback(windowName, #窗口名称onMouse, &n
- 本文研究的主要是Python处理文本换行符的相关内容,具体如下。源文件每行后面都有回车,所以用下面输出时,中间会多了一行try:  
- 一、相关知识点1.1、SeleniumSelenium是一个强大的开源Web功能测试工具系列,可进行读入测试套件、执行测试和记录测试结果,模
- 目前,各大搜索引擎如google、百度、雅虎已经对动态页面诸如asp,php有着不错的支持了,只要动态页面后面的参数不要太长,如控制在3个参
- 前言Python中,.whl文件是使用wheel格式存储的一种Python安装包,同时也是一个标准的内置包格式。可以将其看作Python库的
- 在官网下载源码包:https://www.php.net/downloads.php步骤:1、解压命令:tar -xjvf php.tar.
- ASP开发网页牢记注意事项 选择自 RAINMAN_NET&
- 本文实例讲述了Golang算法问题之数组按指定规则排序的方法。分享给大家供大家参考,具体如下:给出一个二维数组,请将这个二维数组按第i列(i