【Python 爬虫实战】一键批量下载 Python 官网 FTP 所有版本全部文件(多线程 + 断点续传 + 禁用系统代理 完整版)

一、需求背景 & 痛点说明

相信很多小伙伴都有这样的需求:需要从 Python 官方 FTP 站点下载 Python 的历史版本文件,但是官方的文件是按版本号分目录存放的,每个版本里包含 tar.gz、dmg、msi、exe、zip 等所有格式的文件,如果手动点击下载,不仅效率极低,还容易漏下、重复下载,非常繁琐。

本次分享的爬虫脚本,完美解决以上痛点:✅ 无需手动复制任何下载链接✅ 自动爬取 Python 官网 FTP 的所有版本目录 + 每个版本下的全部文件 ✅ 支持多线程并发下载 ,下载速度拉满✅ 支持断点续传 ,网络中断后重新运行即可继续下载,无需从头再来✅ 禁用系统代理,解决因代理配置导致的下载失败 / 超时问题✅ 自动创建版本目录,文件按版本号分类存储,本地目录整洁有序✅ 失败自动重试 + 完整异常捕获,稳定性拉满

脚本无文件格式限制,下载每个版本里的所有文件,一个不落!

!!!如果大家仅仅想要下载某一个python版本的链接,但是下载很慢的,博主把安装包全部下载好了,可以去我搭建的Ai智能体问它拿。直接问它需要哪个版本的就行了,我也是为了方便自己试用才搭建的。

这里不是卖广告,只是为了方便各大网友没有科学下载慢而方便大家下载。下面是我搭建的Ai智能体链接,不喜勿喷,仅仅为了方便大家。

https://mbd.baidu.com/ma/s/wg6dXzIA

二、核心功能亮点(必看)

本次分享的脚本是最终优化完整版,对比普通下载脚本,核心优势如下:

  1. ✔️ 全量下载:爬取https://www.python.org/ftp/python/下所有 Python 版本,下载每个版本目录中的全部文件,无格式过滤、无文件过滤
  2. ✔️ 全局Session请求:复用 TCP 连接,大幅提升请求效率,降低服务器压力
  3. ✔️ 强制禁用系统代理:解决 90% 的「下载超时 / 连接失败」问题,这是最关键的优化点!
  4. ✔️ 断点续传:未下载完成的文件会生成 .part 临时文件,重新运行自动续传,避免重复下载
  5. ✔️ 多线程并发:自定义线程数,并行下载多个文件,效率翻倍
  6. ✔️ 失败自动重试:网络波动导致的下载失败,自动重试指定次数,无需人工干预
  7. ✔️ 自动建目录:本地按「Python 版本号」自动创建文件夹,所有文件归类存储,整洁有序
  8. ✔️ 完整异常捕获:爬取失败、解析失败、下载失败均有详细日志 + 堆栈信息,便于排查问题
  9. ✔️ 跳过已下载文件:已下载完成的文件,再次运行脚本会自动跳过,节省时间和带宽

三、环境准备(极简,仅 2 个依赖)

该脚本基于 Python3 编写,无复杂依赖,只需要安装两个基础库即可,Python3.6 及以上版本均可运行,Win/Linux/Mac 全平台兼容。

科学环境自己配置,如科学环境有困难,可以私博主

执行下方 pip 命令安装依赖:

bash

运行

复制代码
pip install requests beautifulsoup4
  • requests:用于发送 HTTP 请求,爬取页面和下载文件
  • beautifulsoup4:用于解析网页 HTML,提取版本目录和文件链接

四、完整可运行代码(直接复制即用,无需修改)

✨ 重点说明:以下是最终完整版代码 ,就是博主自用的版本,所有优化点全部集成,直接复制保存为 .py 文件即可运行,无需做任何修改!

部分源码

python 复制代码
import os
import requests
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor
from urllib.parse import urljoin
import traceback

