怎么搜索小红书笔记并导出成 CSV 表格
两个接口:先用小红书笔记搜索并按游标翻页,再对需要全文和图片的笔记调小红书笔记详情。下面的示例一共 8 次调用,花费 $0.16;失败的调用不扣费。
更新于
要做的事:想把小红书上某个关键词下的内容整理成一张表格,有哪些笔记、谁写的、数据怎么样,再把其中最突出的几篇的完整正文和图片也拿下来。内容团队拿它给写手做 brief,产品团队拿它看用户怎么描述一个品类,分析师拿它按周追踪一个话题。搜索返回的是笔记卡片,详情返回的是整篇笔记。最后得到一张 CSV:搜索结果里的每篇笔记一行,排名前 5 的笔记再加上全文和所有图片链接。
整个过程不需要小红书账号,不用 Cookie,也不用处理 xsec_token。
分步操作
第一步:搜索,设好排序和类型
调用小红书笔记搜索,query 按用户的搜法写:露营、露营 装备清单、新手露营。有两个参数会改变结果:
sort:general(默认,小红书自己的综合排序)、latest(最新)或popular(最热)。按时间追踪话题用latest,想看“什么内容效果好”用popular。type:all(默认)、image(图文笔记)或video(视频笔记)。
一次调用返回约 20 篇笔记,每次 $0.02。每张卡片有 id、url、type、title、author(昵称和 ID)、published_at、hashtags,以及 metrics:likes、favorites(收藏)、comments 和 shares。搜索卡片上的 text 只是正文开头一小段,images 通常也只有封面。
curl -G "https://api.okdata.online/v1/xiaohongshu/notes/search" \
-H "Authorization: Bearer $OKDATA_API_KEY" \
--data-urlencode 'query=露营' \
--data-urlencode 'sort=latest' \
--data-urlencode 'type=image'
第二步:翻页
要下一页,就把 page.next_cursor 原样作为 cursor 传回去,query、sort、type 保持不变。page.has_more 为 false 时停,或者够用了就停:每一页都是一次调用。越往后翻,结果离关键词越远,所以窄一点的词(露营 装备清单)翻几页,通常比宽泛的词(露营)翻很多页更有用。
第三步:给留下的笔记拉全文
小红书笔记详情接收 id(也可以用 url 传笔记链接或 xhslink 分享链接),返回整篇笔记,每次 $0.02:完整的 text、images 里的全部图片、hashtags,以及最新的 metrics。视频笔记只给封面图,不含视频文件。
curl -G "https://api.okdata.online/v1/xiaohongshu/notes/get" \
-H "Authorization: Bearer $OKDATA_API_KEY" \
--data-urlencode 'id=672a4f1d000000001b03c58e'
只给真正要读的笔记拉详情。搜索卡片上已经有各项数据,所以如果只要一张 60 篇笔记的点赞收藏表,根本不用调详情。
第四步:完整脚本
脚本读三页最新的“露营”图文笔记,挑出收藏最多的 5 篇拉全文,每篇笔记写一行 CSV。
import csv
import os
import requests
API = "https://api.okdata.online"
HEADERS = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
SEARCH_PAGES = 3 # 每页一次调用
FULL_NOTES = 5 # 拉全文的笔记数;每篇一次调用
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, cursor = [], None
for _ in range(SEARCH_PAGES):
params = {"query": "露营", "sort": "latest", "type": "image", **({"cursor": cursor} if cursor else {})}
body = get("/v1/xiaohongshu/notes/search", **params)
notes += body["data"]["items"]
if not body["page"]["has_more"]:
break
cursor = body["page"]["next_cursor"]
notes = list({n["id"]: n for n in notes}.values()) # 去掉跨页重复
top = sorted(notes, key=lambda n: n["metrics"]["favorites"] or 0, reverse=True)[:FULL_NOTES]
full = {n["id"]: get("/v1/xiaohongshu/notes/get", id=n["id"])["data"]["item"] for n in top}
with open("xhs_notes.csv", "w", newline="", encoding="utf-8-sig") as f:
out = csv.writer(f)
out.writerow(["id", "title", "author", "published_at", "likes", "saves", "comments", "url", "full_text", "images"])
for n in notes:
d = full.get(n["id"])
m = (d or n)["metrics"]
out.writerow([n["id"], n["title"], n["author"]["name"], n["published_at"], m["likes"], m["favorites"],
m["comments"], n["url"], d["text"] if d else "", " ".join(d["images"] or []) if d else ""])
用 utf-8-sig 编码,Excel 打开中文不乱码。搜 10 页、拉 20 篇全文是 $0.60。
注意事项
- 没有浏览量。 小红书不公开浏览数,所以
metrics.views为 null,meta.unavailable里的原因是platform。收藏数(favorites)最能说明一篇笔记有没有人想留着看。 - 时间是 UTC。
published_at是 UTC 的 ISO 8601 格式,换成北京时间要加 8 小时。 - 笔记链接。
url是不带参数的xiaohongshu.com/explore/<id>。不带 token 在浏览器里打开可能看不到内容,原因和办法见 xsec_token 那篇问答。 - 删掉的不收钱。 搜索之后、拉详情之前被删的笔记返回
not_found,不扣费。 - 重试不会重复扣费。 每次调用带一个
Idempotency-Key请求头。24 小时内同样的请求配同样的 key,会直接拿回上次的结果,meta.replayed为true,不再扣费。 - 图片是链接。 需要的图片跑完就下载下来,图片链接过一段时间可能失效。
搜索量大的时候怎么算钱,见小红书笔记搜索 API 多少钱。想继续看这些笔记下面读者说了什么,用小红书笔记评论读评论。
示例花费
按最新搜三页“露营”图文笔记,再给收藏最多的 5 篇拉全文和图片
按本页生成时的价格计算。失败的调用不扣费。
在你的 AI 里用(MCP)
先接好 MCP 服务,然后直接说你要什么。智能体会自己找到这些接口、看清价格,再用你的余额调用。
可以这样说在小红书按最新搜“露营”的图文笔记,搜三页。把每篇笔记的标题、作者、点赞、收藏、评论数和链接做成表,收藏最多的 5 篇再补上全文和图片链接。
智能体第一次调用 call 工具时发送的内容
{
"endpoint": "xiaohongshu.notes.search",
"params": {
"query": "防晒霜 推荐"
},
"idempotency_key": "<新的 UUID>"
}