使用Python實現(xiàn)帶進度條的異步多文件下載器
摘要
本文詳細介紹了如何使用 Python + asyncio + aiohttp + tqdm 實現(xiàn)一個 帶進度條的異步多文件下載器。相比傳統(tǒng)的同步下載方式,異步下載不僅能夠顯著提高下載速度,還能在終端顯示每個文件的實時下載進度條,適用于大文件、多文件并發(fā)下載等場景。文章提供了詳細中文注釋的完整代碼示例,讀者可以直接拷貝運行。同時也介紹了核心原理、依賴庫、適用場景等內(nèi)容,非常適合學習 Python 異步 IO 編程的開發(fā)者參考。
使用的庫說明
- asyncio:Python 內(nèi)置的異步協(xié)程庫,用于并發(fā)執(zhí)行任務。
- aiohttp:支持用于異步 HTTP 請求,比 requests 更適合同步下載。
- tqdm:終端顯示進度條的工具。
安裝依賴:
pip install aiohttp tqdm
異步下載的優(yōu)勢
無需多線程,也能同時下載多個文件
避免同步阻塞,大幅提升下載速度
每個任務都能顯示獨立進度條
核心思路
使用 aiohttp.ClientSession() 進行異步請求
使用 await response.content.read(1024) 異步讀取內(nèi)容
使用 tqdm 顯示進度條
使用 asyncio.gather() 并發(fā)執(zhí)行多個下載任務
適用場景
下載多個大文件(Zip、MP4、模型文件等)
寫爬蟲批量下載文件
后臺批處理任務
分布式下載系統(tǒng)
完整代碼
import aiohttp
import asyncio
from tqdm import tqdm
# 異步下載函數(shù)
async def download_file(url, destination):
"""
異步下載文件并顯示下載進度條
:param url: 文件下載地址
:param destination: 本地保存文件路徑
"""
# 創(chuàng)建 aiohttp 會話
async with aiohttp.ClientSession() as session:
# 發(fā)送 GET 請求
async with session.get(url) as response:
# 獲取文件總大?。ㄈ绻掌髦С郑?
total_size = int(response.headers.get("Content-Length", 0))
# 打開本地文件,準備寫入下載內(nèi)容
with open(destination, "wb") as f:
# tqdm 進度條
progress_bar = tqdm(
total=total_size, # 總大小
unit="B", # 單位:字節(jié)
unit_scale=True, # 自動轉(zhuǎn)換 KB / MB
desc=f"下載中: {destination}" # 顯示的標題
)
# 持續(xù)讀取數(shù)據(jù)(每次讀取 1024 字節(jié))
while True:
chunk = await response.content.read(1024)
if not chunk: # 讀取完畢
break
f.write(chunk)
progress_bar.update(len(chunk)) # 更新進度條
progress_bar.close() # 下載完成后關閉進度條
# 主異步函數(shù)
async def main():
"""
批量創(chuàng)建多個下載任務,并異步并發(fā)執(zhí)行
"""
# 要下載的文件列表(可自行擴展)
download_tasks = [
{
"url": "http://example.com/file1.zip",
"destination": "file1.zip"
},
{
"url": "http://example.com/file2.zip",
"destination": "file2.zip"
},
# 可以繼續(xù)添加更多文件
]
# 為每個任務創(chuàng)建一個 download_file 協(xié)程
tasks = [
download_file(task["url"], task["destination"])
for task in download_tasks
]
# 并發(fā)執(zhí)行所有下載任務
await asyncio.gather(*tasks)
# 程序入口
if __name__ == "__main__":
# 運行異步主函數(shù)
asyncio.run(main())以上就是使用Python實現(xiàn)帶進度條的異步多文件下載器的詳細內(nèi)容,更多關于Python帶進度條的文件下載器的資料請關注腳本之家其它相關文章!
相關文章
python multiprocessing多進程變量共享與加鎖的實現(xiàn)
這篇文章主要介紹了python multiprocessing多進程變量共享與加鎖的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10
基于Mediapipe+Opencv實現(xiàn)手勢檢測功能
mediaPipe,他就是一個集成好的包括人臉關鍵位點識別、身體關鍵位點識別、手部關鍵位點識別的一個包或者庫,直接調(diào)用就能夠得到它的關鍵位點信息,本文給大家介紹Mediapipe+Opencv實現(xiàn)手勢檢測功能,感興趣的朋友一起看看吧2022-01-01
Flask與FastAPI對比選擇最佳Python?Web框架的超詳細指南
Flask和FastAPI都是流行的Python?Web框架,各有特點,Flask輕量級、靈活,適合小型項目和原型開發(fā)但不支持異步操作,FastAPI高性能、支持異步,內(nèi)置數(shù)據(jù)驗證和自動生成API文檔,適合高并發(fā)和API開發(fā),需要的朋友可以參考下2025-02-02
python使用BeautifulSoup與正則表達式爬取時光網(wǎng)不同地區(qū)top100電影并對比
這篇文章主要給大家介紹了關于python使用BeautifulSoup與正則表達式爬取時光網(wǎng)不同地區(qū)top100電影并對比的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-04-04
通過Python OpenGL的point sprite技術繪制雪花
通常,點精靈(point sprite)技術被用于描述大量粒子在屏幕上的運動,自然也可以用于繪制雪花。本文將通過Python OpenGL繪制雪花,感興趣的可以動手試一試2022-02-02

