小红书做种草、竞品分析、达人投放,都需要批量采集笔记数据。
手动复制粘贴太慢,用影刀RPA可以自动搜索关键词、翻页、采集标题/作者/点赞数,最后存到Excel。
我把整个流程拆成5个核心步骤,从打开小红书到翻页采集,每步都有稳定处理浮层和滚动加载的技巧。
一、整体流程设计
| 步骤 | 子流程 | 核心指令 |
|---|---|---|
| 1 | A01_打开小红书并登录 | 打开网页、等待元素出现、输入账号密码 |
| 2 | B01_搜索关键词 | 输入文本、点击搜索 |
| 3 | B02_滚动加载笔记列表 | 滚动页面、等待新内容、判断是否到底 | | 4 | B03_批量采集笔记数据 | 获取相似元素列表、提取标题/作者/点赞数 | | 5 | C01_写入Excel | 创建文件、追加行、保存 |
注意: 小红书是滚动加载(无限滚动),没有“下一页”按钮,需要用滚动触底的方式。
二、第一步:打开小红书并登录(可选)
小红书可以不登录浏览,但登录后能采集更多数据(如收藏、关注等)。
操作步骤
- 打开网页
指令:
打开网页,URL填 https://www.xiaohongshu.com
- 等待首页加载完成
等待元素出现:小红书Logo或搜索框
# 等待搜索框出现
//input[@placeholder='搜索']
3. 点击登录按钮(如果需要)
捕获登录按钮(右上角)
//div[contains(@class,'login-btn')]
- 扫码或账号登录
建议用“半自动”方式:流程暂停,手动扫码登录后再继续。
用等待元素出现(已登录头像, 60秒),超时则报错。
版本差异: 社区版30分钟时长,登录过程也计时,建议提前手动登录好,流程里跳过登录步骤。
三、第二步:搜索关键词
操作
- 在搜索框输入关键词
捕获搜索框元素,用输入文本指令
# 小红书搜索框
//input[@placeholder='搜索']
2. 点击搜索按钮
捕获搜索按钮(放大镜图标)
//div[@class='search-icon']
- 等待搜索结果页加载
等待笔记卡片出现
//section[contains(@class,'note-item')]
处理搜索联想词
如果输入后出现下拉联想词,可以:
- 直接按回车键(用
模拟按键(enter)) - 或者等待0.5秒后点击第一个联想词
四、第三步:滚动加载笔记列表(核心难点)
小红书是无限滚动,滚动到底部自动加载下一批笔记,没有“下一页”按钮。
滚动采集逻辑

上次笔记数量 = 0
无新内容计数 = 0

