本文将分享一款实用的 360 壁纸爬虫 Python 脚本。只需输入分类,爬虫便会自动执行,遇到下载失败的情况会贴心地进行重试,最多重试 3 次,确保尽可能完整地获取资源。当所有壁纸下载完毕后,程序还会自动关闭,无需人工干预。更值得一提的是,下载的图片会依据分辨率尺寸自动重命名,方便后续的归类与查找,为您的壁纸管理带来高效便捷的体验。
源代码:
import requests
import os
import time
import random
import hashlib
from urllib.parse import urlparse
def download_wallpapers(category_id):
# 配置请求头和存储路径
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
save_dir = os.path.join("downloads", f"category_{category_id}")
os.makedirs(save_dir, exist_ok=True)
start = 0
per_page = 50 # 每次请求的图片数量
retry_limit = 3 # 单个图片下载重试次数
total_downloaded = 0
while True:
# 构造API请求URL
api_url = f"http://wallpaper.apc.360.cn/index.php?c=WallPaper&a=getAppsByCategory&cid={category_id}&start={start}&count={per_page}"
try:
# 带重试机制的API请求
response = requests.get(api_url, headers=headers, timeout=15)
response.raise_for_status()
data = response.json()
if not data.get('data'):
print(f"没有更多数据,已下载 {total_downloaded} 张图片")
break
# 处理每张壁纸
for item in data['data']:
img_url = item.get('url')
resolution = item.get('resolution', 'unknown').replace('x', '_')
if not img_url:
continue
# 生成唯一文件名
url_hash = hashlib.md5(img_url.encode()).hexdigest()[:10]
file_ext = os.path.splitext(urlparse(img_url).path)[1] or '.jpg'
filename = f"{resolution}_{url_hash}{file_ext}"
file_path = os.path.join(save_dir, filename)
if os.path.exists(file_path):
continue
# 带重试机制的图片下载
for attempt in range(retry_limit):
try:
img_resp = requests.get(img_url, headers=headers, timeout=20)
img_resp.raise_for_status()
with open(file_path, 'wb') as f:
f.write(img_resp.content)
total_downloaded += 1
print(f"成功下载:{filename}")
break
except Exception as e:
if attempt == retry_limit - 1:
print(f"下载失败(已重试{retry_limit}次):{img_url}")
time.sleep(random.uniform(1, 3))
# 随机延迟防止封禁
time.sleep(random.uniform(0.5, 1.5))
# 更新分页参数
start += per_page
# 批次间较长延迟
time.sleep(random.uniform(2, 5))
except requests.exceptions.RequestException as e:
print(f"API请求失败: {str(e)}")
break
except Exception as e:
print(f"发生未知错误: {str(e)}")
break
if __name__ == "__main__":
try:
cid = int(input("请输入壁纸分类ID: "))
download_wallpapers(cid)
except ValueError:
print("请输入有效的数字ID")
如果没有python环境的可以PM,我可以给你打包一个exe软件。
- All rights reserved.
- No part of this website, including text and images, may be reproduced, modified, distributed, or transmitted in any form or by any means, without the prior written permission of the author.
- Unauthorized commercial use is strictly prohibited.
- Unauthorized personal use is strictly prohibited.