杭州公司建设网站企业网站的建立如何带来询盘
杭州公司建设网站,企业网站的建立如何带来询盘,网站建设开发全包,网站按域名跳转不同的页面影墨今颜模型生成作品的数据分析与可视化#xff1a;Python爬虫与Matplotlib实战
你有没有好奇过#xff0c;社区里那些用影墨今颜模型生成的精彩图片#xff0c;背后藏着什么秘密#xff1f;哪些描述词最受欢迎#xff1f;哪种风格的作品最多#xff1f;不同参数设置下…影墨·今颜模型生成作品的数据分析与可视化Python爬虫与Matplotlib实战你有没有好奇过社区里那些用影墨·今颜模型生成的精彩图片背后藏着什么秘密哪些描述词最受欢迎哪种风格的作品最多不同参数设置下图片效果有什么规律这些问题光靠眼睛看是看不出来的。今天我们就来玩点不一样的用Python爬虫技术把公开平台上的作品数据“搬”下来再用Matplotlib画成图表让数据自己“说话”。这不仅能帮你了解社区创作趋势还能为你的模型调优和内容创作提供实实在在的数据参考。整个过程就像一次数据探险我们会从零开始一步步教你如何获取数据、分析数据最后用直观的图表呈现出来。即使你之前没怎么接触过爬虫或数据分析跟着做一遍也能轻松上手。1. 场景与目标我们为什么要做这件事在深入代码之前我们先聊聊做这件事的价值。单纯地欣赏作品是一回事但通过数据去理解创作行为则是另一回事。对于模型使用者来说了解社区的热门趋势可以快速找到灵感知道什么样的描述词Prompt更容易出好图。对于模型开发者或研究者分析不同参数如采样步数、引导系数下的作品效果分布能为模型调优提供宝贵的反馈。而对于内容平台运营者掌握风格分布和用户偏好则有助于策划更受欢迎的活动或专题。我们这次实战的目标很明确获取数据从指定的公开社区平台爬取影墨·今颜模型生成的作品信息包括图片链接、描述词、生成参数如模型版本、采样器、步数、引导系数等、点赞数、发布时间等。分析数据挖掘这些数据中的规律比如高频出现的描述词、流行的艺术风格、常用的参数组合等。可视化呈现将分析结果用图表清晰地展示出来生成趋势图、分布图、对比图等让洞察一目了然。整个过程我们会使用Python中两个非常强大的库requests和BeautifulSoup或Scrapy负责爬虫pandas进行数据处理matplotlib和seaborn进行可视化。2. 环境准备与数据爬取实战工欲善其事必先利其器。我们先来把环境和工具准备好。2.1 搭建你的Python数据分析环境建议使用Anaconda来管理环境这样可以避免包冲突。打开你的终端或Anaconda Prompt执行以下命令# 创建一个新的虚拟环境命名为 ai-data-analysis conda create -n ai-data-analysis python3.9 # 激活环境 conda activate ai-data-analysis # 安装我们需要的核心库 pip install requests beautifulsoup4 pandas matplotlib seaborn scrapy jupyter安装完成后你可以启动Jupyter Notebook来跟着我们一步步操作jupyter notebook2.2 第一步编写爬虫获取作品元数据这里我们以一个假设的、结构清晰的公开作品展示页面为例。请注意在实际操作中务必遵守目标网站的robots.txt协议尊重版权仅爬取公开且允许爬取的数据并设置合理的请求间隔避免对服务器造成压力。我们计划爬取一个列表页它包含多个作品卡片每个卡片有图片、描述、参数等信息。import requests from bs4 import BeautifulSoup import pandas as pd import time import re def scrape_community_page(base_url, max_pages5): 爬取社区作品列表页 :param base_url: 列表页的基础URL格式例如 https://example.com/community?page{} :param max_pages: 计划爬取的页数 :return: 包含作品数据的字典列表 all_works [] headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } for page in range(1, max_pages 1): url base_url.format(page) print(f正在爬取第 {page} 页: {url}) try: response requests.get(url, headersheaders, timeout10) response.raise_for_status() # 检查请求是否成功 except requests.RequestException as e: print(f请求第 {page} 页失败: {e}) continue soup BeautifulSoup(response.content, html.parser) # 假设每个作品都在一个 class 为 work-card 的 div 中 work_cards soup.find_all(div, class_work-card) for card in work_cards: work_data {} # 提取图片链接 img_tag card.find(img) work_data[image_url] img_tag.get(src) if img_tag else None # 提取描述词 (Prompt) prompt_tag card.find(p, class_prompt-text) work_data[prompt] prompt_tag.text.strip() if prompt_tag else # 提取参数信息 (假设参数在一个特定的区域用逗号分隔) param_tag card.find(div, class_params) if param_tag: param_text param_tag.text.strip() # 使用正则表达式提取关键参数例如Steps: 20, CFG: 7.5, Sampler: DPM steps_match re.search(rSteps:\s*(\d), param_text) cfg_match re.search(rCFG:\s*([\d.]), param_text) sampler_match re.search(rSampler:\s*(\w), param_text) work_data[steps] int(steps_match.group(1)) if steps_match else None work_data[cfg_scale] float(cfg_match.group(1)) if cfg_match else None work_data[sampler] sampler_match.group(1) if sampler_match else None # 提取点赞数 like_tag card.find(span, class_like-count) work_data[likes] int(like_tag.text) if like_tag and like_tag.text.isdigit() else 0 # 提取发布时间 time_tag card.find(time) work_data[publish_time] time_tag.get(datetime) if time_tag else None all_works.append(work_data) # 礼貌性延迟避免请求过快 time.sleep(1) print(f爬取完成共获取 {len(all_works)} 条作品数据。) return all_works # 假设的URL实际使用时需要替换 base_url https://example-ai-art-community.com/works?page{} works_data scrape_community_page(base_url, max_pages3) # 将数据转换为DataFrame方便后续分析 df pd.DataFrame(works_data) print(df.head()) # 查看前几行数据 print(df.info()) # 查看数据概览这段代码定义了一个爬虫函数它会遍历指定页数的列表从每个作品卡片中提取我们需要的信息并存储到一个Pandas DataFrame里。DataFrame就像一张Excel表格非常适合做数据分析。3. 数据清洗与初步分析爬取下来的原始数据往往比较杂乱我们需要先清洗一下。# 1. 处理缺失值 print(清洗前数据形状:, df.shape) # 删除描述词Prompt完全为空的行 df_clean df.dropna(subset[prompt]).copy() print(清洗后数据形状:, df_clean.shape) # 2. 统一参数格式填充默认值如果需要 df_clean[steps].fillna(df_clean[steps].median(), inplaceTrue) # 用中位数填充步数缺失值 df_clean[cfg_scale].fillna(7.0, inplaceTrue) # 引导系数缺失值填充为7.0 df_clean[sampler].fillna(Unknown, inplaceTrue) # 3. 从描述词中提取可能的关键词或风格标签简单示例 # 假设风格标签包含在 [style: ...] 的括号中 def extract_style(prompt): match re.search(r\[style:\s*(.*?)\], prompt, re.IGNORECASE) return match.group(1).strip() if match else General df_clean[inferred_style] df_clean[prompt].apply(extract_style) # 4. 计算一些衍生字段比如描述词长度 df_clean[prompt_length] df_clean[prompt].apply(len) print(df_clean[[prompt, inferred_style, steps, cfg_scale, likes]].head())数据清洗好后我们就可以开始做一些简单的分析了。# 基本统计信息 print( 基本统计 ) print(f作品总数: {len(df_clean)}) print(f平均点赞数: {df_clean[likes].mean():.1f}) print(f最常用采样器: {df_clean[sampler].mode().iloc[0]}) print(fSteps中位数: {df_clean[steps].median()}) print(fCFG Scale中位数: {df_clean[cfg_scale].median()}) # 热门风格TOP 10 style_counts df_clean[inferred_style].value_counts().head(10) print(\n 热门风格TOP 10 ) print(style_counts)4. 使用Matplotlib进行数据可视化数字看累了让我们把数据变成图表。Matplotlib是Python绘图的基础库功能强大。4.1 可视化一热门描述词词云与风格分布首先我们看看大家都喜欢用什么风格。import matplotlib.pyplot as plt import seaborn as sns from wordcloud import WordCloud # 需要安装: pip install wordcloud # 设置中文字体如果需要显示中文 # plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 # plt.rcParams[axes.unicode_minus] False # 用来正常显示负号 # 绘制风格分布柱状图 plt.figure(figsize(12, 6)) top_styles style_counts.head(8) # 取前8种风格 ax sns.barplot(xtop_styles.index, ytop_styles.values, paletteviridis) plt.title(影墨·今颜作品风格分布 (TOP 8), fontsize15) plt.xlabel(风格类型) plt.ylabel(作品数量) plt.xticks(rotation45) # 旋转x轴标签避免重叠 # 在柱子上方显示数量 for i, v in enumerate(top_styles.values): ax.text(i, v 0.5, str(v), hacenter, vabottom) plt.tight_layout() plt.show() # 生成描述词词云 all_prompts .join(df_clean[prompt].dropna().tolist()) wordcloud WordCloud(width800, height400, background_colorwhite, max_words100, contour_width1, contour_colorsteelblue).generate(all_prompts) plt.figure(figsize(12, 6)) plt.imshow(wordcloud, interpolationbilinear) plt.axis(off) plt.title(影墨·今颜作品描述词词云, fontsize15) plt.tight_layout() plt.show()4.2 可视化二参数与受欢迎程度的关系参数设置如何影响作品的受欢迎程度以点赞数衡量我们用散点图和箱线图来看看。# 创建一个大画布包含多个子图 fig, axes plt.subplots(2, 2, figsize(14, 10)) fig.suptitle(生成参数与作品点赞数关系分析, fontsize16) # 子图1: 采样步数(Steps) vs 点赞数 axes[0, 0].scatter(df_clean[steps], df_clean[likes], alpha0.6, edgecolorsw, linewidth0.5) axes[0, 0].set_xlabel(采样步数 (Steps)) axes[0, 0].set_ylabel(点赞数) axes[0, 0].set_title(Steps vs Likes) axes[0, 0].grid(True, linestyle--, alpha0.7) # 子图2: 引导系数(CFG Scale) vs 点赞数 axes[0, 1].scatter(df_clean[cfg_scale], df_clean[likes], alpha0.6, colororange, edgecolorsw, linewidth0.5) axes[0, 1].set_xlabel(引导系数 (CFG Scale)) axes[0, 1].set_ylabel(点赞数) axes[0, 1].set_title(CFG Scale vs Likes) axes[0, 1].grid(True, linestyle--, alpha0.7) # 子图3: 不同采样器下的点赞数分布箱线图 sampler_likes_data [df_clean[df_clean[sampler]s][likes] for s in df_clean[sampler].unique()] axes[1, 0].boxplot(sampler_likes_data, labelsdf_clean[sampler].unique()) axes[1, 0].set_xlabel(采样器 (Sampler)) axes[1, 0].set_ylabel(点赞数) axes[1, 0].set_title(不同采样器作品点赞数分布) axes[1, 0].tick_params(axisx, rotation45) # 旋转x轴标签 # 子图4: 描述词长度与点赞数的关系 axes[1, 1].scatter(df_clean[prompt_length], df_clean[likes], alpha0.6, colorgreen, edgecolorsw, linewidth0.5) axes[1, 1].set_xlabel(描述词长度 (字符数)) axes[1, 1].set_ylabel(点赞数) axes[1, 1].set_title(Prompt长度 vs Likes) # 添加一条趋势线 import numpy as np z np.polyfit(df_clean[prompt_length], df_clean[likes], 1) p np.poly1d(z) axes[1, 1].plot(df_clean[prompt_length], p(df_clean[prompt_length]), r--, alpha0.8, label趋势线) axes[1, 1].legend() axes[1, 1].grid(True, linestyle--, alpha0.7) plt.tight_layout() plt.show()4.3 可视化三时间趋势与多维关联如果数据里有发布时间我们还可以分析创作活跃度随时间的变化。# 假设我们已经将publish_time转换为了datetime格式 df_clean[publish_time] pd.to_datetime(df_clean[publish_time], errorscoerce) df_time df_clean.dropna(subset[publish_time]).copy() if not df_time.empty: # 按周统计作品发布数量 df_time.set_index(publish_time, inplaceTrue) weekly_count df_time.resample(W).size() # 按周重采样 plt.figure(figsize(14, 5)) plt.plot(weekly_count.index, weekly_count.values, markero, linewidth2, markersize4) plt.title(影墨·今颜作品每周发布数量趋势, fontsize15) plt.xlabel(日期) plt.ylabel(作品数量) plt.grid(True, linestyle--, alpha0.5) plt.xticks(rotation45) plt.tight_layout() plt.show() # 热力图展示不同参数组合下的平均点赞数 # 将Steps和CFG Scale分箱计算每个区间的平均点赞数 df_time[steps_bin] pd.cut(df_time[steps], bins5) df_time[cfg_bin] pd.cut(df_time[cfg_scale], bins5) heatmap_data df_time.groupby([steps_bin, cfg_bin])[likes].mean().unstack() plt.figure(figsize(10, 8)) sns.heatmap(heatmap_data, annotTrue, fmt.1f, cmapYlOrRd, linewidths.5) plt.title(不同Steps与CFG Scale组合下的平均点赞数热力图, fontsize15) plt.xlabel(CFG Scale区间) plt.ylabel(Steps区间) plt.tight_layout() plt.show() else: print(时间数据不足或格式有误无法进行时间序列分析。)5. 从数据中我们能发现什么跑完代码生成了一堆图表现在我们来看看这些图表告诉了我们什么。当然以下结论是基于我们假设的数据你的实际数据可能会揭示不同的故事。风格偏好从风格分布图来看“Digital Painting”数字绘画和“Anime”动漫风格的作品数量遥遥领先说明社区用户对这两种风格的接受度和创作热情最高。如果你想快速获得关注从这两种风格入手可能是不错的选择。参数选择从散点图看点赞数高的作品其采样步数Steps多集中在20-40这个区间引导系数CFG Scale则集中在6-9之间。这提供了一个参考范围盲目提高步数或系数并不一定能获得更好反馈。箱线图显示某些采样器如DPM 2M Karras产出的作品点赞数中位数更高稳定性也更好。描述词趋势词云图里“masterpiece”杰作、“best quality”最佳质量、“detailed”细节丰富等质量导向词汇以及“1girl”一个女孩、“landscape”风景等主题词汇出现频率很高。这反映了社区的一种“通用配方”文化。同时描述词长度与点赞数的趋势线略微向上说明更详细、具体的描述可能有助于生成更符合预期、从而更受欢迎的作品。创作活跃度如果时间趋势图显示发布量在某个时间段激增很可能对应了模型新版本发布或某个热门挑战赛这反映了社区的活力点。6. 总结这次实战我们完成了一次从数据采集到洞察呈现的完整旅程。通过Python爬虫我们高效地收集了社区作品数据利用Pandas我们清洗并梳理了这些数据最后借助Matplotlib和Seaborn我们将冰冷的数字转化为了直观的图表。整个过程下来最大的感受是数据真的能让模糊的感觉变得清晰。以前可能只是“觉得”某种风格火现在有了数据支撑。对于创作者这些图表是灵感和方向的参考对于开发者它们是模型迭代和优化的重要反馈。你可以把这个项目当作一个起点。代码和思路完全可以复用去分析其他AI绘画模型社区或者增加更复杂的分析维度比如结合图像分析技术直接对爬取下来的图片进行色彩、构图分析。数据的玩法还有很多关键在于动手去试。希望这篇实战能帮你打开一扇门用数据思维去更好地理解和玩转AI创作。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。