Python 实现 360 壁纸爬虫:随机延时防封,智能分类与自动重命名

本文将分享一款实用的 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.