网站首页 > 技术文章 正文
点击上方“python学习专栏”,选择“置顶公众号”
干货、福利第一时间送达!
不知道你有没有遇到过这种情况,下载文件过程十分缓慢,缓慢也就算了。关键是马上要下载好的时候,它竟然失败了,还不支持继续下载,
今天我们就来解决这个小问题
先贴代码
import sys
import requests
import os
def download(url, file_path):
# 第一次请求是为了得到文件总大小
response = requests.get(url, stream=True, verify=False)
print(response.status_code)
#加入异常处理,如果异常直接退出
#这里加入异常处理是由于,有时请求数据会不携带 Content-Length,导致无法正常下载数据
#因此一旦出现这种情况,就需要多运行几次了,
# 在我下载github测试时,有时会运行三四次才能够正常下载
try:
total_size = int(response.headers['Content-Length'])
print(response.headers['Content-Length'])
except Exception as e:
print(e)
quit()
# 获取本地下载大小
if os.path.exists(file_path):
temp_size = os.path.getsize(file_path) # 本地已经下载的文件大小
else:
temp_size = 0
# 这里是关键部分
headers = {'Range': 'bytes=%d-' % temp_size}
# 重新请求网址,加入新的请求头的
res = requests.get(url, stream=True, verify=False, headers=headers)
res.headers
# 追加形式写入文件
with open(file_path, "ab") as f:
for chunk in res.iter_content(chunk_size=100):
if chunk:
temp_size += len(chunk)
f.write(chunk)
f.flush()
#实现进度显示
done = int(50 * temp_size / total_size)
sys.stdout.write("\r[%s%s] %d%%" % ('█' * done, ' ' * (50 - done), 100 * temp_size / total_size))
sys.stdout.flush()
print()
if __name__ == '__main__':
url ="https://codeload.github.com/zylo117/Yet-Another-EfficientDet-Pytorch/zip/master"
path = "G:/123.zip"
download(url, path)
HTTP中的Range就是分段请求字节数,也是大家经常说的断点续传。Range头域可以请求实体的一个或者多个子范围,Range的值为0表示第一个字节,也就是Range计算字节数是从0开始的
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999
从头开始下载 Range: bytes=0-
这是http文件下载的一种规范,当然也有不支持这种规范的网站,对于不支持的网站一般也是有它规定的参数的,那就需要你自己动手动脑了
比如说,我现在在写的项目就没有支持
这里下载的是github的一个目标检测的项目
效果如下,这里没有进行录屏,大家可以自己尝试一下
我们使用debug模式看一下response headers 都有什么
先看一下本地变量,全部是大小6674159字节,当前已经下载了1877700 字节
这个图是我通过手机拍摄的,有点模糊,但是大概能看到
看到content-range 187770-6674158,请求数据的范围,下面就可以直接下载了。
下载完成,解压看一下,文件是否一致
和我通过浏览器直接下载的一样
猜你喜欢
- 2024-10-01 利用神经网络模型检测摄像头上的可疑行为
- 2024-10-01 使用神经网络的自动化特征工程(神经网络的特点及使用场景)
- 2024-10-01 Python基础学习必备的8个最常用的内置函数
- 2024-10-01 利用Click和argparse给你Python程序构建一个优雅的命令行界面
- 2024-10-01 langchain中的LLM模型使用介绍(llvm 分析)
- 2024-10-01 学习Python内置函数(range)来打印数学乘法表
- 2024-10-01 Python 100天 15:print("hello world")茴香豆的写法
- 2024-10-01 python3入门实例一:Hello World(python的hello world程序编写)
- 2024-10-01 python基础篇:讲讲python的内置函数一
- 2024-10-01 Python3中的print函数(python里的print函数)
- 1519℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 608℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 522℃MySQL service启动脚本浅析(r12笔记第59天)
- 490℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 489℃启用MySQL查询缓存(mysql8.0查询缓存)
- 477℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 457℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 454℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)