使用Python实现带进度条的异步多文件下载器
摘要
本文详细介绍了如何使用 Python + asyncio + aiohttp + tqdm 实现一个 带进度条的异步多文件下载器。相比传统的同步下载方式,异步下载不仅能够显著提高下载速度,还能在终端显示每个文件的实时下载进度条,适用于大文件、多文件并发下载等场景。文章提供了详细中文注释的完整代码示例,读者可以直接拷贝运行。同时也介绍了核心原理、依赖库、适用场景等内容,非常适合学习 Python 异步 IO 编程的开发者参考。
使用的库说明
- asyncio:Python 内置的异步协程库,用于并发执行任务。
- aiohttp:支持用于异步 HTTP 请求,比 requests 更适合同步下载。
- tqdm:终端显示进度条的工具。
安装依赖:
pip install aiohttp tqdm
异步下载的优势
无需多线程,也能同时下载多个文件
避免同步阻塞,大幅提升下载速度
每个任务都能显示独立进度条
核心思路
使用 aiohttp.ClientSession() 进行异步请求
使用 await response.content.read(1024) 异步读取内容
使用 tqdm 显示进度条
使用 asyncio.gather() 并发执行多个下载任务
适用场景
下载多个大文件(Zip、MP4、模型文件等)
写爬虫批量下载文件
后台批处理任务
分布式下载系统
完整代码
import aiohttp
import asyncio
from tqdm import tqdm
# 异步下载函数
async def download_file(url, destination):
"""
异步下载文件并显示下载进度条
:param url: 文件下载地址
:param destination: 本地保存文件路径
"""
# 创建 aiohttp 会话
async with aiohttp.ClientSession() as session:
# 发送 GET 请求
async with session.get(url) as response:
# 获取文件总大小(如果服务器支持)
total_size = int(response.headers.get("Content-Length", 0))
# 打开本地文件,准备写入下载内容
with open(destination, "wb") as f:
# tqdm 进度条
progress_bar = tqdm(
total=total_size, # 总大小
unit="B", # 单位:字节
unit_scale=True, # 自动转换 KB / MB
desc=f"下载中: {destination}" # 显示的标题
)
# 持续读取数据(每次读取 1024 字节)
while True:
chunk = await response.content.read(1024)
if not chunk: # 读取完毕
break
f.write(chunk)
progress_bar.update(len(chunk)) # 更新进度条
progress_bar.close() # 下载完成后关闭进度条
# 主异步函数
async def main():
"""
批量创建多个下载任务,并异步并发执行
"""
# 要下载的文件列表(可自行扩展)
download_tasks = [
{
"url": "http://example.com/file1.zip",
"destination": "file1.zip"
},
{
"url": "http://example.com/file2.zip",
"destination": "file2.zip"
},
# 可以继续添加更多文件
]
# 为每个任务创建一个 download_file 协程
tasks = [
download_file(task["url"], task["destination"])
for task in download_tasks
]
# 并发执行所有下载任务
await asyncio.gather(*tasks)
# 程序入口
if __name__ == "__main__":
# 运行异步主函数
asyncio.run(main())以上就是使用Python实现带进度条的异步多文件下载器的详细内容,更多关于Python带进度条的文件下载器的资料请关注脚本之家其它相关文章!
相关文章
python multiprocessing多进程变量共享与加锁的实现
这篇文章主要介绍了python multiprocessing多进程变量共享与加锁的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-10-10
Flask与FastAPI对比选择最佳Python Web框架的超详细指南
Flask和FastAPI都是流行的Python Web框架,各有特点,Flask轻量级、灵活,适合小型项目和原型开发但不支持异步操作,FastAPI高性能、支持异步,内置数据验证和自动生成API文档,适合高并发和API开发,需要的朋友可以参考下2025-02-02
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
这篇文章主要给大家介绍了关于python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧2019-04-04
通过Python OpenGL的point sprite技术绘制雪花
通常,点精灵(point sprite)技术被用于描述大量粒子在屏幕上的运动,自然也可以用于绘制雪花。本文将通过Python OpenGL绘制雪花,感兴趣的可以动手试一试2022-02-02


最新评论