当前位置: 首页 > news >正文

python爬虫4K高清美女壁纸

简介:

  1. 一次爬取20张图片,可以更改这段代码的数值,改变下载图片数量:if success_count >= 20:
  2. 图片存放到D:\pachong1,可以更改这段代码的值修改存放地址:SAVE_DIR = r"D:\pachong1"
  3. 需要安装对应的库,使用:pip install 库名来安装需要的库

代码:

""" AURA 壁纸爬虫 - 摄影美女专题 爬取 https://gallery.wallaura.cn/?t=摄影美女 上的图片 保存到 D:\pachong1,爬取20张 真图(跳过占位图<100KB) """ import os import time import json import hashlib import base64 import requests from Crypto.Cipher import AES from selenium import webdriver from selenium.webdriver.chrome.options import Options SAVE_DIR = r"D:\pachong1" os.makedirs(SAVE_DIR, exist_ok=True) def encrypt_md5(text): return hashlib.md5(text.encode()).hexdigest() def decrypt_aes(cipher_text, key): if not cipher_text or not key: return "" key = (key * 16)[-16:] md5_key = encrypt_md5(key) iv = md5_key[8:24] try: raw = bytes.fromhex(cipher_text) b64_data = base64.b64encode(raw).decode() except: return cipher_text try: cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8')) decrypted = cipher.decrypt(base64.b64decode(b64_data)) return decrypted.rstrip(b'\x00').decode('utf-8') except: return cipher_text def decrypt_url(img_url, provider): if not img_url or not provider: return "" parts = img_url.split("?") path_parts = parts[0].split("/") filename = path_parts[-1] name_parts = filename.split(".") if len(name_parts[0]) < 32: return img_url encrypted = name_parts[0][:32] remaining = name_parts[0][32:] decrypted = decrypt_aes(encrypted, provider) name_parts[0] = decrypted + remaining path_parts[-1] = ".".join(name_parts) parts[0] = "/".join(path_parts) return "?".join(parts) def try_download(img_url, save_path, index): """尝试下载,如果是占位图(<100KB)返回False""" headers_list = [ { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Referer": "https://gallery.wallaura.cn/", }, { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", }, ] for attempt, headers in enumerate(headers_list): try: resp = requests.get(img_url, headers=headers, timeout=30) if resp.status_code == 200: size_kb = len(resp.content) / 1024 if size_kb < 100: print(f" [占位图 {size_kb:.1f}KB] 跳过") return False with open(save_path, "wb") as f: f.write(resp.content) print(f" [OK] 第{index}张 ({size_kb:.1f} KB)") return True except Exception as e: print(f" 尝试{attempt+1}异常: {e}") time.sleep(0.5) return False def main(): print("=" * 60) print("AURA 壁纸爬虫 - 摄影美女专题 (只下真图)") print("=" * 60) chrome_options = Options() chrome_options.add_argument('--headless=new') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--window-size=1920,1080') chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36') driver = webdriver.Chrome(options=chrome_options) try: print("\n[1/2] 正在获取图片数据...") driver.get("https://gallery.wallaura.cn/?t=%E6%91%84%E5%BD%B1%E7%BE%8E%E5%A5%B3") time.sleep(6) data_json = driver.execute_script(""" if (typeof DATA_CACHE !== 'undefined' && DATA_CACHE.length > 0) { var items = []; for (var i = 0; i < DATA_CACHE.length; i++) { var item = DATA_CACHE[i]; if (!item.rawprovider || !item.rawid) continue; var imgurl = item.imgurl || item.thumburl || ''; if (!imgurl) continue; var decrypted = imgurl; try { decrypted = decryptUrl(imgurl, item.rawprovider); } catch(e) {} items.push({ provider: item.rawprovider, rawid: item.rawid, url: decrypted }); } return JSON.stringify(items); } return '[]'; """) items = json.loads(data_json) print(f"获取到 {len(items)} 张图片") if not items: print("没有获取到图片!") return print(f"\n[2/2] 开始下载,跳过占位图(<100KB)直到凑满20张...") success_count = 0 for i, item in enumerate(items): if success_count >= 20: break print(f"\n--- [{success_count+1}/20] 第{i+1}/{len(items)}张 ---") print(f" 来源: {item['provider']}, ID: {item['rawid']}") print(f" URL: {item['url'][:100]}...") url_path = item['url'].split("?")[0] ext = os.path.splitext(url_path)[1] or ".jpg" if len(ext) > 5: ext = ".jpg" file_name = f"aura_{item['provider']}_{item['rawid']}{ext}" save_path = os.path.join(SAVE_DIR, file_name) if try_download(item['url'], save_path, success_count + 1): success_count += 1 time.sleep(0.3) print("\n" + "=" * 60) print(f"完成!真图: {success_count}/20 张") print(f"保存路径: {SAVE_DIR}") print("=" * 60) finally: driver.quit() if __name__ == "__main__": main()

