为什么需要爬取小红书数据
做内容运营的人,大概都遇到过一个问题:不知道发什么。
运营这件事,最怕的是闭门造车。你在这里想选题想了两天,结果别人发的内容比你精心策划的还要好。如果能知道同行在发什么、什么内容受欢迎,至少能给选题方向提供一些参考。
爬取小红书的数据,主要就是为了做竞品分析。看一下同类账号的发文频率、内容类型、标题风格、互动数据。这些信息可以帮你在做内容计划的时候更有方向。
我自己做的是一个国际教育方向的账号,一开始完全是在摸索。今天发一条课程介绍,明天发一条海外生活,数据起起伏伏,完全找不到规律。后来决定看看同行都在做什么,才想到用爬虫来获取数据。
选型考量:为什么是 MediaCrawler
爬虫工具其实不少,但针对小红书这种有反爬机制的平台,开箱即用的不多。
我之前试过自己写 requests 加代理池的方案,听起来很酷,实际跑起来全是坑。小红书的风控做得很细,光是登录这一关就能折腾一整天。好不容易爬上去了,发几个请求就被封了。维护成本太高,不适合做长期的数据收集。
后来在 GitHub 上看到了 MediaCrawler,试用了一下,感觉最大的优势是:
多平台支持。它不只能爬小红书,还支持抖音、B 站、微博。同一个工具,改一下参数就能切换平台。对我这种可能以后要做多平台内容的人来说,学一个工具就够了。
登录和 Cookie 管理已经处理好了。MediaCrawler 通过浏览器模拟登录,把登录状态持久化。我只需要第一次手动扫码登录,后续的请求都会自动携带有效的 Cookie。这部分是很多爬虫工具没有做好的地方。
数据输出格式规范。数据以 JSONL 格式输出,每行一个完整的 JSON 对象。后续无论是做统计分析还是训练模型,处理起来都很方便。
部署和配置的全过程
说回到部署,其实过程不算复杂,但有几个坑值得记下来。
环境准备
MediaCrawler 基于 Python,依赖管理用的是 pip。我是在 macOS 上跑的,步骤大概是:
git clone https://github.com/NanmiCoder/MediaCrawler.git
cd MediaCrawler
pip install -r requirements.txt
依赖比较多,建议用虚拟环境。我一开始直接在全局环境装,结果跟已有的包版本冲突了,折腾了半天。后来用 conda 新建了一个环境,一步到位。
浏览器驱动的配置
MediaCrawler 需要配合浏览器驱动来模拟登录。如果你机器上已经装了 Chrome,它会自动检测。但有些 macOS 用户会遇到 chromedriver 版本不匹配的问题。
解决方法也不复杂,去 Chrome 的关于页面看一下当前版本,然后到 chromedriver 官网下载对应的版本,放到 /usr/local/bin 下就行。
首次登录
第一次运行需要扫码登录。执行爬虫命令后,终端会弹出一个浏览器窗口,你打开小红书,扫一下二维码,登录成功后窗口会自动关闭,之后的请求就会一直保持登录状态。
这一步要注意的是:不要中途关闭浏览器窗口。我第一次跑的时候以为登录完就可以关了,结果爬虫报错说找不到登录状态。后来才知道,程序要等到浏览器自动关闭才算完整走完登录流程。
使用过程中遇到的坑和解决方案
浏览器的缓存问题
这是我在使用过程中遇到的第一个坑,也是最容易忽略的一个。
每次修改关键词或者筛选条件之后,需要清理浏览器的缓存数据。如果不清理,爬虫仍然会使用上次的缓存,抓回来的数据跟没换关键词之前一样。
第一次遇到这个问题的时候,我盯着数据看了半天,还纳闷说「怎么国际教育最新热点全是上周的内容」,后来排查了半天才意识到是缓存的问题。
解决方法很简单:每次改参数之前,手动清除一下浏览器缓存。或者更简单一点,在运行命令之前先清一下 browser_data 目录。
rm -rf ./browser_data/*
不过这个操作会清掉你保存的登录状态,需要重新扫码登录。所以我一般会在清缓存之前检查一下,确保其他配置没有问题,减少重新登录的次数。
反爬机制的处理
小红书对爬虫有一套比较成熟的防护措施。主要体现在两个方面:
频率限制。短时间内的请求次数过多,接口会直接返回 403。MediaCrawler 默认已经加了一些延迟,但如果抓取的数据量比较大,还是会被限。
我的做法是:每次抓取不超过 200 条数据,抓完之后等至少 30 分钟再跑下一次。虽然慢一点,但胜在稳定。
账号风控。如果某个账号突然出现大量的异常请求,小红书会对账号进行标记,轻则限制搜索功能,重则直接封号。
建议的做法是:如果账号之前没有爬虫行为记录,从低频开始慢慢提高频率。不要一上来就高频率抓取,给账号一个适应期。
JSONL 数据的处理
数据输出格式是 JSONL,每一行是一个独立的 JSON 对象。这个格式的好处是方便逐行读取,即使数据量很大也不会占用太多内存。
import json
from collections import Counter
# 读取数据
notes = []
with open("data.jsonl") as f:
for line in f:
notes.append(json.loads(line))
# 提取标题和互动数据
for note in notes:
title = note.get("title", "")
likes = note.get("liked_count", 0)
comments = note.get("comment_count", 0)
collects = note.get("collected_count", 0)
# 计算综合互动指数
engagement = likes + comments * 2 + collects * 3
print(f"{title} - 互动指数: {engagement}")
我一般会把数据先加载到 DataFrame 里做分析。Pandas 处理 JSONL 也特别方便:
import pandas as pd
df = pd.read_json("data.jsonl", lines=True)
# 按点赞数降序排列
top_notes = df.sort_values("liked_count", ascending=False)
print(top_notes[["title", "liked_count", "comment_count"]].head(10))
数据的实际用途:从数据到决策
花了这么多功夫拿到数据,最终还是要落到业务价值上。我分享一下我是怎么用这些数据的。
内容趋势分析
某段时间内,哪些话题出现的频率高、哪些笔记的互动量大,这些数据可以反映当前的热点方向。
举个具体的例子。我抓取了近三个月国际教育相关的小红书笔记,做了关键词词频统计之后发现,「夏校」和「背景提升」这两个词在 3 到 4 月份的出现频率明显上升。这就给了我一个选题方向——在 3 月初提前布局夏校相关的内容,抢占流量窗口期。
标题规律分析
对比高互动和低互动的笔记标题,你会发现一些共同的规律。高互动标题通常更具体、更直白,直接告诉读者你能获得什么信息。比如「美国 Top 30 大学录取率对比」就比「留学选校要注意什么」的互动数据好得多。
低互动标题往往比较抽象,或者太官方。读者刷到的时候不知道这篇文章能给自己带来什么价值,自然就不会点进去。
发布时间优化
不同时间段发布的内容,互动效果差别很大。通过数据可以找到自己账号的最佳发布时间。
我的分析结果是:国际教育类的内容,在工作日的晚上 8 点到 10 点发布,效果最好。周末的互动数据反而偏低,可能是因为大家周末不太想考虑学习相关的事情。
竞品内容分析
这是最直接的应用场景。看看同类型的账号发了什么、什么内容互动好、他们的标题怎么起的、封面图是什么风格。
我把抓到的数据按账号分组,统计了 TOP 10 竞品的发文频率和爆文率。发现做得好的账号基本保持一周 3-4 更的节奏,而且形式以图文为主,视频的比例不高。这个发现直接影响了我自己的内容策略——增加图文内容的比例,保持稳定的更新频率。
一些使用上的建议
最后分享几个使用 MediaCrawler 的个人建议:
第一,数据要持续采集,不要一次性抓完就不管了。热点和趋势是动态变化的,持续采集才能感知到变化的方向。我自己设置了一个定时任务,每周天晚上自动跑一次,把上周的数据抓下来做周报分析。
第二,注意使用频率,不要贪多。爬虫的本质是在平台的规则边缘试探,保持克制才能持久。我见过有人一次性抓几万条,结果第二天账号就废了。细水长流才是正解。
第三,数据只是参考,不能替代内容质量。爬虫能告诉你什么内容受欢迎,但不能保证你按照这个方向发就一定火。内容本身的质量、封面图的设计、文案的表达,这些才是决定性的因素。数据分析只是帮你提高成功的概率,不是让你闭着眼睛照抄。
说到底,爬虫只是一个工具,怎么用好这个工具,还是要看你对业务的理解和判断。希望这篇文章对你有所帮助,有问题的话欢迎在评论区交流讨论。