python库requests文件、视频多线程池分块下载

一、分块下载

特点:可以实现断点续下

import os
import requests
def download_file_with_resume(url, dest_path, chunk_size):# 获取文件的总大小response = requests.head(url)total_size = int(response.headers.get('content-length', 0))# 检查文件是否已部分下载downloaded_size = 0if os.path.exists(dest_path):downloaded_size = os.path.getsize(dest_path)with open(dest_path, 'ab') as f:# 从上次下载的位置继续下载for start in range(downloaded_size, total_size, chunk_size):end = min(start + chunk_size - 1, total_size - 1)headers = {'Range': f'bytes={start}-{end}'}part_response = requests.get(url, headers=headers, stream=True)total_size = int(part_response.headers.get('content-length', 0))print("total_size:",total_size)if part_response.status_code == 206 or part_response.status_code == 200:f.write(part_response.content)else:raise Exception(f"Failed to download chunk: {part_response.status_code}")print(f"Download completed: {dest_path}")# 示例用法
url = 'https://xxxx.com//video.mp4'
dest_path = 'abc.mp4'
chunk_size = 1024*1024*1    # 1MB
download_file_with_resume(url, dest_path,chunk_size)

二、线程池分块下载(大幅提高下载速度)

特点:下载速度快,1GB几十秒内下完

import os
import requests
import math
import threadpool
import time
import shutil
class BlockDownload:def __init__(self):self.error_try = 5    # 请求下载错误重试次数self.wait_time = 3   # 请求下载错误等待时间self.proxies = {'http':'127.0.0.1:7890','https':'127.0.0.1:7890'}self.timeout = 6def download_chunk(self,url, start_byte, end_byte,chunk_num, output_file_path):"""下载文件的一个块并保存到临时文件。"""headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/547.34 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/547.34','Range':f'bytes={start_byte}-{end_byte}'}for i in range(self.error_try):try:response = requests.get(url, headers=headers,timeout=self.timeout,proxies=self.proxies,stream=True)if response.status_code == 206 or response.status_code == 200:with open(f'{output_file_path}.part{chunk_num}', 'wb') as file:file.write(response.content)print(f"块 {chunk_num} 下载完成。")returnelse:print(f"块 {chunk_num} 下载失败,状态码: {response.status_code}")continueexcept Exception as e:print(f"块 {chunk_num} 下载错误,{i} 次重试!",e)time.sleep(self.wait_time)continueprint(f"块 {chunk_num} 下载失败,程序结束!")exit(0)def merge_chunks(self,output_file_path, num_chunks):"""合并所有下载的块到最终文件。"""with open(output_file_path, 'wb') as output_file:for i in range(num_chunks):temp_file_path = f'{output_file_path}.part{i}'with open(temp_file_path, 'rb') as temp_file:shutil.copyfileobj(temp_file,output_file)os.remove(temp_file_path)print(f"所有块已合并为: {output_file_path}")def get_optimal_chunk_size(slef,total_size):"""获取最佳分块大小"""if total_size < 64 * 1024 * 1024:  # 小于64MBreturn 1 * 1024 * 1024  # 1MBelif total_size < 512 * 1024 * 1024:  # 小于512MBreturn 2 * 1024 * 1024  # 2MBelif total_size < 1024 * 1024 * 1024:  # 小于1024MBreturn 4 * 1024 * 1024  # 4MBelse:return 8 * 1024 * 1024  # 8MBdef thread_start(self,url,file_path,thread_num):headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/547.34 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/547.34'}response = requests.head(url,headers=headers,timeout=self.timeout,proxies=self.proxies)total_size = int(response.headers.get('content-length', 0))if not total_size:response = requests.head(response.headers.get('Location', url), headers=headers, timeout=self.timeout, proxies=self.proxies)total_size = int(response.headers.get('content-length', 0))if not total_size:print(f"视频大小为:{total_size}")returnprint(f"文件总大小:{total_size},开始下载...")chunk_size = self.get_optimal_chunk_size(total_size)block_num = math.ceil(total_size / chunk_size)  # 总分块数arguments_list = []  # 创建存放任务参数列表for i in range(block_num):start_byte = i * chunk_sizeend_byte = start_byte + chunk_size - 1if i == block_num - 1:end_byte = total_size - 1  # 最后一个块可能会包含剩余的所有字节arguments_list.append(([url, start_byte, end_byte, i, file_path], None))pool = threadpool.ThreadPool(thread_num)  # 创建线程tasks_list = threadpool.makeRequests(self.download_chunk, arguments_list)  # 按照参数列表长度创建任务列表for task in tasks_list:pool.putRequest(task)  # 将要执行的任务放入线程池pool.wait()self.merge_chunks(file_path, block_num)def run(self):download_url = 'https://xxxx.com/video.mp4'file_path = r'D:\Video\xxx.mp4'thread_num = 32  # 线程数,最好根据视频大小、带宽设置self.thread_start(download_url,file_path,thread_num)if __name__ == '__main__':bd = BlockDownload()bd.run()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1489377.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

