怎么按关键词批量导出小红书评论
两个接口:先用小红书笔记搜索,再对留下的每篇笔记调小红书笔记评论。下面的示例一共 7 次调用,花费 $0.14;失败的调用不扣费。
更新于
要做的事:新品要上市,或者要和某个竞品正面竞争,想知道小红书用户对这个品类到底怎么说。笔记代表博主想让你看到的东西,笔记下面的评论才是读者真正在问、在怀疑、在比较的东西。所以先搜关键词,留下讨论最多的那几篇,再一页一页读评论。最后得到一张 CSV:笔记标题、评论内容、评论者、点赞数、回复数、时间,以及小红书在评论旁显示的 IP 属地。
整个过程不需要小红书账号,不用 Cookie,也不用处理 xsec_token。每次调用就是带着 key 发一个 HTTPS 请求。
分步操作
第一步:找到值得读的笔记
调用小红书笔记搜索,query 按用户在 App 里的搜法写:防晒霜、防晒霜 油皮、敏感肌 防晒。这里有两个参数要关注:
sort:general(默认,小红书的综合排序)、latest(最新)或popular(最热)。挖评论时用popular,互动最多的笔记通常就是讨论最热闹的。type:all(默认)、video(视频笔记)或image(图文笔记)。除非只关心一种形式,否则保持all。
一次调用返回约 20 篇笔记,每次 $0.02。每篇有 id(24 位十六进制)、title、正文开头、author、published_at,以及包含点赞、收藏(favorites)和评论数的 metrics。按 metrics.comments 排序,就知道该打开哪几篇。
curl -G "https://api.okdata.online/v1/xiaohongshu/notes/search" \
-H "Authorization: Bearer $OKDATA_API_KEY" \
--data-urlencode 'query=防晒霜' \
--data-urlencode 'sort=popular' \
--data-urlencode 'fields=id,title,metrics.comments,metrics.likes,published_at'
fields 只保留你点名的字段,返回更短,价格不变。
第二步:一页页读评论
把笔记 id 传给小红书笔记评论。一次调用返回约 10 条一级评论,每次 $0.02。每条有 text、author(昵称和 ID)、likes、replies(下面有几条回复)、published_at 和 ip_location。这些都是一级评论,所以 parent_id 为 null。要下一页,就把 page.next_cursor 原样作为 cursor 传回去;page.has_more 为 false 时说明到底了。
curl -G "https://api.okdata.online/v1/xiaohongshu/notes/comments/list" \
-H "Authorization: Bearer $OKDATA_API_KEY" \
--data-urlencode 'id=672a4f1d000000001b03c58e'
小红书的评论一页条数不多,所以预算要按页算,不要按笔记算:1000 条评论大约要 100 次调用。
第三步:用 Python 串起来
下面的脚本搜索一次,按评论数挑出前 3 篇笔记,每篇最多读 MAX_PAGES 页,最后写成一张 CSV。
import csv
import os
import requests
API = "https://api.okdata.online"
HEADERS = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
NOTES = 3 # 打开几篇笔记
MAX_PAGES = 2 # 每篇读几页评论;每页一次调用
def get(path, **params):
body = requests.get(API + path, headers=HEADERS, params=params, timeout=60).json()
if body["code"] != "ok":
raise RuntimeError(f"{body['code']}: {body['message']} (charged: {body['charged']})")
return body
notes = get("/v1/xiaohongshu/notes/search", query="防晒霜", sort="popular")["data"]["items"]
notes = sorted(notes, key=lambda n: n["metrics"]["comments"] or 0, reverse=True)[:NOTES]
with open("xhs_comments.csv", "w", newline="", encoding="utf-8-sig") as f:
out = csv.writer(f)
out.writerow(["note_id", "note_title", "comment", "user", "likes", "replies", "ip_location", "published_at"])
for n in notes:
cursor = None
for _ in range(MAX_PAGES):
params = {"id": n["id"], **({"cursor": cursor} if cursor else {})}
body = get("/v1/xiaohongshu/notes/comments/list", **params)
for c in body["data"]["items"]:
out.writerow([n["id"], n["title"], c["text"], c["author"]["name"], c["likes"],
c["replies"], c["ip_location"], c["published_at"]])
if not body["page"]["has_more"]:
break
cursor = body["page"]["next_cursor"]
想覆盖更多笔记、读得更深,就调大 NOTES 和 MAX_PAGES。10 篇笔记各读 5 页是 50 次评论调用,在搜索之外再花 $1.00。按每 1000 条评论算,大约 $2.00。
注意事项
- 条数和笔记上的数字对不上。 笔记显示的评论数包含了楼中楼回复。这个接口列的是一级评论,每条的回复数在
replies里,但没有回复正文,所以拿到的行数会比metrics.comments少。 - 排序。 评论按小红书默认顺序返回,没有排序参数,也没有按最新排序的选项。
- IP 属地。
ip_location是小红书显示在评论旁边的省份或国家,没显示时为 null。 - 不用管 token。 只传笔记 ID 就行。为什么这一点在小红书上很重要,见 xsec_token 那篇问答。
- 删掉的笔记不收钱。 已删除或设为私密的笔记返回
not_found,不扣费,跳过即可。 - 重试不会重复扣费。 每次调用带一个
Idempotency-Key请求头。24 小时内同样的请求配同样的 key,会直接拿回上次的结果,meta.replayed为true,不再扣费。
如果是要导出某一篇笔记下的全部评论,看怎么导出小红书笔记的全部评论。想把评论整理成用户痛点和问题清单,看怎么用大模型从抖音和小红书评论里找痛点。
示例花费
按最热搜一页“防晒霜”笔记,再取评论最多的 3 篇,每篇读两页评论
按本页生成时的价格计算。失败的调用不扣费。
在你的 AI 里用(MCP)
先接好 MCP 服务,然后直接说你要什么。智能体会自己找到这些接口、看清价格,再用你的余额调用。
可以这样说在小红书按最热搜“防晒霜”,挑评论最多的 3 篇笔记,每篇读两页评论,整理成一张表:笔记标题、评论内容、点赞、回复数、IP 属地、时间。
智能体第一次调用 call 工具时发送的内容
{
"endpoint": "xiaohongshu.notes.search",
"params": {
"query": "防晒霜 推荐"
},
"idempotency_key": "<新的 UUID>"
}