运行结果截图:


http://www.rkmt.cn/news/1409636.html

相关文章:

  • 保姆级教程:用GD32C103单片机实现CAN FD 500K/2M双波特率通信(附完整源码)
  • [023][数据模块]深入剖析 MyBatis 通用枚举处理器:BaseEnum 与 BaseEnumTypeHandler 的设计与实现
  • 基于易失性忆阻器的超低功耗神经锋电位编码技术
  • 告别Quartus依赖:用AGM Supra独立搞定AG1280Q48工程创建(附路径避坑)
  • 华为手机刷机前必看:用这个工具箱一键安装ADB/Fastboot驱动,告别环境配置烦恼
  • 从效率工具到商业引擎:电子签的ROI超乎想象
  • 5分钟搞定微信群消息自动转发:wechat-forwarding终极指南
  • 保姆级避坑指南:在PVE 8.x上搞定NVIDIA显卡直通给Windows虚拟机(附ESXi/unRaid对比)
  • Go 语言 sort 包详解:从基础排序到自定义排序(含底层原理+零基础看懂)
  • 使用Taotoken CLI工具一键配置多开发环境下的模型密钥
  • ARMCLANG中SVC函数实现与优化技巧
  • 手把手教你用SPI配置AD9164 DAC:从时钟计算到JESD204B链路建立(附避坑指南)
  • 从标注到分析:Matlab Image Labeler 与 App Designer 联动打造专属标注工具
  • 别再搞混了!ZYNQ上的MIPI CSI-2 IP核,和OV5640传感器配置是两码事
  • 从‘timeout’命令看Linux信号机制:SIGTERM和SIGKILL到底该怎么选?
  • 如何选择专业中文排版字体:思源宋体7种字重深度解析
  • 优秀的npm包推荐
  • 从《原神》UI到《王者荣耀》展示:拆解Unity坐标系统在商业游戏中的核心应用
  • 服装连锁店库存软件怎么选?分色分码管理是关键
  • 从入门到精通:EVO在主流SLAM数据集上的实战评估指南
  • 推荐3款安卓手机软件,智能遥控器必备,低调使用!
  • 从MeshCNN到MeshNet++:手把手带你复现三角网格分类SOTA(附数据集处理脚本)
  • ChatGPT培训材料评估失效?——用ASTD能力模型+LLM输出一致性指数双校验,精准定位3类隐性缺陷
  • ChatGPT创意爆发公式:如何用3步结构化提示+2类思维锚点,在87秒内激活真正突破性想法?
  • 猫抓浏览器扩展终极指南:一站式解决网页资源嗅探与媒体下载难题
  • 2027年浙大 MBA 提前批预审面试福州批申请即将截止!宁波、合肥、上海考生关注~
  • 技术拆解:复卡器工作原理与IC/ID卡安全机制浅析——你的门禁卡真的安全吗?
  • MacBook Pro上搞定Parallels嵌套VMware:从报错‘不支持Intel VT-x’到成功启动的完整避坑记录
  • 告别多个IDE切换!用VS Code的Code Runner插件打造你的轻量级“万能”代码测试台
  • 新手必看:电阻箱选型避坑全攻略