# -------------------------- 配置参数(按需修改,新手建议默认即可)--------------------------
BASE_URL = "https://www.python.org/ftp/python/"  # Python FTP官方主地址,固定不变
SAVE_DIR = "./Python_All_Files"                  # 本地文件保存根目录,可修改路径
THREAD_NUM = 5                                   # 并发下载线程数,建议5-10,太多易触发限流
RETRY_TIMES = 3                                  # 下载失败自动重试次数
TIMEOUT = 30                                     # 单次请求超时时间(秒)
# ------------------------------------------------------------------------------------------

# 创建全局session对象,复用连接提升效率 + 强制禁用系统代理(核心优化!)
session = requests.Session()
session.trust_env = False  # 关键配置:彻底忽略系统的代理环境变量,解决代理导致的下载失败

# 初始化:创建本地保存根目录,不存在则自动创建
os.makedirs(SAVE_DIR, exist_ok=True)

def get_all_version_dirs():
    """核心函数1:爬取Python FTP主站下的所有版本目录链接(如3.11.9/ 3.12.7/)"""
    version_dirs = []
    try:
        # 发送请求获取主页面内容
        #******部分源码
        return []

def download_file(version_name, file_name, file_url):
    """核心函数3:单文件下载(支持断点续传 + 失败重试)"""
    # 为每个版本创建独立的保存目录
    version_save_dir = os.path.join(SAVE_DIR, version_name)
    #******部分源码
    return False

def main():
    """主函数:串联所有流程,启动多线程下载"""
    # 1. 获取所有Python版本目录
    version_dirs = get_all_version_dirs()
    if not version_dirs:
        print("❌ 未获取到任何版本目录,程序退出!")
        return

    # 2. 多线程执行下载任务
    success_count = 0
    fail_count = 0
    with ThreadPoolExecutor(max_workers=THREAD_NUM) as executor:
        # 提交所有下载任务到线程池
        tasks = []
        for version_name, version_url in version_dirs:
            target_files = filter_all_files(version_name, version_url)
            for file_name, file_url in target_files:
                task = executor.submit(download_file, version_name, file_name, file_url)
                tasks.append((version_name, file_name, task))
        
        # 统计所有任务的执行结果
        for version_name, file_name, task in tasks:
            if task.result():
                success_count += 1
            else:
                fail_count += 1

    # 打印最终下载统计信息
    print("\n" + "=" * 60)
    print(f"📊 本次下载任务全部完成!")
    print(f"✅ 成功下载文件数:{success_count}")
    print(f"❌ 下载失败文件数:{fail_count}")
    print(f"📁 所有文件保存路径:{os.path.abspath(SAVE_DIR)}")
    print("=" * 60)

# 程序入口
if __name__ == "__main__":
    main()

完整源码:

https://gitee.com/suwenyun/python_req.git

运行

五、代码核心优化点 & 关键细节详解(重中之重)

很多小伙伴下载别人的脚本会遇到各种问题,核心原因是没看懂关键优化点,这里把本脚本的核心细节和优化逻辑全部讲清楚,帮你彻底理解代码,遇到问题也能自行解决。

✅ 优化点 1:全局 Session + 禁用系统代理 session.trust_env = False

这是本脚本最核心的优化,解决了 90% 的「下载超时 / 连接失败 / 访问被拒绝」问题!

  • requests.Session():创建全局会话对象,所有请求复用同一个 TCP 连接,避免重复建立连接的开销,大幅提升爬取和下载效率。
  • session.trust_env = False强制禁用系统代理 !很多小伙伴的电脑配置了全局代理、VPN、梯子等,requests 会默认读取系统代理配置,导致请求 Python 官方 FTP 时走代理,进而触发连接超时 / 拒绝访问。这一行代码可以让 requests彻底忽略系统代理,直接直连服务器,完美解决代理导致的所有问题。

✅ 优化点 2:断点续传的实现原理

断点续传是下载大文件的必备功能,本脚本的实现逻辑非常经典:

  1. 未下载完成的文件,会以 .part 为后缀保存为临时文件
  2. 重新运行脚本时,会先检测是否存在该临时文件,如果存在,就读取文件大小作为「已下载字节数」
  3. 通过请求头 headers={"Range": f"bytes={downloaded_size}-"} 告诉服务器:从该字节位置开始继续下载,而不是从头开始
  4. 下载完成后,将 .part 临时文件重命名为正式文件,完成下载

