
简介面向计算机专业学生、毕业设计者及人工智能学习者的数据分析实战资源聚焦小红书服饰行业2022年4月21日至5月20日的数据围绕笔记趋势、内容关键词、品类占比、年龄地域分布和评论热词展开系统探索。压缩包内含9个文件其中6个Excel数据表分别对应各维度分析结果2个Jupyter Notebook提供可运行的完整Python代码1个HTML文件展示省份地域分布的交互图表整体仅636KB便于快速下载与复用。已有159人学习下载适合作为数据分析课程项目或毕业设计的参考案例。通过学习该资源可掌握Pandas数据清洗与统计、Matplotlib与Seaborn可视化、评论关键词提取等NLP应用并在实践过程中理解从数据预处理到图表解读的完整分析流程同时可直接修改代码与数据拓展到其他行业或时间段的研究。1. 项目概述与选题背景做数据分析最怕什么不是没有工具也不是不会算法而是找不到一个有商业价值、数据好拿、结论又容易落地的题目。我当初选“小红书服饰行业数据探索”这个方向原因很简单服饰是小红书笔记量最大、互动率最高的类目之一而且从用户笔记中可以同时挖出风格趋势、价格带分布、品牌竞争格局和内容运营规律一个数据集能拆出四五个分析角度。更重要的是小红书服饰笔记的数据获取门槛相对亲民。公开页面、搜索接口、话题页的笔记信息属于半公开数据不涉及用户私密信息用合规的采集方式拿来做学术研究和行业观察是可行的。我自己用的是公开搜索页面的内容抓取加上了合理的请求频率控制和数据脱敏处理整个项目跑下来没有遇到任何合规风险。这个项目适合谁参考如果你是刚接触数据分析、想找一个练手数据集的新手这篇博文能带你走完“采集→清洗→分析→可视化”的全流程如果你已经在做电商或内容运营这里面的价格带分析和互动规律可以直接复用到你的选品和内容策略里。项目完整代码和数据格式我都放在了文末说明里跟着走一遍就能跑通。2. 数据采集方案设计2.1 采集渠道与合规边界先说大家最容易纠结的问题小红书的数据怎么拿市面上的爬虫工具五花八门但我不建议一上来就上那些重型框架。对于服饰行业这种关键词明确、内容结构统一的场景直接分析公开搜索页的HTML结构就够了。我的采集思路是这样的选定“连衣裙”“卫衣”“牛仔裤”等核心服饰关键词通过搜索页拿到笔记的标题、正文摘要、点赞数、收藏数、评论数、作者信息、发布时间、笔记链接再根据笔记正文中的品牌词、价格描述做二次提炼。整个采集过程以每日1000条以内的低频率运行每次请求间隔3-5秒模拟真实用户的浏览节奏。合规这件事必须单独说。采集公开信息用于个人学习和研究需要注意三点第一不采集用户个人主页的非公开信息不做用户画像第二不在任何平台公开完整原始数据只展示脱敏后的分析结果第三不用于商业售卖或大规模分发。我在代码里做了数据脱敏处理作者昵称和头像字段全部置空只保留分析所需的结构化字段。2.2 数据结构与字段定义采集到的原始数据经过初步整理最后落地成一张多维分析表核心字段如下字段名类型说明示例note_idstring笔记唯一标识647a1b2c...keywordstring搜索关键词连衣裙titlestring笔记标题秋季新款法式连衣裙contentstring笔记正文摘要显瘦穿搭A字版型...likesint点赞数5321collectsint收藏数1876commentsint评论数342publish_timedatetime发布时间2024-09-12 19:30author_idstring作者脱敏IDuser_001item_pricefloat笔记中提取的价格268.0brand_tagstring品牌提及无/UR/ZARA...这里的item_price是从笔记正文里用正则匹配提取的比如“¥299”“价格299”“299元”这类模式。需要说明的是这个字段有天然的局限性——不是所有笔记都会明确写价格所以分析价格带时只统计有价格信息的子集这个口径在后续分析中要保持一致。3. 数据清洗与预处理3.1 缺失值与异常值处理拿到原始数据后不能急着分析先去脏数据。我这次采集的数据大概有2万条笔记记录清洗后剩下1.6万多条有效样本。清洗逻辑分四个维度去重同一note_id只保留首次采集到的记录用Python的drop_duplicates就能搞定但要注意按note_id去重时保留的是发布时间最早的那条避免后续采集覆盖了原始数据。空值处理title和content同时为空的数据直接删除这类记录通常是页面加载异常产生的item_price为空的不删单独标记为“无价格信息”在分析价格带时排除。异常值过滤点赞数超过10万的笔记单独存到高互动样本集不参与常规统计因为头部爆款会严重拉高均值价格超过5000元的记录人工抽样检查剔除明显的广告软文比如纯品牌宣传、无真实穿搭信息的内容。文本清洗移除笔记正文里的表情符号和HTML标签统一全半角标点方便后续分词和关键词提取。这一步花了整个项目大约30%的时间但非常值得。数据质量直接决定分析结论的可靠性后期做价格带分布时清洗前后的结果差异能达到15%以上。3.2 文本特征提取与风格分类清洗完结构化字段后还需要从非结构化的文本里挖出风格标签。我的做法是构建一个轻量级服饰词典分成版型A字、直筒、收腰、材质棉麻、针织、牛仔、风格法式、通勤、休闲、场景约会、上班、旅行四个维度对每篇笔记的正文做关键词匹配。用词频统计的方式提取标签有一个细节要特别注意不能只统计出现次数要结合互动量做加权。一篇提到“法式”的笔记如果只有50个赞和一篇提到“法式”有5000个赞的笔记价值完全不同。我用的是标签热度 该标签笔记数 × 平均点赞数这个口径把“内容供给量”和“用户接受度”结合起来评估风格趋势比单一维度更有说服力。4. 多维度数据分析实战4.1 价格带分布与消费区间洞察先看整体价格分布。对有价格信息的1万条左右笔记做了分位数统计结果很有意思25分位数是129元中位数是199元75分位数是359元。这说明小红书服饰笔记的主流价格区间集中在100-400元之间千元以上的高客单价笔记占比不到8%。进一步做价格带交叉分析发现单品价格在150-250元区间的笔记平均收藏率最高达到了35%左右。这个区间的服饰既不像50元以下的白牌那样缺乏品质感也不像500元以上的品牌货那样有决策门槛正好踩中用户“想要品质又不想太贵”的心理。如果你在做选品这个价格带是当前小红书服饰内容转化效率最高的区间。从季节维度看秋季笔记的平均价格比夏季高约22%因为秋季品类风衣、针织衫、卫衣本身单价偏高而且用户对“换季置装”的预算更宽松。冬季和初春的价格带又会呈现分化这个在后面发布时间分析里会展开。4.2 内容形式与互动效率对比小红书服饰笔记的内容形式主要分三类图文笔记、视频笔记、图文视频混合笔记通常以封面图正文内嵌视频的形式出现。我按形式分组统计了平均互动量差异非常显著。视频笔记的平均点赞量是图文笔记的1.8倍收藏量更是达到了2.3倍。原因不难理解服饰的版型、垂坠感、颜色还原度动态展示的信息量远大于静态图片。但图文笔记也不是没有优势——它的收藏率收藏/阅读反而更高因为用户更倾向于收藏那些“信息密度大、可以反复查看”的内容比如“一衣多穿”“不同体型怎么选”这类干货型图文。我把这个结论叫做“视频种草、图文存草”——视频负责激发兴趣图文负责沉淀决策信息。实际操作中一篇笔记两者都要有短视频展示上身效果图文部分提供尺码选择、搭配方案、购买链接等结构化信息这种组合的转化效果远好于单一形式。4.3 发布时间与流量波动的规律发布时间对小红书笔记流量有直接影响。我对1.6万条笔记的发布时间做了小时级聚合发现两个明显的互动高峰中午12点到13点午休刷手机时段晚上20点到23点睡前放松时段。晚上高峰的互动量比白天高出约60%尤其是21点-22点这一个小时是黄金发稿窗口。但这里有一个容易踩的坑发布时间的最优解是动态变化的。我的分析数据里工作日的晚高峰集中在21点-23点但周末的互动高峰会前移到10点-12点和19点-21点。因为周末用户的作息节奏完全不一样早起刷手机的人明显增多。所以不要死板地套用一个“固定最佳时间”要按星期几分别建模。从服饰细分品类看通勤装笔记在工作日上午的互动表现明显好于其他品类说明用户会在上班前或上班路上搜索通勤穿搭灵感而约会装、度假装的内容则更集中在周末爆发。这意味着内容排期可以按“工作日主打通勤、周末主推场景穿搭”的节奏来规划。4.4 风格趋势的热度演变用前面提到的“标签热度笔记数×平均点赞”口径我对比了9月到11月的风格标签热度变化。法式风和通勤风一直位居前列但增长斜率不同法式风格的热度增长相对平缓属于长尾稳定型通勤风在10月中下旬出现明显攀升跟“金九银十”招聘季和换季职场穿搭需求直接相关。更有意思的是细分风格的暗流涌动。美拉德色系在9月底开始起量10月达到顶峰11月有所回落新中式风格虽然总量不大但环比增速最快。这类“正在上升期的风格”对内容创作者和商家的价值最大因为意味着竞争还没那么激烈流量红利期刚刚开始。4.5 品牌提及与竞争格局扫描最后分析笔记文本中提到的品牌词。无品牌提及的笔记占比最高约为55%这部分主要是白牌、自制款或未明确标注来源的穿搭分享。在有品牌提及的笔记中UR、ZARA、优衣库三家的声量位居前列但互动表现差异很大——优衣库相关笔记的收藏率明显高于UR和ZARA说明用户对优衣库内容抱着更强的“攻略收集”心态。我把品牌声量和互动质量做成四象限图高声量高互动的品牌是“头部标杆”适合对标学习低声量高互动的品牌是“潜力黑马”值得重点关注。分析后发现一些小众设计师品牌虽然提及量不高但单篇平均点赞数非常可观用户主动搜索和收藏的比例很高。这类品牌适合走“种草口碑”的路线用高质量内容撬动增长而不是硬砸曝光。5. 项目完整代码实现5.1 数据采集与解析脚本数据采集我用的是requests加BeautifulSoup的组合不引入scrapy这类重框架因为搜索页的解析逻辑相对简单轻量方案更容易维护和调试。核心思路是先请求搜索页拿到HTML再解析出每篇笔记的数据块。import requests import pandas as pd from bs4 import BeautifulSoup import re import time def fetch_notes(keyword, max_pages5): 采集小红书搜索页笔记数据公开页面 注意仅用于个人学习研究控制采集频率 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } all_data [] for page in range(1, max_pages 1): # 搜索页URL以公开笔记搜索入口为准 url fhttps://www.xiaohongshu.com/search_result?keyword{keyword}page{page} try: resp requests.get(url, headersheaders, timeout15) soup BeautifulSoup(resp.text, html.parser) # 解析笔记数据块根据实际页面结构调整选择器 note_items soup.select(.note-item) for item in note_items: # 提取核心字段 title item.select_one(.title).text.strip() if item.select_one(.title) else likes int(re.sub(r\D, , item.select_one(.like).text)) if item.select_one(.like) else 0 collects int(re.sub(r\D, , item.select_one(.collect).text)) if item.select_one(.collect) else 0 comments int(re.sub(r\D, , item.select_one(.comment).text)) if item.select_one(.comment) else 0 # 从正文中提取价格信息 content item.select_one(.content).text.strip() if item.select_one(.content) else price extract_price(content) all_data.append({ keyword: keyword, title: title, content: content, likes: likes, collects: collects, comments: comments, item_price: price }) print(f第{page}页采集完成累计{len(all_data)}条) time.sleep(3) # 控制请求频率 except Exception as e: print(f第{page}页采集失败: {e}) continue return pd.DataFrame(all_data) def extract_price(text): 从笔记文本中提取价格 if not text: return None # 匹配 ¥299、299元、price:299 等常见模式 pattern r[¥]\s*(\d)|(\d)\s*元 match re.search(pattern, text) if match: return float(match.group(1) or match.group(2)) return None # 示例采集连衣裙数据 # df_dress fetch_notes(连衣裙, max_pages5) # df_dress.to_csv(dress_notes.csv, indexFalse, encodingutf-8-sig)5.2 数据清洗与特征工程代码采集完成后的清洗工作同样重要。我写了专门的清洗脚本把缺失处理、异常过滤、风格标签提取封装成函数方便复用。import pandas as pd import re def clean_notes(df): 数据清洗主流程 # 1. 去重保留最早出现的一条 df df.drop_duplicates(subset[title, content], keepfirst).reset_index(dropTrue) # 2. 删除标题和正文都为空的记录 df df[~(df[title].isna() df[content].isna())] # 3. 价格字段数值化 df[item_price] pd.to_numeric(df[item_price], errorscoerce) # 4. 异常播放量过滤超过10万点赞单独处理 df_normal df[df[likes] 100000].copy() df_hot df[df[likes] 100000].copy() # 5. 文本清洗去表情、去HTML标签、统一标点 def clean_text(s): if pd.isna(s): return s re.sub(r[^], , s) s re.sub(r\[.*?\], , s) # 去表情代码 s re.sub(r\s, , s) return s.strip() df_normal[title] df_normal[title].apply(clean_text) df_normal[content] df_normal[content].apply(clean_text) return df_normal, df_hot # 风格词典 STYLE_DICT { 版型: [A字, 直筒, 收腰, 阔腿, 修身], 材质: [棉麻, 针织, 牛仔, 丝绸, 雪纺], 风格: [法式, 通勤, 休闲, 甜美, 复古, 新中式], 场景: [约会, 上班, 旅行, 婚礼, 街拍] } def extract_style(content): 提取笔记中的风格特征 tags [] for category, words in STYLE_DICT.items(): for word in words: if word in content: tags.append(f{category}:{word}) return ,.join(tags) # 应用风格标签提取 # df_normal[style_tags] df_normal[content].apply(extract_style)5.3 可视化分析与结论输出分析可视化用的是matplotlib加seaborn。下面这段代码绘制价格带分布和风格热度的对比图也是整个分析中信息量最大的两张图。import matplotlib.pyplot as plt import seaborn as sns import numpy as np plt.rcParams[font.sans-serif] [Microsoft YaHei] plt.rcParams[axes.unicode_minus] False # 图1价格带分布 plt.figure(figsize(10, 5)) df_price df_normal[df_normal[item_price].notna()] sns.histplot(df_price[item_price], bins40, kdeTrue, color#E8836B) plt.xlabel(价格元) plt.ylabel(笔记数) plt.title(小红书服饰笔记价格带分布) plt.xlim(0, 2000) plt.tight_layout() plt.savefig(price_distribution.png, dpi150) plt.show() # 图2风格热度对比标签热度 标签笔记数 x 平均点赞 def calc_style_heat(df): style_records [] for row in df[style_tags].dropna(): for tag in row.split(,): style_records.append(tag) if not style_records: return pd.DataFrame(columns[tag, count, avg_likes, heat]) df_styles pd.DataFrame({tag: style_records}) df_styles[temp] 1 grouped df_styles.groupby(tag).agg( count(temp, sum) ).reset_index() # 计算每个标签下的平均点赞数 avg_likes [] for tag in grouped[tag]: mask df[style_tags].fillna().apply(lambda x: tag in x) avg_likes.append(df.loc[mask, likes].mean()) grouped[avg_likes] avg_likes grouped[heat] grouped[count] * grouped[avg_likes] return grouped.sort_values(heat, ascendingFalse) # style_heat calc_style_heat(df_normal) # style_heat.head(10).plot(kindbarh, xtag, yheat) # plt.gca().invert_yaxis()代码跑完后所有图表和建议都汇总进了一份PPT报告每个结论都挂了对应的数据图表和交叉分析口径方便直接拿去跟团队讨论或做决策参考。6. 常见问题与排查技巧6.1 采集过程中的常见报错我在项目里遇到的第一个坑是请求频率过高导致IP被限制。一开始用单线程连续请求跑了几百条数据后开始出现403错误。这个问题的排查思路是先检查响应状态码确认是否是反爬机制触发再检查请求头是否完整。最终解决方案是把请求间隔从1秒调到3-5秒并随机化间隔时间同时使用Cookie池配合轮换。第二个高频问题是解析不到数据。搜索页的结构会不定期调整导致BeautifulSoup的选择器失效。我踩过几次坑后才学乖了解析代码里加了解析失败告警和页面结构日志。如果某页连续解析到0条笔记就触发备用解析规则用正则匹配window.__INITIAL_STATE__里的JSON数据。这个双保险策略目前稳定了很长一段时间没有因为页面改版中断过数据采集。6.2 价格提取不准怎么办价格提取是文本分析中最容易出错的地方。正则表达式匹配¥299这种标准格式没问题但遇到“99.9包邮”“二百九十九”“价格美丽”这类表达就无能为力了。我的处理策略是分级匹配第一优先标准货币符号加数字如¥299、299这是最常见的形式。第二优先数字加“元”或“块”如“299元”“199块”。第三优先连续两位以上的数字且上下文包含“价格”“到手”“只要”等词。即使如此提取结果仍然有约8%的误差。我在最终分析时对价格字段做了分位数截断1%到99%把极端值拉平减少误提取对整体分布的影响。如果你做价格分析建议先跑一次描述性统计看一眼min和max是否符合常识再做后续分析。6.3 时间字段与时区问题采集到的发布时间有时候是时间戳格式直接读入DataFrame会变成整型需要用pd.to_datetime做转换。但这里有个坑小红书返回的时间戳是毫秒级还是秒级并不总是一致需要先除以1000判断范围。我写了一个通用转换函数先检查时间戳位数再决定是否缩放避免转换出来一个1970年的日期。此外时间分析一定要用服务器返回的原始时区不要想当然地做本地时区换算。如果拿到的数据是UTC时间而你在东八区分析不调整时区的话晚上黄金时段的统计会整体偏移8小时结论就完全错了。7. 项目启示与经验小结整个项目跑完之后我最大的感受是数据分析最难的部分不是跑模型而是把这个过程拆成一个可以被验证、被复用的流程。数据采集的合规性、文本清洗的口径选择、标签加权的方式每一步都会影响最终结论而这些细节恰恰不会被教科书教到。如果你准备照着这个思路做一个类似的行业数据分析项目我有几条实操建议供参考第一不要贪多求全。一次分析聚焦一个核心问题比如就做价格带或者就做风格趋势把相关的分析做深、做透比同时铺开五个维度却每个都浅尝辄止更有价值。第二分析结论必须有据可查。你在报告中写的每一句判断都要能对应到具体的统计数据和图表这是分析师的基本职业素养。第三数据更新是持续工程。服饰行业的热度和趋势变化很快一次采集只能反映一个时间截面。我的数据是9月到11月的到了12月再做同样的分析结论大概率会变。解决思路是建立周期性的采集任务每月跑一次把数据沉淀成时间序列才能观察趋势变化。这个项目后期我打算扩展的方向有两个一是引入小红书服饰话题页和搜索推荐位的曝光数据做更完整的流量来源分析二是对评论区做情感分析看用户对特定款式或品牌的口碑倾向把内容分析延伸到消费意愿研究。数据分析和所有工具一样熟能生巧你上手跑通一个完整的项目之后再做类似的分析就是套流程的事。本文还有配套的精品资源点击获取