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

RangeHTTP 请求头表示服务器应返回的文档部分。可以同时用一个头请求多个部件,服务器可以在多部分文档中发回这些范围。如果服务器发回范围,则使用 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

第一次下载

python 文件下载之断点续传的实现


第二次下载

python 文件下载之断点续传的实现

来源:https://blog.csdn.net/m0_46778548/article/details/121174049

标签:python,断点续传,文件下载
0
投稿

猜你喜欢

  • python面向对象之类的继承详解

    2022-03-20 18:22:22
  • MySQL使用ReplicationConnection导致连接失效解决

    2024-01-19 11:04:26
  • Python phone模块获取手机号归属地 区号 运营商等信息demo

    2023-10-09 10:36:08
  • Pytorch数据读取与预处理该如何实现

    2021-12-23 17:44:35
  • 使用Go HTTP客户端打造高性能服务

    2024-05-05 09:28:29
  • 如何跨浏览器使用连续字符的换行

    2008-07-06 23:10:00
  • Linux oracle数据库自动备份自动压缩脚本代码

    2024-01-19 01:44:40
  • Python通过DOM和SAX方式解析XML的应用实例分享

    2023-10-15 10:46:32
  • 微信小程序之事件交互操作实例分析

    2024-04-19 10:29:54
  • Python数据处理的三个实用技巧分享

    2023-07-01 23:37:13
  • Pandas之groupby( )用法笔记小结

    2023-03-03 15:58:24
  • python字典值排序并取出前n个key值的方法

    2021-08-09 22:16:44
  • 阿里云ECS centos6.8下安装配置MySql5.7的教程

    2024-01-14 23:47:13
  • python实现外卖信息管理系统

    2021-07-16 07:00:26
  • 实例讲解Python脚本成为Windows中运行的exe文件

    2023-07-15 02:14:31
  • 如何使用 Go 和 Excelize 构建电子表格

    2024-02-10 04:59:02
  • Python多线程与多进程相关知识总结

    2021-07-06 21:37:16
  • linux下利用Docker安装mysql的步骤

    2024-01-25 01:17:56
  • PHP获取特殊时间戳的方法整理

    2023-05-25 00:47:36
  • 在ASP.NET页面中如何利用JAVASCRIPT脚本向IFRAMES和POPUP传值

    2007-09-23 13:18:00
  • asp之家 网络编程 m.aspxhome.com