中国医疗AI领头羊讯飞医疗:最新招股书显示前三月收入破亿大关!

讯飞医疗&#xff0c;医疗AI创新企业&#xff0c;收入领先市场。计划港交所上市&#xff0c;用于研发升级、产品扩展及并购。市场潜力巨大&#xff0c;未来发展可期&#xff0c;将成医疗AI璀璨明星。 各位看官&#xff0c;最近科技圈儿又有大新闻啦&#xff01;讯飞医疗科技股份…

【Git】不同区域撤销代码{reset、revert}

工作区【磁盘】 关于GIt&#xff0c;当你在工作区也就是硬盘中修改文件内容&#xff0c;也就是下图的状态。 若你需要撤销此次修改&#xff0c;用到的命令就是 git checkout <changed_file> git restore <changed_file> #推荐 因为checkout在分支中也是切换分…

浅析JWT原理及牛客出现过的相关面试题

原文链接&#xff1a;https://kixuan.github.io/posts/f568/ 对jwt总是一知半解&#xff0c;而且项目打算写个关于JWT登录的点&#xff0c;所以总结关于JWT的知识及网上面试考察过的点 参考资料&#xff1a; Cookie、Session、Token、JWT_通俗地讲就是验证当前用户的身份,证明-…

关键词查找【Boyer-Moore 算法】

1、【Boyer-Moore 算法】 【算法】哪种算法有分数复杂度&#xff1f;- BoyerMoore字符串匹配_哔哩哔哩_bilibili BM算法的精华就在于BM(text, pattern),也就是BM算法当不匹配的时候一次性可以跳过不止一个字符。即它不需要对被搜索的字符串中的字符进行逐一比较&#xff0c;而…

JavaDS —— 排序

排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&a…

1858. 数组查找及替换

问题描述 给定某整数数组和某一整数 b 。 要求删除数组中可以被 b 整除的所有元素&#xff0c;同时将该数组各元素按从小到大排序。如果数组元素数值在 &#x1d434;‘ 到 Z 的 ASCII 之间&#xff0c;替换为对应字母。 元素个数不超过 100&#xff0c;&#x1d44f; 在 1 …

浅谈HOST,DNS与CDN

首先这个是网络安全的基础&#xff0c;需得牢牢掌握。 1.什么是HOST HOSTS文件&#xff1a; 定义&#xff1a; HOSTS文件是一个操作系统级别的文本文件&#xff0c;通常位于操作系统的系统目录中&#xff08;如Windows系统下的C:\Windows\System32\drivers\etc\hosts&#xf…

Redis底层数据结构的实现

文章目录 1、Redis数据结构1.1 动态字符串1.2 intset1.3 Dict1.4 ZipList1.5 ZipList的连锁更新问题1.6 QuickList1.7 SkipList1.8 RedisObject 2、五种数据类型2.1 String2.2 List2.3 Set2.4 ZSET2.5 Hash 1、Redis数据结构 1.1 动态字符串 Redis中保存的Key是字符串&#xf…

《通讯世界》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《通讯世界》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。 问&#xff1a;《通讯世界》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;科学技术部 主办单位&#xff1a;中国科学技…

chrome浏览器驱动(所有版本)

