上周我在处理一批月份数据的时候,遇到了一个典型的体力活。几十个分布在不同网络路径下的月度独立Excel表格文件需要拉取到本地。要是靠手动一个个点击另存为,不仅极其催眠,还很容易漏掉某个月份。
当时我的第一反应是直接用 requests 库写个爬虫脚本。但是经常写数据抓取的朋友都知道,用 requests 下载大文件其实挺繁琐的。你需要开启 stream=True,搞个循环每次读取一小块数据写入本地;如果你还想在终端里看到下载进度,甚至还得去读取 Header 里的 Content-Length,再配合类似 tqdm 这样的库,自己手写一个进度条。
为了下几个文件,硬生生写出几十行代码,这太不“Pythonic”了。
今天给大家介绍一个极其轻量、专注纯粹的第三方库——wget。没错,就是你想的那个 Linux 系统下的同名下载神器,有开发者把它完全用纯 Python 重新实现了一遍。
极简的下载工作流
在了解它的代码有多简洁之前,我们先看看它的内部处理逻辑。用 wget 下载文件,你几乎不需要关心底层的数据流是怎么写入硬盘的,它把所有脏活累活都包揽了:
[获取目标数据文件的URL链接] │ ▼ (调用 wget.download) │ ├────────────────(是否指定本地路径?)────────────────┐ │ │ [未指定] [已指定] │ │ ▼ ▼ (自动从URL中解析出原始文件名) (按你指定的目录或新文件名保存) │ │ └──────────────────────┬────────────────────────┘ │ ▼ [自动在终端打印下载进度条] │ ▼ [文件下载完毕并落盘保存]
废话不多说,直接看代码
在使用之前,只需要简单的安装一下即可,没有任何复杂的依赖:
1. 最基础的用法:一行代码下载
假设我们要下载一个数据压缩包。不需要写 with open,不需要分块读取,你只需要把链接传进去。
import wget# 假设这是一个包含环保监测数据的压缩包data_url = "http://example.com/datasets/environment_data_2026.zip"print("开始下载数据文件...")# 这就是全部的代码,它会自动解析文件名 environment_data_2026.zip 并下载到当前目录downloaded_file = wget.download(data_url)print(f"\n下载完成!文件已保存在: {downloaded_file}")
当你运行这段代码时,终端里会自动出现一个文本进度条,实时显示下载的百分比、已下载大小和总大小。这对于那些动辄几百兆的数据集来说,简直是极大的心理安慰。
2. 自定义保存路径与文件名
在批量处理数据时,我们通常会把原始数据统一放在特定的文件夹下。wget 的 download 函数提供了一个 out 参数,可以完美满足这个需求。
import wgetimport osurl = "http://example.com/datasets/august_report.xlsx"# 我们可以在当前目录下创建一个名叫 raw_data 的文件夹output_dir = "./raw_data"if not os.path.exists(output_dir): os.makedirs(output_dir)# 你可以直接传入目录路径,它会用原文件名存放到该目录下# wget.download(url, out=output_dir)# 你也可以直接传入一个完整的文件路径,顺便把文件重命名custom_path = os.path.join(output_dir, "2026_08_cleaned_report.xlsx")print("正在拉取报告...")wget.download(url, out=custom_path)print("\n报告拉取完毕!")
3. 实战场景:批量化自动化下载
回到我最初的那个需求,我们需要下载一堆独立的月度数据文件。结合简单的循环,wget 就能变成一个极其高效的批量下载器。
import wgetimport time# 模拟我们需要下载的各个月份独立数据表格monthly_urls = [ "http://example.com/data/station_records_04.xlsx", "http://example.com/data/station_records_05.xlsx", "http://example.com/data/station_records_06.xlsx"]print(f"检测到 {len(monthly_urls)} 个文件需要下载,任务开始...")for index, url in enumerate(monthly_urls): print(f"\n正在下载第 {index + 1} 个文件: {url.split('/')[-1]}") try: # 调用下载 wget.download(url, out="./monthly_data/") # 稍微停顿一下,避免给目标服务器造成太大压力 time.sleep(1) except Exception as e: print(f"\n文件下载失败,遇到了点问题: {e}")print("\n\n所有月度数据处理完毕!")
写在最后
在写自动化脚本的时候,我们往往追求的是“快”和“稳”。虽然 requests 库无比强大,是网络请求领域的绝对霸主,但在“纯下载文件”这个细分场景下,wget 库凭借其开箱即用的特性和自带的进度条,提供了更加优雅的解决方案。
如果你手头刚好有一些需要批量拉取文件、下载测试图片或者抓取公开数据集的需求,不妨试试这个小巧的库,相信它能帮你省下不少手敲冗长代码的时间。
编辑:余文彬
审校:余雨馨