循环 当 无新内容计数 < 3
# 滚动到底部
滚动页面(到底部)
# 等待新内容加载
等待(2000)
# 获取当前笔记卡片列表
当前笔记列表 = 获取相似元素列表(笔记卡片)
当前数量 = 长度(当前笔记列表)
如果 当前数量 == 上次笔记数量
无新内容计数 = 无新内容计数 + 1
否则
无新内容计数 = 0
上次笔记数量 = 当前数量
# 可选:采集当前所有新出现的笔记(增量)
关键元素捕获
# 捕获:单个笔记卡片(父容器)
//section[contains(@class,'note-item')]
# 捕获:笔记标题(在卡片内部,用相对路径)
.//a[contains(@class,'title')]
# 捕获:作者昵称
.//span[contains(@class,'author')]
# 捕获:点赞数
.//span[contains(@class,'like-count')]
注意: 点赞数可能显示为“1.2万”,需要后期用Python清洗。
稳定滚动技巧
- 每次滚动后固定等待1-2秒(小红书加载慢时可能需要3秒)
- 连续3次滚动后数量不变,认为已到底部
- 可以设置最大滚动次数(比如30次),防止死循环
五、第四步:批量采集笔记数据
有两种采集方式:
方式1:滚动同时增量采集(推荐)
每次滚动后,只采集新出现的笔记,避免重复。
实现方法:
记录上一次采集到的笔记数量,只从上次数量+1开始取。
方式2:滚动结束后一次性采集
滚动到底部后,所有笔记都已加载,再用“获取相似元素列表”一次性采集全部。
优点: 代码简单
缺点: 滚动过程中如果页面刷新,可能丢失数据
提取每条笔记的数据(子流程)
输入参数:当前笔记卡片(元素对象)
输出参数:标题、作者、点赞数
# 基于卡片相对定位
标题 = 获取元素文本(当前卡片, ".//a[contains(@class,'title')]")
作者 = 获取元素文本(当前卡片, ".//span[contains(@class,'author')]")
点赞数原始 = 获取元素文本(当前卡片, ".//span[contains(@class,'like-count')]")
# 清洗点赞数(将“1.2万”转为12000)
如果 contains(点赞数原始, "万")
点赞数 = 转换为数字(替换(点赞数原始, "万", "")) * 10000
否则
点赞数 = 转换为数字(点赞数原始)
设置输出参数(标题, 标题)
设置输出参数(作者, 作者)
设置输出参数(点赞数, 点赞数)
采集时的反爬注意事项
- 小红书有反爬机制,不要滚动太快。每次滚动间隔至少2秒
- 建议每次采集不超过200条笔记,分时段运行
- 如果出现验证码,流程暂停并发送通知(可以用飞书消息)
六、第五步:写入Excel
创建Excel并写入表头
打开Excel("C:\小红书采集结果.xlsx", Excel对象)
写入行数据到表格(Excel对象, "A1", ["标题", "作者", "点赞数"])
循环写入数据
循环遍历列表(采集结果列表, 单条数据)
追加行到表格(Excel对象, [单条数据.标题, 单条数据.作者, 单条数据.点赞数])
保存关闭
保存Excel(Excel对象)
关闭Excel(Excel对象)
七、完整流程代码(逻辑结构)
主流程:
调用子流程(A01_打开小红书并登录)
调用子流程(B01_搜索关键词, 输入={关键词: "RPA教程"})
全部采集数据 = [] # 存储所有笔记
# 滚动采集
上次数量 = 0
无新次数 = 0
循环 当 无新次数 < 3
滚动页面(到底部)
等待(2000)
当前卡片列表 = 获取相似元素列表(笔记卡片)
当前数量 = 长度(当前卡片列表)
如果 当前数量 == 上次数量
无新次数 = 无新次数 + 1
否则
# 增量采集新出现的笔记
For i = 上次数量 To 当前数量 - 1
当前卡片 = 当前卡片列表[i]
调用子流程(B03_采集单条笔记,
输入={当前卡片: 当前卡片},
输出={标题: t, 作者: a, 点赞数: l})
追加到列表(全部采集数据, [t, a, l])
上次数量 = 当前数量
无新次数 = 0
# 防止无限滚动,最多30次
如果 滚动次数 >= 30
跳出循环
调用子流程(C01_写入Excel, 输入={数据列表: 全部采集数据})
八、常见问题速查
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 滚动后不加载新笔记 | 滚动速度太快,小红书判定为机器 | 每次滚动后固定等待2-3秒 |
| 捕获不到笔记标题 | 标题在<a>标签里但class动态 | 用//a[contains(@href,'/explore/')]定位 |
| 点赞数带“万”转换错误 | 正则提取数字失败 | 用Python代码处理:re.sub(r'[^0-9.]','', '1.2万') 再乘10000 |
| 登录滑块验证码 | 小红书风控 | 换用扫码登录,或用半自动方式手动过验证 |
| 采集到一半弹出验证码 | 采集频率过高 | 降低滚动速度,增加随机等待(2-4秒) |
| 社区版30分钟不够用 | 滚动+等待耗时 | 减少采集条数(比如只采50条),或升级创业版 |
九、扩展:采集笔记详情页
如果还需要采集笔记的正文、发布时间、评论数,需要点进详情页。
操作
在滚动采集时,获取笔记链接,再逐个打开详情页采集。
# 捕获笔记详情页链接
.//a[contains(@href,'/explore/')]/@href
然后循环打开链接,采集详情页数据(参考子流程拆分原则)。
注意: 点进详情页会消耗更多时间,社区版30分钟可能不够。建议先采集列表数据,再单独跑一个流程采详情。
推荐资源
- 影刀官方学院: “实战案例——小红书笔记采集”(有完整视频)
- 我的文章联动:
- 滚动加载详细方案:[翻页逻辑的3种实现方式(选题池16号)]
- XPath定位技巧:[父子元素定位与相似元素列表(选题池3号)]
- 数据清洗:[Python代码指令做数据清洗(选题池18号)]
- 工具推荐: 小红书网页版用Chrome无痕模式可以减少风控
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