✅ 优化点 3:流式下载 stream=True

下载文件时使用 stream=True,表示流式下载,不会一次性将文件全部加载到内存中,而是分块读取、分块写入。

  • 优点:即使下载几个 GB 的大文件,也不会占用过多内存,避免程序因内存溢出崩溃
  • 分块大小设置为 1024*1024(1MB),是平衡下载速度和内存占用的最优值

✅ 优化点 4:多线程并发下载

使用 concurrent.futures.ThreadPoolExecutor 实现多线程并发,核心优势:

  • 网络请求(下载文件)属于「IO 密集型任务」,多线程可以大幅提升效率,同时下载多个文件,节省时间
  • 线程数建议设置为 5-10,不是越多越好:线程数过多会导致请求频率过高,触发服务器的限流机制,反而会导致下载失败 / 超时

✅ 优化点 5:自动重试机制 + 完整异常捕获

脚本中对所有网络请求和文件操作都做了异常捕获,同时下载失败时会自动重试指定次数:

  • 爬取版本目录失败、解析文件链接失败、下载文件失败,都会打印详细的错误信息和堆栈跟踪,便于排查问题
  • 下载文件时,最多重试 RETRY_TIMES 次,解决因网络波动导致的偶发性下载失败问题

✅ 优化点 6:全量文件筛选规则

本脚本的筛选规则是:下载每个版本下的所有文件,无任何格式限制

python

运行

复制代码
if not file_name.endswith("/") and not file_name.startswith("../") and file_name:

该规则只会过滤掉「目录链接」「上级目录链接」「空链接」,其余所有文件都会被下载,完美满足「下载每个版本里所有文件」的需求。

六、关键配置参数说明(按需修改,新手建议默认)

脚本顶部的配置参数可以根据自己的需求修改,所有参数都有详细注释,修改规则如下:

参数名 作用 推荐值 修改建议
BASE_URL Python FTP 官方主地址 固定值,无需修改 绝对不要改,改了会爬取不到数据
SAVE_DIR 本地文件保存根目录 ./Python_All_Files 可修改为任意路径,如 D:/Python_Files
THREAD_NUM 并发下载线程数 5-10 网速快可以适当调高,建议不超过 10
RETRY_TIMES 下载失败重试次数 3 网络不稳定可以调高到 5
TIMEOUT 单次请求超时时间 30 秒 网络慢可以调高到 60 秒

七、运行效果展示

✅ 运行方式

  1. 将上述代码保存为 python_download_all.py 文件
  2. 打开命令行 / 终端,切换到该文件所在目录
  3. 执行命令:python python_download_all.py
  4. 等待程序运行即可,全程无需任何手动操作!

✅ 运行日志示例

本地文件目录结构

脚本会自动按「Python 版本号」创建文件夹,所有文件归类存储,目录结构非常整洁:

八、常见问题及解决方案(避坑指南,必看)

❓ 问题 1:运行脚本提示 ModuleNotFoundError: No module named 'requests'

✅ 解决方案:执行 pip install requests beautifulsoup4 安装依赖库即可。

❓ 问题 2:爬取成功,但下载时一直提示「超时 / 连接失败」

✅ 解决方案:

  1. 确认是否配置了系统代理 / VPN,本脚本已禁用代理,无需额外操作
  2. 适当调高 TIMEOUT 超时时间(如改为 60)和 RETRY_TIMES 重试次数(如改为 5)
  3. 降低线程数 THREAD_NUM(如改为 3),减少请求频率

❓ 问题 3:下载的文件大小为 0KB / 损坏

✅ 解决方案:删除该文件和对应的 .part 临时文件,重新运行脚本即可自动重新下载。

❓ 问题 4:提示「磁盘空间不足」

