云容笔谈·东方红颜影像生成系统Python爬虫实战:自动化采集素材与数据清洗

张开发
2026/4/14 11:32:34 15 分钟阅读

分享文章

云容笔谈·东方红颜影像生成系统Python爬虫实战:自动化采集素材与数据清洗
云容笔谈·东方红颜影像生成系统Python爬虫实战自动化采集素材与数据清洗最近在捣鼓一个挺有意思的项目叫“云容笔谈·东方红颜影像生成系统”。简单说这是一个能生成东方美学风格人像的AI工具。但玩过这类工具的朋友都知道效果好不好很大程度上取决于你喂给它的“素材”质量如何。为了生成一张有神韵的古典美人图你可能需要收集成百上千张高质量的参考图——这活儿手动干起来简直能让人崩溃。我就在想能不能让这个过程自动化一点比如让程序自动去网上帮我找图、下载、整理最后直接导入系统里用。这不就是Python爬虫的拿手好戏吗今天我就来聊聊怎么把这两者结合起来打造一个专为“东方红颜”系统服务的自动化素材流水线。1. 为什么需要自动化素材采集在做这个项目之前我的素材收集流程是这样的打开几个常去的图库网站输入“汉服”、“古风”、“工笔画”之类的关键词然后一张张点开大图右键另存为再手动重命名最后还得筛选掉那些不相关或者质量差的图片。一套流程下来半天时间就没了效率低得令人发指。更头疼的是数据清洗。下载下来的图片文件名乱七八糟有的带水印有的分辨率太低还有的根本不是东方美学风格只是混在搜索结果里的现代写真。这些“脏数据”如果直接扔给生成系统不仅训练效果差还可能带偏模型。所以自动化采集和清洗的核心目标就两个一是把我从重复的体力劳动里解放出来二是确保喂给AI的“粮食”是干净、优质、对路的。用上Python爬虫之后整个过程就变成了写好规则一键运行泡杯茶的功夫几百张筛选好的高清素材就已经躺在指定文件夹里按规则命名好了随时可以导入系统使用。2. 构建定向爬虫精准捕获东方美学素材爬虫不是漫无目的地瞎抓我们的目标是东方美学图像所以必须“定向”。这里的关键在于选择合适的源网站和制定精准的抓取规则。2.1 选择合适的图片源不是所有网站都适合爬。我优先选择那些图片质量高、分类清晰、且对爬虫相对友好的平台。比如一些专业的摄影社区、壁纸网站、或者设计素材库。这些地方的作品往往经过审核质量有保障并且标签系统比较完善方便我们通过关键词定位。在代码里我们会从一个起始页面通常是某个关键词的搜索结果页或特定分类页开始。import requests from bs4 import BeautifulSoup import time import os # 基础配置 BASE_URL https://example-gallery.com/search # 替换为目标网站实际地址 KEYWORD 汉服 人像 # 搜索关键词 SAVE_DIR ./dongfang_meixue_images HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } # 创建保存目录 os.makedirs(SAVE_DIR, exist_okTrue) def get_search_page(page1): 获取搜索列表页 params {q: KEYWORD, page: page} try: resp requests.get(BASE_URL, paramsparams, headersHEADERS, timeout10) resp.raise_for_status() return resp.text except requests.RequestException as e: print(f获取第{page}页失败: {e}) return None2.2 解析并提取图片详情页链接列表页通常只包含缩略图和链接。我们需要解析出每个图片作品的详情页地址因为高清大图一般都在详情页里。def parse_list_page(html_content): 从列表页解析出详情页链接 if not html_content: return [] soup BeautifulSoup(html_content, html.parser) detail_links [] # 这里需要根据目标网站的实际HTML结构来调整选择器 # 例如可能所有作品链接都在 classwork-item 的a标签里 for item in soup.select(a.work-item): link item.get(href) if link and link.startswith(/): # 拼接成完整URL full_url fhttps://example-gallery.com{link} detail_links.append(full_url) elif link and link.startswith(http): detail_links.append(link) print(f解析到 {len(detail_links)} 个详情页链接) return detail_links2.3 从详情页下载高清图片进入详情页后目标是找到分辨率最高的那个图片文件地址。有些网站会直接提供有些则需要一点技巧。def download_image_from_detail(detail_url): 从详情页下载图片 try: detail_resp requests.get(detail_url, headersHEADERS, timeout10) detail_resp.raise_for_status() except requests.RequestException as e: print(f访问详情页 {detail_url} 失败: {e}) return detail_soup BeautifulSoup(detail_resp.text, html.parser) # 策略1: 查找明确的高清图链接如img标签的data-src、data-original等属性 img_elem detail_soup.find(img, {class: high-res}) # 根据网站实际调整 if not img_elem: # 策略2: 查找页面中最大的图片通常是主图 all_imgs detail_soup.find_all(img) if not all_imgs: return # 简单通过尺寸关键词过滤实际可能需要更复杂的逻辑 potential_imgs [img for img in all_imgs if main in img.get(class, []) or large in img.get(src, )] img_elem potential_imgs[0] if potential_imgs else all_imgs[0] img_src img_elem.get(data-src) or img_elem.get(data-original) or img_elem.get(src) if not img_src: print(f在 {detail_url} 中未找到图片地址) return # 处理可能的相对路径 if img_src.startswith(//): img_url https: img_src elif img_src.startswith(/): img_url https://example-gallery.com img_src else: img_url img_src # 下载图片 try: img_data requests.get(img_url, headersHEADERS, timeout15).content # 生成文件名使用详情页标题或ID避免重复 file_name os.path.basename(img_url).split(?)[0] # 去掉URL参数 if not file_name.lower().endswith((.jpg, .jpeg, .png, .webp)): file_name .jpg # 默认补全扩展名 save_path os.path.join(SAVE_DIR, file_name) with open(save_path, wb) as f: f.write(img_data) print(f图片已保存: {save_path}) time.sleep(1) # 礼貌性延迟避免给服务器造成压力 except Exception as e: print(f下载图片失败 {img_url}: {e})通过这几步一个基础的定向爬虫骨架就搭好了。运行它就能开始批量抓取特定主题的图片。但这只是第一步抓下来的图片还是“毛坯”接下来才是让素材真正能用的关键——智能清洗。3. 智能过滤与数据清洗从“毛坯”到“精装”下载下来的图片堆里什么都有。我们的任务是自动把那些不符合“东方红颜”要求的图片踢出去并把剩下的整理好。3.1 基于规则的初步过滤首先我们可以用一些简单的规则进行快速筛选。import shutil from PIL import Image import hashlib def basic_filter_and_deduplicate(image_folder): 基础过滤与去重尺寸、格式、重复文件 valid_images [] seen_hashes set() for filename in os.listdir(image_folder): filepath os.path.join(image_folder, filename) # 检查文件格式 if not filename.lower().endswith((.png, .jpg, .jpeg, .webp)): os.remove(filepath) print(f移除非图片文件: {filename}) continue try: with Image.open(filepath) as img: width, height img.size # 规则1: 过滤尺寸过小的图片例如宽度小于500像素 if width 500 or height 500: os.remove(filepath) print(f移除尺寸过小图片({width}x{height}): {filename}) continue # 规则2: 计算文件哈希值进行去重 with open(filepath, rb) as f: file_hash hashlib.md5(f.read()).hexdigest() if file_hash in seen_hashes: os.remove(filepath) print(f移除重复图片: {filename}) continue seen_hashes.add(file_hash) valid_images.append((filepath, img)) except Exception as e: print(f处理图片 {filename} 时出错已移除: {e}) os.remove(filepath) print(f初步过滤后剩余 {len(valid_images)} 张图片) return valid_images # 返回路径PIL图像对象列表3.2 引入AI进行内容过滤进阶规则过滤能解决尺寸、格式、重复的问题但判断一张图是否属于“东方美学”就需要点“智能”了。这里我们可以轻量级地利用一些预训练的AI模型。一种方法是使用图像分类模型。我们可以找一个在“场景和物体分类”上表现不错的轻量级模型比如MobileNet但需要微调或者用提示词工程来让它理解“古风”、“汉服”这类概念。更直接一点的方法是使用现有的图像标签生成服务或本地模型为每张图生成描述性关键词然后通过关键词匹配来过滤。# 假设我们使用一个本地化的CLIP模型或类似的视觉-语言模型来打分 # 以下为概念性代码实际需要安装相应的库如transformers和模型 from transformers import pipeline # 或使用其他轻量级视觉特征提取相似度比较的方案 def ai_content_filter(image_path_list, positive_concepts[古风, 汉服, 古典, 工笔画, 仕女图]): 使用视觉模型对图片内容进行过滤 # 此处简化流程实际应用中需要加载模型计算图片特征与文本概念的相似度 filtered_list [] print(正在进行AI内容过滤此步骤可能较慢...) # 概念性流程 # 1. 加载预训练模型例如CLIP # 2. 将positive_concepts编码为文本特征 # 3. 对每张图片编码为图像特征 # 4. 计算图像特征与每个文本特征的相似度取最高分 # 5. 设定一个阈值高于阈值的保留 # 伪代码逻辑 # model load_model() # text_features encode_text(positive_concepts) # for img_path in image_path_list: # img load_image(img_path) # image_feature encode_image(img) # similarity_scores calculate_similarity(image_feature, text_features) # max_score max(similarity_scores) # if max_score THRESHOLD: # filtered_list.append(img_path) # 由于模型加载和运行需要一定环境这里先返回原列表作为示意 # 在实际项目中这是提升素材相关性的核心步骤 print(AI过滤完成此处为示意实际需实现模型推理。) return image_path_list # 实际应返回过滤后的列表3.3 自动化重命名与标注清洗完后一堆像asdf1234.jpg这样的文件名毫无意义。我们需要按规则重命名并生成一个简单的标注文件方便后续在“云容笔谈”系统中管理。def rename_and_annotate(image_path_list, base_namedongfang_meixue): 对图片进行序列化重命名并生成标注CSV文件 import csv annotation_data [] for idx, (img_path, img) in enumerate(image_path_list): # 生成新文件名 new_filename f{base_name}_{idx1:04d}.jpg new_path os.path.join(os.path.dirname(img_path), new_filename) # 重命名文件 os.rename(img_path, new_path) # 收集标注信息文件名、原始名可选、尺寸、可能的关键词 width, height img.size annotation_data.append({ id: idx1, filename: new_filename, original_name: os.path.basename(img_path), width: width, height: height, tags: 古风,人像, # 这里可以尝试用AI模型预测的标签或留空手动补全 source: auto_crawled }) img.close() # 关闭PIL图像对象 # 写入CSV标注文件 csv_path os.path.join(os.path.dirname(image_path_list[0][0]), annotations.csv) with open(csv_path, w, newline, encodingutf-8) as f: writer csv.DictWriter(f, fieldnames[id, filename, original_name, width, height, tags, source]) writer.writeheader() writer.writerows(annotation_data) print(f重命名完成共处理{len(annotation_data)}张图片。) print(f标注文件已生成: {csv_path}) return annotation_data4. 与生成系统对接打造端到端流水线素材清洗整理好了最后一步就是把它喂给“云容笔谈·东方红颜”系统。不同的系统导入方式不同但思路相通。4.1 素材目录标准化首先确保你的素材文件夹结构符合系统的要求。通常系统会要求图片放在特定的train或input目录下并且可能需要对应的描述文件。def prepare_for_ai_system(cleaned_image_folder, annotation_csv_path, target_system_input_dir): 将处理好的素材准备并移动到AI系统的输入目录 import pandas as pd # 读取标注文件 df pd.read_csv(annotation_csv_path) # 在系统输入目录下创建本次导入的子文件夹按时间或批次 import datetime batch_name datetime.datetime.now().strftime(%Y%m%d_%H%M%S) batch_folder os.path.join(target_system_input_dir, fbatch_{batch_name}) os.makedirs(batch_folder, exist_okTrue) # 移动图片文件 for _, row in df.iterrows(): src os.path.join(cleaned_image_folder, row[filename]) dst os.path.join(batch_folder, row[filename]) if os.path.exists(src): shutil.copy2(src, dst) # 使用copy2保留元数据 # 复制并可能转换标注文件为系统需要的格式如JSON # 这里假设系统需要与CSV结构类似的JSON annotation_json_path os.path.join(batch_folder, metadata.json) df.to_json(annotation_json_path, orientrecords, indent2, force_asciiFalse) print(f素材批次已准备就绪位于: {batch_folder}) print(f包含 {len(df)} 张图片及其标注信息。) return batch_folder4.2 自动化触发与集成你可以将这个Python脚本设置为定时任务例如每周一早上运行或者将其集成到一个简单的图形界面里点一下按钮就开始“采集-清洗-导入”的全流程。更进阶一点你甚至可以写一个监听脚本当“云容笔谈”系统的训练数据目录为空或需要更新时自动触发这个爬虫流程实现全自动的素材补给。5. 一些实践中的心得与建议折腾完这一套确实效率提升了不少。不过也有些经验之谈可以帮你少走点弯路。首先尊重版权与网站规则。这是红线。在爬取任何网站前务必查看其robots.txt文件遵守爬取频率限制代码里的time.sleep就是干这个的不要对服务器造成压力。最好用于个人学习和研究如果用于商业项目请确保你拥有素材的合法使用权。其次爬虫代码需要维护。网站结构经常会变今天能用的选择器明天可能就失效了。所以你的解析代码BeautifulSoup选择器那部分最好写得灵活一些并且定期检查。可以把核心的图片链接提取逻辑多写几个备选方案一个失败了尝试另一个。关于过滤效果纯规则的过滤是快但不够精准。AI模型过滤效果好但速度慢而且需要一定的技术门槛去部署和调试。在实际项目中我建议分两步走先用严格的规则如必须包含某些关键词的标题、特定的尺寸比例快速过滤掉明显不相关的再用AI模型对剩下的“疑似”图片进行精细判断这样在效率和效果上能取得不错的平衡。最后数据质量重于数量。不要盲目追求爬取几万张图片。对于“东方红颜”这类风格化很强的生成系统来说100张高质量、风格统一的精品素材远比10000张杂乱无章的图片有用。在清洗阶段宁可严格一点多删掉一些似是而非的图也要保证最终入库的素材都是“精品”。这套自动化流程跑起来之后我花在素材准备上的时间从以前的几个小时缩短到了现在的几乎零投入维护脚本的时间除外。更重要的是素材库的质量变得稳定可控这直接反映在了最终生成图像的效果上。如果你也在为AI创作准备素材而头疼不妨试试这个思路从最简单的定向爬虫开始逐步叠加智能清洗和自动化流程相信也能帮你打开一扇新的大门。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章