1. 项目概述
最近在整理电脑时发现壁纸库已经很久没更新了,手动下载又太费时间。作为一个Python开发者,我决定写个脚本来自动完成这个重复性工作。这个Python壁纸下载器不仅能定时获取最新壁纸,还能根据分辨率自动分类保存,彻底解放双手。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心功能设计
2.1 需求分析
壁纸下载脚本需要解决三个核心问题:
- 如何获取壁纸源数据
- 如何实现自动化下载
- 如何管理本地文件
经过对比多个壁纸网站API,最终选择Wallhaven.cc作为数据源。它的API稳定且提供丰富的筛选参数,支持按分辨率、色系、流行度等条件查询。
2.2 技术选型
基础工具栈:
- requests库处理HTTP请求
- BeautifulSoup解析HTML
- os和pathlib管理文件系统
- schedule实现定时任务
考虑到需要处理大量图片下载,特别添加了:
- tqdm进度条显示
- retrying重试机制
- 多线程加速
3. 核心代码实现
3.1 API请求模块
python复制def fetch_wallpapers(query_params):
base_url = "https://wallhaven.cc/api/v1/search"
headers = {
"User-Agent": "Mozilla/5.0",
"Accept": "application/json"
}
try:
response = requests.get(base_url, params=query_params, headers=headers)
response.raise_for_status()
return response.json().get("data", [])
except Exception as e:
print(f"API请求失败: {str(e)}")
return []
3.2 下载管理器
python复制def download_image(url, save_path):
try:
response = requests.get(url, stream=True)
if response.status_code == 200:
with open(save_path, "wb") as f:
for chunk in response.iter_content(1024):
f.write(chunk)
return True
except Exception as e:
print(f"下载失败: {url} - {str(e)}")
return False
3.3 主控制流程
python复制def main():
# 配置查询参数
params = {
"q": "nature",
"categories": "111",
"purity": "100",
"sorting": "random",
"page": "1"
}
wallpapers = fetch_wallpapers(params)
if not wallpapers:
print("未获取到壁纸数据")
return
for wp in tqdm(wallpapers, desc="下载进度"):
path = build_save_path(wp["resolution"], wp["id"])
download_image(wp["path"], path)
4. 高级功能实现
4.1 分辨率自动分类
python复制def build_save_path(resolution, wp_id):
# 解析分辨率
width, height = map(int, resolution.split("x"))
# 确定分类目录
if width/height > 1.7:
folder = "wide"
elif 1.3 <= width/height <= 1.7:
folder = "standard"
else:
folder = "mobile"
return Path(f"wallpapers/{folder}/{wp_id}.jpg")
4.2 定时任务集成
python复制def setup_scheduler():
# 每天上午10点执行
schedule.every().day.at("10:00").do(main)
while True:
schedule.run_pending()
time.sleep(60)
5. 异常处理与优化
5.1 重试机制
python复制@retry(stop_max_attempt_number=3, wait_fixed=2000)
def download_with_retry(url, path):
if not download_image(url, path):
raise Exception("下载失败")
5.2 多线程加速
python复制from concurrent.futures import ThreadPoolExecutor
def batch_download(wallpapers):
with ThreadPoolExecutor(max_workers=5) as executor:
futures = []
for wp in wallpapers:
path = build_save_path(wp["resolution"], wp["id"])
futures.append(executor.submit(
download_with_retry, wp["path"], path))
for future in tqdm(as_completed(futures), total=len(futures)):
future.result()
6. 使用指南
6.1 环境配置
- 安装依赖库:
bash复制pip install requests beautifulsoup4 schedule tqdm retrying
- 创建配置文件config.ini:
ini复制[wallhaven]
api_key = YOUR_API_KEY
default_query = nature
categories = 111
purity = 100
6.2 运行方式
直接执行主脚本:
bash复制python wallpaper_downloader.py
或作为后台服务运行:
bash复制nohup python wallpaper_downloader.py > log.txt &
7. 实用技巧
-
分辨率筛选技巧:
在查询参数中添加resolutions=1920x1080可以精确筛选特定分辨率的壁纸 -
色彩过滤:
使用colors=000000参数可以获取纯黑背景的壁纸,适合暗色模式用户 -
热门标签:
常见优质标签:digital art,photography,minimalism -
性能优化:
- 设置
atime=false参数避免更新文件访问时间 - 使用
verify=False关闭SSL验证(仅限内网环境)
- 设置
8. 常见问题解决
-
API限流问题:
- 现象:频繁返回429错误
- 解决方案:添加延迟
time.sleep(1)或申请正式API Key
-
图片损坏:
- 现象:下载的图片无法打开
- 检查点:验证响应头中的Content-Length是否与实际文件大小一致
-
文件名冲突:
- 现象:重复下载相同ID的壁纸
- 改进方案:在保存路径中加入日期戳
-
代理配置:
python复制proxies = { "http": "http://proxy.example.com:8080", "https": "http://proxy.example.com:8080" } requests.get(url, proxies=proxies)
9. 扩展建议
-
壁纸自动切换:
可以集成pywin32(Windows)或gsettings(Linux)实现下载后自动更换壁纸 -
机器学习筛选:
使用OpenCV分析壁纸色调,自动分类为"light/dark"主题 -
多源支持:
添加Unsplash、Bing每日壁纸等更多数据源 -
GUI界面:
用PySimpleGUI构建图形化操作界面
这个脚本我已经稳定使用半年多,累计自动下载了2000+张高质量壁纸。最大的收获是学会了如何设计健壮的自动化流程 - 包括异常处理、日志记录和性能优化。最近正在尝试加入基于色彩分析的自动分类功能,让壁纸管理更智能。