chrome浏览器驱动 114之前版本 https://chromedriver.storage.googleapis.com/index.html 125以后 125以后版本下载链接在此&#xff0c;只有后面status是绿色对勾的才可以下载&#xff0c;驱动大版本一致就可以使用&#xff0c;不需版本号一模一样&#xff1b;下载所需版本只…

安装CUDA Cudnn Pytorch(GPU版本)步骤

一.先看自己的电脑NVIDIA 支持CUDA版本是多少&#xff1f; 1.打开NVIDIA控制面板 2.点击帮助---系统信息--组件 我的支持CUDA11.6 二.再看支持Pytorch的CUDA版本 三.打开CUDA官网 下载CUDA 11.6 下载好后&#xff0c;安装 选择 自定义 然后安装位置 &#xff08;先去F盘…

一天搞定React(5)——ReactRouter(下)【已完结】

Hello&#xff01;大家好&#xff0c;今天带来的是React前端JS库的学习&#xff0c;课程来自黑马的往期课程&#xff0c;具体连接地址我也没有找到&#xff0c;大家可以广搜巡查一下&#xff0c;但是总体来说&#xff0c;这套课程教学质量非常高&#xff0c;每个知识点都有一个…

C++ 基础练习 - Chapter 7 (英文版)

Review Questions: 7.1 What is operator overloading? Answer: The mechanism of giving special meaning to an operator is known as operator overloading. 7.2 Why is it necessary to overloading an operator? Answer: We can almost create a new language of …

33.【C语言】实践扫雷游戏

预备知识&#xff1a; 第13篇 一维数组 第13.5篇 二维数组 第28篇 库函数 第29篇 自定义函数 第30篇 函数补充 0x1游戏的运行&#xff1a; 1.随机布置雷 2.排雷 基本规则&#xff1a; 点开一个格子后&#xff0c;显示1&#xff0c;对于9*9&#xff0c;代表以1为中心的去…

UDP网口(3)逻辑组包(下)

文章目录 1.ARP应答验证2.UDP实现思路3.UDP接收验证4.UDP发送验证5.总结与思考6.传送门 1.ARP应答验证 创建一个ARP应答工程&#xff0c;当PC发出ARP请求的时候&#xff0c;手动按下板卡指定按键&#xff0c;将会响应ARP应答。以此验证phy芯片的配置正常&#xff0c;硬件链路正…

【Emacs有什么优点,用Emacs写程序真的比IDE更方便吗?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

mfc100u.dll 文件缺失?两种方法快速修复丢失mfc100u.dll 文件难题

您的电脑是否遭遇了 mfc100u.dll 文件缺失的问题&#xff1f;这种情况通常由多种原因引起。在本文中&#xff0c;我们将介绍两种修复 mfc100u.dll 文件丢失问题的策略——一种是手动方法&#xff0c;另一种是自动修复的使用。我们将探讨如何有效地解决 mfc100u.dll 文件缺失的几…

CAS算法

CAS算法 1. CAS简介 CAS叫做CompareAndSwap&#xff0c;比较并交换&#xff0c;主要是通过处理器的指令来保证操作的原子性。 CAS基本概念 内存位置 (V)&#xff1a;需要进行CAS操作的内存地址。预期原值 (A)&#xff1a;期望该内存位置上的旧值。新值 (B)&#xff1a;如果旧…

Prometheus各类监控及监控指标和告警规则

目录 linux docker监控 linux 系统进程监控 linux 系统os监控 windows 系统os监控 配置文件&告警规则 Prometheus配置文件 node_alert.rules docker_container.rules mysql_alert.rules vmware.rules Alertmanager告警规则 consoul注册服务 Dashboard JSON…

(8) ubuntu ROS 安装

文章目录 安装流程1. 进入ros官网2. 根据自己ubuntu系统选择版本&#xff08;我是20.04的ubuntu&#xff09;3.根据流程开始安装3.1 设置sources.list 4.验证ros5.安装rosdep 安装流程 1. 进入ros官网 https://www.ros.org/ 2. 根据自己ubuntu系统选择版本&#xff08;我是2…