做服饰行业的小红书数据分析,最难的不是写代码,而是想明白“要分析什么”和“数据从哪里来”。这几年我一直在做内容电商相关的数据项目,其中一个反复被问到的需求就是:能不能用Python抓一批小红书服饰笔记,看看今年流行什么、什么品类在涨、什么风格在退。这个项目就是围绕这个需求展开的,最后形成了一套从数据采集、清洗、趋势计算到可视化展示的完整流程。这篇文章就把整个过程拆开讲清楚,从方案选型到具体代码、再到我踩过的坑,一次性交代完整。
这个项目适合谁参考?如果你是做电商选品、内容运营、品牌市场调研的,可以直接抄作业;如果你是刚入门Python数据分析,想找一个完整项目练手,也能从中看到真实项目里数据是怎么一步步变成结论的。整个过程大概分四块:数据怎么抓、抓完怎么洗、趋势怎么算、图表怎么画。
1. 整体设计与方案选型
1.1 为什么选小红书做服饰趋势数据源
做趋势分析,数据源的选择直接决定结论的可靠性。我对比过微博、抖音、淘宝这几个平台,最终选了小红书,原因有三个。
第一,小红书是典型的内容种草社区,用户发笔记的动机是“分享穿搭真实感受”,而不是销售转化。小红书服饰类笔记里大量出现“今日穿搭”“通勤穿搭”,标题和正文天然带有趋势特征词,比如“复古风回潮”“今年流行辣妹风”这类表述。淘宝上也有类似内容,但更多是商品标题,充满“爆款”“加绒加厚”这类运营词,趋势信号被稀释得很严重。微博内容量大但噪音高,短文本里信息密度低。小红书的笔记密度和表达方式,最适合做趋势词频分析。
第二,笔记自带的元数据非常完整。每篇笔记都有发布时间、评论数、点赞数、收藏数,这些是计算热度指数的基础。我之前做某宝数据分析时,销量数据不公开,只能靠爬到的评论数做近似。小红书至少把互动数据公开在页面上了,能让趋势衡量从“纯词频”上升到“词频加权热度”,这个差别非常关键。
第三,服饰内容在小红书上的标签体系比较成熟。用户发笔记时会打tag,比如#连衣裙 #春季穿搭 #法式风格,天然做好了粗分类。直接按标签聚合统计,省去了很多文本分类工作。
所以数据链路就是:小红书搜索页→按关键词采集笔记列表→抓取标题、正文摘要、发布时间、互动数据、标签列表→存到本地表格→进入清洗和分析流程。
1.2 技术栈选型
技术上用了比较常规的一套组合:Python 3.10 + requests + pandas + jieba + wordcloud + matplotlib/seaborn。没有上Scrapy,也没有上可视化大屏框架。
有人可能会问,为什么不用Scrapy?我这个项目的采集量级撑死几千条笔记,而且是小批量、多关键词、需要灵活调整参数的情况。用requests写循环是四五十行代码的事,用Scrapy要建项目结构、配置中间件,反而是杀鸡用牛刀。当然如果你计划长期采集、增量更新,Scrapy更合适。这属于项目规模决定工具选型。
可视化没选Tableau或Power BI,是因为这个项目要和采集、分析代码跑在同一个环境里,matplotlib和seaborn画出来的图直接出PNG,方便复用和批量生成。另外,后续如果要扩展成动态图表,pyecharts可以和现有代码无缝衔接。保持Python生态闭环,维护成本是最低的。
整个流程是:采集脚本输出CSV→pandas清洗和特征工程→生成趋势指标→可视化输出三张核心图表(词云、时序折线图、品类风格热力图)。这套流程跑一次大概十几分钟,完全可以做成周级自动更新。
2. 数据采集与字段设计的核心细节
2.1 采集字段和样本规划
采集字段直接决定了后面能做什么分析。很多人抓数据先抓了再说,结果发现自己想算“收藏比”的时候发现收藏数没抓,这就很尴尬。我在这个项目里规划了以下核心字段:
- 笔记ID:唯一标识,用于去重和关联
- 标题:核心文本信息,承载大量趋势词
- 正文摘要:补充文本信息
- 发布时间:趋势时间序列的基础
- 点赞数、收藏数、评论数:热度计算的三个维度
- 标签列表:品类/风格粗分类的来源
- 图片数(可选):有些品类(如穿搭合集)的逻辑是图片越多信息量越大
关键词规划是另一个关键点。直接搜“连衣裙”只能拿到一锅炖的结果,我用的是“品类词+场景/季节词”的组合策略,比如“春季 连衣裙”“夏季 T恤”“通勤 西装”等。一个组合给一个子任务,爬完后按组合打标签存进统一表里。样本量上,我的经验是每个组合抓100-150条有效笔记,6个组合抓下来差不多能到700到900条,做趋势分析足够了。这里还要注意一个点:平台搜索结果的排序是多样化的,推荐用“按时间排序”或“综合排序”各跑一次,避免某一种排序下内容同质化严重。
关于合规性,这个项目只采集网页公开可见的内容,采集频率做了限速处理,单次请求间隔控制在3到5秒,数据仅用于内部学习和趋势参考,不用于商业转化,也不涉及任何用户个人敏感信息。
2.2 数据清洗的几道工序
原始数据到手,第一件事永远是洗数据。我总结下来有三道工序必须做扎实。
第一道是去重。同一个笔记可能从多个关键词下被重复捕获,这时候不能简单按笔记ID去重就完了,因为如果我给“春季 连衣裙”和“夏季 连衣裙”两个关键词在不同时间跑了采集,同一篇笔记可能在不同批次里出现但热度数据已经变了。更稳妥的做法是保留最新采集批次的数据,或者干脆预设时间窗口,让不同关键词的采集时间尽量接近。
第二道是时间规范化。小红书页面上的时间格式五花八门:有的时间是“2小时前”、有的是“昨天”、有的是“03-24”、有的是具体日期。我在清洗脚本里写了一个时间转换函数,把相对时间全部换算成actual_date字段。这一步如果漏了,后面所有月度聚合都会出问题。
第三道是文本标准化。这一块主要是为后续分词做铺垫。要注意的是去表情符号和URL,这两类噪声如果不处理,会被jieba切成一堆没有意义的碎片。其次是同义词归一化,小红书用户对同一品类有无数种叫法:“小裙子”“裙装”“连衣裙”“one piece”,必须在分词前先统一映射到标准词。不然后面做词频统计的时候,“连衣裙”的真实热度会被碎片化,趋势判断自然不准。
2.3 三级标签体系设计
标签体系是我在这个项目里比较花心思的一环。直接对文本做无监督聚类在服饰领域很不可控,我的做法是建一套轻量级三级标签体系,然后靠关键词映射去匹配。
一级标签是服饰大类:上装、下装、外套、裙装、鞋靴、配饰。
二级标签是具体品类,比如上装下面分T恤、衬衫、卫衣、针织衫;下装下面分牛仔裤、休闲裤、半身裙;裙装下面再分连衣裙、半身裙等等。三级标签是风格词和场景词,比如法式、复古、极简、辣妹、通勤、约会、度假。
每个标签定义一组关键词映射表,清洗时用正则或词典匹配。这套体系的优势一目了然:后续的统计维度是可控的,不用面对几千个无规则词汇无从下手;效果也比纯词频好,因为词频反映的是“大家都在写什么词”,标签匹配反映的是“这些词背后代表什么品类/风格”。
标签匹配这一步做完,原始文本数据就变成了可以按时间、品类、风格三个维度切分的数据结构,这为后面所有的趋势计算打好了底子。
3. 趋势指标计算与可视化实现
3.1 热度指数怎么算才靠谱
热度指数是这个项目的核心指标。直接统计笔记数量其实是最粗糙的做法,因为笔记量大不等于热度高,平台算法下很多低质笔记本身就是低互动的。我用的是一个加权热度公式:
热度指数 = 0.3 × 点赞数 + 0.5 × 收藏数 + 0.2 × 评论数
这里权重不是拍脑袋定的,主要考虑的是服饰领域的互动特点。收藏权重最高,因为服饰笔记有一个核心场景——“先收藏,以后照着买”,高收藏意味着用户有购买意向,是“趋势即将转化为销售”的信号。点赞的互动成本最低,权重次之。评论能带来长尾讨论,但评论数受随机性影响较大,给到0.2就够。
计算“品类月度热度”时,我取当月该品类下所有笔记的热度指数之和,再除以当月的有效笔记数,得到“平均单篇热度”。平均值比总和更合理,因为不同月份采集到的笔记数量有波动,总和会把“发帖量变多”和“单品变火”混为一谈。
有了月度热度之后,增速的计算用环比。环比增速 = (本月热度 - 上月热度) / 上月热度。环比看短期趋势很灵敏,但要提醒一句,服饰季节性极强,3月环比2月大涨可能只是季节轮换,不代表某品类真正崛起。更好的做法是同时看同比,但小红书数据最多往回滚动一年,受限于数据量,同比通常只能做一个弱参考。
3.2 图表组合:趋势分析的三类主视图
这个项目的可视化部分,我最终沉淀了三类图表,分别回答三个不同层面的问题。
第一类是词云,回答“当下大家在聊什么”。词云我单独生成了一张全量词云和一张分风格词云。分风格词云很有用,比如把法式风格相关的笔记单独抽出来看词频,能明显看到“碎花”“波点”“茶歇裙”这类特征词,而极简风格里出来的则是“剪裁”“质感”“黑白灰”,这就是风格差异化最直观的体现。
第二类是月度时序折线图,回答“趋势是涨是跌”。以月份为横轴,某一品类或风格的平均热度指数为纵轴,画折线。图上叠加了整体笔记量的柱状图,这样可以看到“该品类讨论量”和“该品类单篇爆发力”两个维度。这里有一个值得说的经验:原始折线如果波动太大,可以先做三期移动平均再绘图,趋势会更清晰,但报告里要保留原始曲线,避免被质疑“数据被过度平滑”。
第三类是热力图,回答“品类和风格如何交叉”。横轴是二级品类(连衣裙、西装、T恤等),纵轴是风格词(法式、复古、极简、通勤),色块深浅表示热度指数大小。这张图是整个分析里信息量最大的,因为它能直接看出“法式连衣裙”是红海,“复古西装”可能还有机会,这种交叉洞察是单一维度的图给不了的。
下面给一个简化版的数据处理和可视化核心代码,完整的采集脚本篇幅太长就不贴了,重点看处理思路。
import pandas as pd import jieba # 停用词表,自行补充 stopwords = set(open("stopwords.txt", encoding="utf-8").read().split()) # 同义词映射表 synonyms = {"小裙子": "连衣裙", "裙装": "连衣裙", "onepiece": "连衣裙", "短外套": "西装外套", "小西装": "西装外套"} def clean_text(text): # 去除URL和emoji text = re.sub(r"http\S+", "", text) text = re.sub(r"\[.*?\]", "", text) # 同义词归一化 for k, v in synonyms.items(): text = text.replace(k, v) return text # jieba自定义词库,确保服饰词汇被正确切分 jieba.load_userdict("fashion_words.txt") def word_freq(text_series, top_n=50): counter = {} for t in text_series: words = jieba.lcut(clean_text(t)) for w in words: w = w.strip() if w and len(w) >= 2 and w not in stopwords: counter[w] = counter.get(w, 0) + 1 return sorted(counter.items(), key=lambda x: x[1], reverse=True)[:top_n]# 热度指数计算和月度聚合 df["hot_score"] = 0.3 * df["like_count"] + 0.5 * df["collect_count"] + 0.2 * df["comment_count"] df["month"] = pd.to_datetime(df["publish_date"]).dt.to_period("M") monthly = df.groupby(["month", "category"]).apply( lambda g: pd.Series({ "avg_hot": g["hot_score"].mean(), "note_count": len(g) }) ).reset_index()词云的生成我单独强调一句:直接调wordcloud库很容易踩中文乱码的坑,必须指定中文字体路径,例如C:\Windows\Fonts\msyh.ttc,不指定的话画出来就是一堆方块。还有,wordcloud默认会把“穿搭”“今日”这类高频词画得特别大,几乎占满整张图,所以停用词表一定要下狠手,把这类无信息量的词全部滤掉。
4. 实战中的高频问题与排查技巧
4.1 反爬策略与请求异常
这个项目里遇到最多的问题在网络请求阶段。最常见的现象是采集跑到一半,连续出现空结果或请求被重定向,通常是因为短时间请求太频繁触发了平台限制。我的处理方案是:单次请求强制随机延时3到5秒;随机切换User-Agent;每个关键词采集完成后停60秒再开始下一个。这套策略实测下来非常稳,但不保证永远有效,平台策略随时会变。
另外要做好什么?日志。每个批次采集要在控制台输出当前进度、已获取条数、异常信息,同时把这些写进本地日志文件。一旦中途中断,至少知道断在哪个关键词,不用从头跑。用try-except包裹请求,捕获异常后先记录再休眠重试,重试两次还不行就跳过,千万别让单条请求失败拖垮整个批次。
4.2 分词结果不符合预期
jieba分词在服饰领域表现确实一般,主要问题是专业词汇切分错误。比如“茶歇裙”会被切成“茶歇”和“裙”,“法式复古”会被切成“法式”和“复古”,这其实还好,但“泡泡袖”切成“泡”“泡袖”就很麻烦了。解决方法分两步:第一步,加载自定义词典,把所有服饰特征词按词写入fashion_words.txt;第二步,分完词之后跑一遍结果抽样检查,随机抽200条文本看分词结果,把切错的词补进词典。这一步手动操作大概要跑两三轮,效果比任何调参都明显。
4.3 图表错乱和中文字体问题
可视化阶段的经典问题是中文字体缺失。默认字体渲染中文会出现方框或乱码,在所有plt绘制前加两行代码:
plt.rcParams["font.sans-serif"] = ["Microsoft YaHei"] plt.rcParams["axes.unicode_minus"] = False在macOS上把Microsoft YaHei换成PingFang SC或Arial Unicode MS就行。另一个要注意的是seaborn在绘制热力图时,默认显示的数值位数太多,可以用annot_kws控制字号,再用fmt=".0f"把数据格式化成整数,图面会干净很多。
4.4 数据质量问题:注意“爆款偏差”
最后说一个数据质量上的大坑。小红书上的笔记互动数据是长尾分布:少数爆款笔记贡献了绝大多数点赞,大多数笔记的点赞也就几十几百。如果直接用平均热度,这一刻的月均值会往爆款方向严重偏移,而爆款的偶然性往往很大。所以我在计算月度趋势时,同时统计了中位数,并把中位数作为辅助参考。如果均值和中位数走向一致,说明趋势是整体性的;如果两者背离,说明只是个别爆款带动的波动,这两者反映的内容挖掘价值差异很大。我在实际做报告时,会把“均值-中位数是否存在剧烈分化”直接作为数据可信度评估的一条标准。
4.5 分析结论的置信度判断
做这种外部平台趋势分析,必须时刻提醒自己:分析的是“公开可见笔记”的样本,不是平台全量数据。被算法推荐到前排的笔记本身就有曝光偏见,同时搜索结果还会受排序策略影响。所以我给结论加了一条规则:某个趋势要被确认为有效,至少满足两个条件——连续两个周期同向变化,同时品类笔记量不少于30篇。单一月份、小样本量下的波动不算趋势,只是噪声。这个置信度判断规则在项目落地之后帮了大忙,避免了好几次被偶然波动带偏的判断。
5. 从数据到商业结论的落地方法
5.1 趋势数据到底怎么指导业务
分析做完了,图表也出了一堆,但很多人卡在最后一步:怎么从数据里读出结论并指导决策。我习惯把结论用三句话规定下来:什么品类在涨、什么风格在退、什么组合是新出现的。
“什么品类在涨”看环比增速排名,找连续两期排名上升的品类;“什么风格在退”看风格词的词频和热度变化,比如“复古风”连续三个月占比下滑;“什么组合是新出现的”这个最有趣,去看标签共现里新出现的组合。我之前某个模拟项目里就发现“山系”和“通勤”两个风格词在某两个月里共现次数急速增多,而人群逻辑确实是“都市人群开始把户外元素融入日常穿搭”,这就能支撑一个内容选题的立项。
还有个容易被忽略的分析维度是互动结构。同样热度指数下,某品类的收藏率明显高于点赞率,说明这个品类是“被种草”型内容,用户看完会存下来以备后用,这类品类的商业转化潜力更大。反之,评论占比高的品类,更多是话题讨论型,话题热度来得快去得也快。这个互动结构指标在选品决策中有很强的参考价值。
5.2 后续可以扩展的方向
这个项目跑通之后,扩展空间其实很大。最直接的扩展是把数据接入价格信息,小红书笔记文本里经常提到“百元内”“千元质感”,如果能抽取出价格带,就能分析不同热度品类对应的价格区间。另一个方向是做时间序列的预测,基于Facebook Prophet或者简单的ARIMA,对品类热度做近月预测,给供应链备货做参考。还有一个方向是做词频的语义网络分析,用共现关系画出风格特征词的关联图,这样能看到完整风格趋势背后的词群演化过程,而不仅仅是单独的几个词。
最后的经验总结
项目跑完之后我自己最大的体会是:趋势分析的瓶颈从来不在代码,而在对数据的理解。同样的数据,直接统计词频和做了标签映射之后统计热度指数,结果可能完全不一样。上个月我还用这套流程把一个模拟服饰品牌的选品报告完整跑了一遍,前前后后也就用了一个晚上。工具只是工具,真正值钱的是你定义指标的方式和对数据的敏感度。
最后分享两个小技巧。第一个是采集脚本一定要加断点续跑能力,把“已抓取ID列表”存下来,每次启动时读取这个集合做过滤,不然中途断了一命呜呼从头再来,非常崩溃。第二个是数据可视化时,保存图片统一用高DPI格式,也就是dpi=300,不然放在PPT里一看全是锯齿。这些细节单个看都不起眼,但在真实项目里,正是这些细节决定了你的分析结果能不能真正被人信任。