小红书有 API 吗?用 Python 拉取笔记和评论
小红书没有面向开发者开放的笔记和评论接口。本文用 Python 演示:按关键词搜索笔记、读取笔记详情、翻页拉取评论,再存成 Excel 能直接打开的 CSV。
做竞品分析、选品、舆情监测,经常要把小红书的笔记和评论拉下来做统计。第一个问题往往是:小红书有没有 API?
小红书有官方 API 吗?
笔记和评论数据没有。小红书的官方开放平台主要服务商家和合作伙伴,不对开发者开放公开笔记、评论和搜索结果。常见的做法有两种:
- 自己写爬虫: 要自己维护账号、cookie、签名算法和代理,小红书一改版就要跟着改,账号也有被限制的风险。
- 用数据 API: 发一个带 API Key 的 HTTPS 请求,拿回 JSON,不用碰账号和 cookie。
本文用第二种:Qovia 的小红书接口,只对返回了数据的调用计费。
准备工作
- Python 3.8 以上,装好
requests:pip install requests。 - 一个 Qovia 的 API Key:在控制台创建,放进环境变量,不要写死在代码里。
export QOVIA_KEY="sk-qovia-..."
第 1 步:写一个调用函数
所有小红书接口都是 https://api.qovia.ai/v1/raw/xiaohongshu/ 下的 GET 请求,Key 放在 Authorization 请求头里。调用成功时返回 200,数据在 data 里。结果为空(笔记已删除、搜索没有结果)也是 200,data 为空或 null,并且不计费。
import os import requests API = "https://api.qovia.ai/v1/raw/xiaohongshu" HEADERS = {"Authorization": f"Bearer {os.environ['QOVIA_KEY']}"} def call(endpoint, **params): resp = requests.get(f"{API}/{endpoint}", headers=HEADERS, params=params, timeout=60) if not resp.ok: # 出错时返回体会说明原因,例如 {"error": {"code": "invalid_params", "message": "..."}} raise RuntimeError(f"{endpoint}: HTTP {resp.status_code} {resp.text[:300]}") return resp.json()["data"] or {}
第 2 步:按关键词搜索笔记
笔记搜索每页 20 篇,可以按最新(latest)、最多点赞(most_liked)、最多评论(most_commented)或最多收藏(most_saved)排序,还能按笔记类型和发布时间筛选。
page = call("search", keyword="咖啡", sort="most_liked") for note in page.get("items", []): extra = note["extra"] print(extra["source_id"], note["metrics"]["likes"], extra["title"])
每条结果的笔记 ID 在 extra.source_id,链接在 extra.url,点赞、评论、收藏、分享数在 metrics。下一页传 page=2、page=3……,has_more 为 false 时停止。
第 3 步:读取一篇笔记
笔记 ID 就是笔记链接 xiaohongshu.com/explore/<笔记 ID> 里那串 24 位字符。笔记详情返回正文全文、精确的互动数、话题、发布时间、IP 属地、图片,视频笔记还有视频链接。
note = call("note", note_id="6a14846d000000000702d0d4") print(note["extra"]["title"]) print(note["text"][:200]) print(note["metrics"]) # likes 点赞、comments 评论、saves 收藏、shares 分享
第 4 步:翻页拉取评论
笔记评论每次返回一页。把上一页返回的 cursor 原样传回去就是下一页,has_more 为 false 时停止。sort="latest" 按从新到旧排;不传就是小红书默认顺序,置顶和热门在前。max_pages 用来限制一次最多拉多少页。
def all_comments(note_id, max_pages=20): comments, cursor = [], None for _ in range(max_pages): params = {"note_id": note_id, "sort": "latest"} if cursor: params["cursor"] = cursor page = call("comments", **params) comments += page.get("items", []) if not page.get("has_more"): break cursor = page["cursor"] return comments
每条评论有 cid、text、likes、reply_count(回复数)、ip_location、created_at 和作者昵称。评论下面的回复(楼中楼)用评论回复接口,翻页方式一样。
第 5 步:存成 Excel 能打开的 CSV
用 utf-8-sig 编码写文件,Excel 双击打开时中文才不会乱码。
import csv rows = all_comments("6a14846d000000000702d0d4") with open("comments.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow(["cid", "created_at", "likes", "replies", "ip_location", "nickname", "text"]) for c in rows: writer.writerow([c["cid"], c["created_at"], c["likes"], c["reply_count"], c["ip_location"], c["author"]["nickname"], c["text"]]) print(len(rows), "条评论已保存")
费用和限制
- 每次返回了数据的调用按该接口的单价扣一次费(见定价)。空结果、报错和超时都不扣费。
- 每次返回里都写着这次扣了多少(
meta.charged_usd)和扣完后的余额(meta.balance_usd)。 - 一分钟内请求太多会返回 429,响应头
Retry-After告诉你等几秒再试。 - 遇到报错,按
error.code判断原因,错误码的含义见 API 参考。
用 API 合规吗?
Qovia 提供的是数据接口服务,你不需要登录或提供自己的小红书账号。拿到的数据请按适用法律和小红书的平台规则使用,详见服务条款。
下一步
- 想直接用自然语言问?看在 Claude Code、Cursor 里用 MCP 查抖音、小红书、微博数据。
- 抖音也想这么做?看用 Python 把抖音评论导出到 Excel。
- 小红书博主的商业投放数据(粉丝画像、笔记表现)在小红书蒲公英页面。