1. 项目概述
最近在整理电脑时发现壁纸库已经很久没更新了,手动下载又太麻烦。作为一个Python开发者,我决定写个脚本来自动完成这个任务。这个Python壁纸下载器不仅能定时获取最新壁纸,还能根据分辨率自动分类保存,彻底解放双手。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心功能设计
2.1 壁纸源选择
经过对比测试,最终选择了Wallhaven作为主要来源。这个网站提供API接口,壁纸质量高且分类明确。通过其公开API可以获取到:
- 热门壁纸
- 最新上传
- 按关键词搜索
- 按分辨率筛选
注意:使用API前需要先注册获取API Key,免费账户每天有1000次请求限额
2.2 下载流程设计
完整的自动化流程包含以下环节:
- 通过API获取壁纸列表
- 解析返回的JSON数据
- 筛选符合要求的壁纸(分辨率、比例等)
- 多线程下载图片文件
- 按分辨率分类存储
- 记录已下载文件避免重复
3. 关键技术实现
3.1 环境准备
需要安装以下Python库:
bash复制pip install requests pillow tqdm
- requests:用于API请求和文件下载
- pillow:图片处理
- tqdm:进度条显示
3.2 API请求封装
python复制import requests
class WallhavenAPI:
def __init__(self, api_key):
self.base_url = "https://wallhaven.cc/api/v1/"
self.api_key = api_key
def search_wallpapers(self, query=None, categories="111", purity="100",
sorting="date_added", order="desc", page=1):
params = {
"apikey": self.api_key,
"categories": categories,
"purity": purity,
"sorting": sorting,
"order": order,
"page": str(page)
}
if query:
params["q"] = query
response = requests.get(f"{self.base_url}search", params=params)
return response.json()
3.3 多线程下载实现
使用concurrent.futures实现并行下载:
python复制from concurrent.futures import ThreadPoolExecutor
from tqdm import tqdm
def download_wallpaper(wallpaper, save_dir):
try:
img_url = wallpaper["path"]
resolution = wallpaper["resolution"]
# 创建分辨率目录
res_dir = os.path.join(save_dir, resolution.replace("x", "_"))
os.makedirs(res_dir, exist_ok=True)
# 下载图片
response = requests.get(img_url, stream=True)
filename = os.path.join(res_dir, os.path.basename(img_url))
with open(filename, "wb") as f:
for chunk in response.iter_content(1024):
f.write(chunk)
return True
except Exception as e:
print(f"下载失败: {img_url}, 错误: {str(e)}")
return False
def batch_download(wallpapers, save_dir, max_workers=5):
with ThreadPoolExecutor(max_workers=max_workers) as executor:
results = list(tqdm(
executor.map(lambda wp: download_wallpaper(wp, save_dir), wallpapers),
total=len(wallpapers)
))
return sum(results)
4. 完整脚本实现
4.1 主程序结构
python复制import os
import json
from datetime import datetime
class WallpaperDownloader:
def __init__(self, config_file="config.json"):
self.load_config(config_file)
self.api = WallhavenAPI(self.config["api_key"])
self.downloaded = self.load_downloaded_list()
def load_config(self, config_file):
with open(config_file) as f:
self.config = json.load(f)
def load_downloaded_list(self):
record_file = os.path.join(self.config["save_dir"], ".downloaded")
if os.path.exists(record_file):
with open(record_file) as f:
return set(f.read().splitlines())
return set()
def update_downloaded_list(self, new_files):
record_file = os.path.join(self.config["save_dir"], ".downloaded")
with open(record_file, "a") as f:
for file in new_files:
f.write(f"{file}\n")
self.downloaded.update(new_files)
def run(self):
print(f"{datetime.now()} 开始壁纸下载任务")
# 获取壁纸列表
wallpapers = self.fetch_wallpapers()
# 过滤已下载
new_wallpapers = [
wp for wp in wallpapers
if os.path.basename(wp["path"]) not in self.downloaded
]
if not new_wallpapers:
print("没有发现新壁纸")
return
# 批量下载
print(f"发现 {len(new_wallpapers)} 张新壁纸")
success_count = batch_download(new_wallpapers, self.config["save_dir"])
# 更新记录
downloaded_files = [
os.path.basename(wp["path"])
for wp in new_wallpapers[:success_count]
]
self.update_downloaded_list(downloaded_files)
print(f"任务完成,成功下载 {success_count} 张壁纸")
4.2 配置文件示例
创建config.json文件:
json复制{
"api_key": "你的API_KEY",
"save_dir": "/path/to/wallpapers",
"search_params": {
"categories": "111",
"purity": "100",
"sorting": "date_added",
"order": "desc",
"page": 1,
"resolutions": ["1920x1080", "2560x1440"]
}
}
5. 高级功能扩展
5.1 分辨率自动适配
通过检测显示器分辨率自动下载匹配尺寸:
python复制import screeninfo
def get_display_resolution():
try:
monitor = screeninfo.get_monitors()[0]
return f"{monitor.width}x{monitor.height}"
except:
return "1920x1080" # 默认值
5.2 定时任务设置
使用schedule库实现定时运行:
python复制import schedule
import time
def job():
downloader = WallpaperDownloader()
downloader.run()
# 每天上午10点运行
schedule.every().day.at("10:00").do(job)
while True:
schedule.run_pending()
time.sleep(60)
6. 常见问题解决
6.1 下载速度慢
- 调整max_workers参数(建议3-5个线程)
- 检查网络连接
- 尝试更换DNS服务器
6.2 API限制问题
- 免费账户每天1000次请求限额
- 重要请求添加延时:
python复制import time
time.sleep(1) # 每次请求间隔1秒
6.3 图片损坏
- 添加下载校验:
python复制from PIL import Image
def validate_image(filepath):
try:
Image.open(filepath).verify()
return True
except:
os.remove(filepath)
return False
7. 实际使用建议
- 首次使用建议先测试少量下载:
python复制downloader = WallpaperDownloader()
downloader.config["search_params"]["page"] = 1 # 只下载第一页
downloader.run()
- 长期运行建议搭配日志记录:
python复制import logging
logging.basicConfig(
filename="wallpaper_downloader.log",
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
- 对于大量下载,可以考虑使用代理IP轮换:
python复制proxies = {
"http": "http://proxy_ip:port",
"https": "http://proxy_ip:port"
}
response = requests.get(url, proxies=proxies)
这个脚本我已经稳定使用半年多,累计自动下载了2000+张高质量壁纸。最大的收获是再也不用到处找壁纸了,每天开机都有新鲜的高清壁纸自动更新。对于Python初学者来说,这也是一个很好的练手项目,涉及了API调用、文件操作、多线程等实用技能。
