小红书有 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,并且不计费。

Python
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 {}

笔记搜索每页 20 篇,可以按最新(latest)、最多点赞(most_liked)、最多评论(most_commented)或最多收藏(most_saved)排序,还能按笔记类型和发布时间筛选。

Python
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 属地、图片,视频笔记还有视频链接。

Python
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 用来限制一次最多拉多少页。

Python
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 双击打开时中文才不会乱码。

Python
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 提供的是数据接口服务,你不需要登录或提供自己的小红书账号。拿到的数据请按适用法律和小红书的平台规则使用,详见服务条款。

下一步

本文用到的接口

更多教程

你的 Agent 能看到什么,取决于你给它什么数据

把抖音、小红书、公众号和电商评价交给它:结构化,按次计费,失败不扣费。