-
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 =…- 11
- 0
-
视频转GIF小工具
使用Python,支持常见的视频格式转换。 开箱即用的软件放在文末了,有能力者请自行改进。 如果需要使用该工具,务必安装FFmpeg框架支持,可以从 FFmpeg 官网 下载适用于操作系统的版本。 代码: import tkinter as tk from tkinter import filedialog, messagebox from moviepy.editor import VideoFileClip import threading import os def video_to_gif(input_video_path, output_gif_path, start_time=None, end_time=None): """ 将视频转换为GIF。 参数: - input_video_path: 输入视频文件路径 - output_gif_path: 输出GIF文件路径 - start_time: GIF的开始时间(以秒为单位),默认为视频开头 - end_time: GIF的结束时间(以秒为单位),默认为视频结尾 """ try: # 加载视频文件 video_clip = VideoFileClip(input_video_path) # 裁剪视频到指定时间段 if start_time is not None and end_time is not None: video_clip = video_clip.subclip(start_time, end_time) # 更新状态为“处理中” status_var.set("GIF转换中,请稍候...") # 将视频转换为GIF并保存 if output_gif_path: # 确保路径有效 video_clip.write_gif(output_gif_path) # 更新状态为“完成” status_var.set(f"GIF已成功保存为 {output_gif_path}") messagebox.showinfo("完成", f"GIF已成功保存为 {output_gif_path}") else: status_var.set("转换取消") messagebox.showwarning("取消", "转换已取消,无效的保存路径。") except Exception as e: status_var.set("转换失败") messagebox.showerror("错误", f"出现错误: {e}") finally: # 重新启用转换按钮 convert_button.config(state=tk.NORMAL) def convert_to_gif(): if not video_path.get(): messagebox.showerror("错误", "请先选择一个视频文件。") return start = start_time.get() end = end_time.get() try: start = float(start) if start else None end = float(end) if end else None except ValueError: messagebox.showerror("错误", "请输入有效的起始和结束时间。") return output_path = filedialog.asksaveasfilename(defaultextension=".gif", filetypes=[("GIF files", "*.gif")]) # 如果用户取消保存文件操作 if not output_path: status_var.set("转换取消") return # 禁用转换按钮 convert_button.config(state=tk.DISABLED) def do_conversion(): video_to_gif(video_path.get(), output_path, start_time=start, end_time=end) # 启动转换线程 conversion_thread = threading.Thread(target=do_conversion) conversion_thread.start() def select_file(): file_path = filedialog.askopenfilename(filetypes=[("Video files", "*.mp4;*.avi;*.mov;*.mkv")]) if file_path: video_path.set(file_path) video_label.config(text="文件已加载:" + os.path.basename(file_path)) # 创建主窗口 root = tk.Tk() root.title("视频转GIF工具") root.geometry("500x350") # 视频路径显示 video_path = tk.StringVar() video_label = tk.Label(root, text="点击下方按钮选择视频文件:", width=60, height=4, relief="sunken") video_label.pack(pady=10) # 文件选择按钮 select_button = tk.Button(root,…- 23
- 0
-
拿手搓了一个AI对话,虽然...emm
手搓的屎山,代码就不公开了,我参考支持openaiSDK的讯飞和deepseek写的。 支持上下文,但....经常出错,可以娱乐。 如何使用请关注公众号,我会在空闲的时间更新一篇关于这个的内容。 我暂且叫Ta:未开智的小助理……- 35
- 0