✅ 解决方案:Python 所有版本的全部文件总大小约 50~80GB ,请确保目标磁盘有足够的存储空间,可修改 SAVE_DIR 切换到空间充足的磁盘。

❓ 问题 5:程序运行中被中断,再次运行会重复下载吗?

✅ 不会!脚本支持断点续传和跳过已下载文件,重新运行会自动继续未完成的下载,已下载的文件会直接跳过。

九、拓展功能(可选,按需修改,超实用)

本脚本是完整版,满足绝大多数需求,如果你有个性化需求,可以基于本脚本做简单修改,以下是几个常用的拓展功能,直接复制修改即可

✨ 拓展 1:只下载指定版本(如只下载 3.10 及以上版本)

main() 函数中,获取版本目录后添加筛选逻辑即可:

python

运行

复制代码
# 获取所有版本目录后,添加筛选
version_dirs = get_all_version_dirs()
# 只下载3.10、3.11、3.12版本
version_dirs = [v for v in version_dirs if v[0].startswith("3.10") or v[0].startswith("3.11") or v[0].startswith("3.12")]

✨ 拓展 2:修改分块下载大小(如改为 2MB,提升下载速度)

将下载函数中的分块大小修改即可:

python

运行

复制代码
# 原代码
for chunk in response.iter_content(chunk_size=1024 * 1024):
# 修改为2MB
for chunk in response.iter_content(chunk_size=2048 * 1024):

✨ 拓展 3:关闭下载进度打印(提升下载速度)

下载进度打印会消耗少量性能,如需极致速度,可注释掉进度打印代码:

python

运行

复制代码
# 注释掉这一行即可
# print(f"📥 下载中:{version_name}/{file_name} - {progress:.1f}%")

十、总结

本次分享的 Python 爬虫脚本,是针对「Python 官网 FTP 全量文件下载」的终极解决方案,脚本集成了「多线程、断点续传、禁用代理、自动重试、异常捕获」等所有核心功能,无需手动操作,一键即可下载 Python 所有历史版本的全部文件。

脚本的核心优势:稳定、高效、无坑、易修改,不仅能满足本次的下载需求,还能作为爬虫实战的学习案例,学习「断点续传」「多线程」「requests 高级用法」等知识点。

希望本次分享能帮到大家,如果你有其他个性化需求(如过滤指定格式、下载指定版本),可以在评论区留言,我会及时补充修改方案!


最后

创作不易,如果本教程对你有帮助,欢迎点赞 + 收藏 + 关注,你的支持是我持续分享的动力!✨

相关推荐
CCPC不拿奖不改名几秒前
Python基础:python语言中的文件操作+面试题目
开发语言·数据结构·人工智能·python·学习·面试·职场和发展
superman超哥1 分钟前
Rust 借用分割技巧:突破借用限制的精确访问
开发语言·后端·rust·编程语言·借用分割技巧·借用限制·精准访问
程序炼丹师1 分钟前
C++ 中的 std::tuple (元组)的使用
开发语言·c++
海棠AI实验室2 分钟前
第十八章Notebook 工作流:可复现实验与科研记录
python·notebook
程序员佳佳6 分钟前
【万字硬核】从GPT-5.2到Sora2:深度解构多模态大模型的“物理直觉”与Python全栈落地指南(内含Banana2实测)
开发语言·python·gpt·chatgpt·ai作画·aigc·api
不绝19113 分钟前
C#进阶——内存
开发语言·c#
风送雨13 分钟前
Go 语言进阶学习:第 1 周 —— 并发编程深度掌握
开发语言·学习·golang
带娃的IT创业者15 分钟前
Cursor 新增的 Plan 和 Debug 模式介绍
人工智能·python·cursor·ai辅助开发·ai开发工具·ai开发技巧
小北方城市网15 分钟前
第 5 课:服务网格(Istio)实战|大规模微服务的流量与安全治理体系
大数据·开发语言·人工智能·python·安全·微服务·istio
jghhh0116 分钟前
自适应信号时频处理方法MATLAB实现(适用于非线性非平稳信号)
开发语言·算法·matlab