news 2026/9/26 4:03:17

Python 自制文件下载器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 自制文件下载器

1. 项目概述

当你文件下载很慢时,如何不用别的工具,自己用趁手的工具自行搭建一个用 Python 编写一个功能完整的文件下载器。

2. 环境准备

本项目基于 Python 3.8 及以上版本开发,无需安装任何第三方依赖。建议使用虚拟环境隔离项目,避免污染全局环境。

3.全部代码

import requests import time def download_with_speed_retry(url: str, save_path, chunk_size=8192, max_retry=5): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } retry = 0 downloaded = 0 total_size = 0 start_time = time.time() last_print_time = start_time last_downloaded = 0 # 如果文件已存在,读取已有大小,准备断点续传 try: with open(save_path,"rb") as f: downloaded = f.seek(0,2) except FileNotFoundError: downloaded = 0 while retry < max_retry: try: hdr = headers.copy() if downloaded > 0: hdr["Range"] = f"bytes={downloaded}-" resp = requests.get(url, stream=True, headers=hdr, timeout=30) if resp.status_code == 206: pass elif resp.status_code == 200 and downloaded == 0: total_size = int(resp.headers.get("content-length", 0)) else: raise Exception("不支持断点续传") print(f"总大小: {total_size/1024/1024:.2f} MB\n") # ab 追加写入 with open(save_path, "ab") as f: for chunk in resp.iter_content(chunk_size=chunk_size): if not chunk: continue f.write(chunk) downloaded += len(chunk) now = time.time() delta_t = now - last_print_time if delta_t >=0.5: delta_bytes = downloaded - last_downloaded speed_kbs = delta_bytes / delta_t /1024 progress = (downloaded / total_size *100) if total_size else 0 elapsed = now - start_time avg_kbs = downloaded / elapsed /1024 # 剩余时间计算 remain_bytes = total_size - downloaded if avg_kbs > 0: remain_sec = remain_bytes / (avg_kbs * 1024) else: remain_sec = 0 m, s = divmod(remain_sec, 60) h, m = divmod(m, 60) eta = f"{int(h):02d}:{int(m):02d}:{int(s):02d}" print(f"\r进度:{progress:5.2f}% | 当前:{speed_kbs:6.2f} KB/s | 平均:{avg_kbs:6.2f} KB/s | 预计剩余:{eta}", end="") last_print_time = now last_downloaded = downloaded print("\n下载完成") return except Exception as e: retry +=1 print(f"\n连接异常 {e}, 重试 {retry}/{max_retry}") time.sleep(2) print("超过最大重试次数,终止") if __name__ == "__main__": DOWNLOAD_URL = "下载网页路径,必须是以exe文件结尾" SAVE_FILE = "setup.exe" # 可以改成其他的名字。 download_with_speed_retry(DOWNLOAD_URL, SAVE_FILE)

4. 总结

可以在此基础上继续扩展,比如加入图形界面、支持 FTP 协议、实现下载队列管理等,让工具更加完善。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 4:02:58

一人公司如何用WorkBuddy搭建自动化工作流:Skill与Agent实战指南

1. 一人公司的效率困局与 WorkBuddy 的破局思路一个人干一家公司的活&#xff0c;最怕的不是没活干&#xff0c;而是活太杂。早上写文案&#xff0c;中午剪视频&#xff0c;下午回客户消息&#xff0c;晚上还要整理数据报表&#xff0c;中间穿插着发票、合同、选题、排期。每切…

作者头像 李华
网站建设 2026/9/26 4:02:48

Spring Boot避坑指南:版本兼容、配置与Bean注入排查全解析

Spring Boot这套东西&#xff0c;上手是真的快&#xff0c;十分钟就能跑起来一个接口&#xff0c;但真要说把它用顺了&#xff0c;坑是一点儿都不少。我这些年帮人排查问题&#xff0c;发现十个报错里至少有六个是版本不匹配、配置缩进错误、Bean注入失败这类基础问题&#xff…

作者头像 李华
网站建设 2026/9/26 4:01:25

智慧车站系统建设方案:三层架构与5G专网落地指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华