返回教程列表
教程2026年10月11日5 分钟阅读

小红书笔记和评论怎么采集?从关键词搜索到数据保存

用 Just One API 搜索小红书笔记,获取详情并分页采集评论。包含搜索条件、评论游标、时间筛选差异和保存 JSON 的 Python 示例。

从一个关键词建立笔记与评论样本

想研究“小红书上用户怎么讨论防晒”,可以先搜索相关笔记,再获取笔记详情和评论。这样能把内容与读者反馈关联起来,用于整理产品使用体验、常见疑问或内容选题。

Just One API 提供小红书关键词笔记搜索、笔记详情和笔记评论接口。本文用“防晒”作为示例关键词,演示搜索一页笔记、选择最多 3 篇笔记,再获取详情和最多 2 页评论的完整流程。如果你已经有笔记 ID,可以直接跳过搜索。

注册并在在线文档中测试

注册 Just One API 账户 获取 API Token,打开 小红书笔记搜索文档,填入关键词和 Token 即可免费测试。一个 Token 可接入各平台 API,后续按实际调用量付费;各接口可测试次数以账户内显示为准。

本文使用三个 GET 接口,都需要传入 token 查询参数:

  • /api/xiaohongshu/search-note/v2:按 keyword 搜索笔记,page 从 1 开始。
  • /api/xiaohongshu/get-note-detail/v1:按 noteId 获取笔记详情。
  • /api/xiaohongshu/get-note-comment/v2:按 noteId 获取评论,后续页使用 lastCursor。

先确认响应体中的业务 code 为 0,再读取 data。不同接口的 data 结构并不相同,不能共用同一个字段解析路径。

第一步:选择搜索条件

笔记搜索 V2 的 sort 支持综合、热度、发布时间、评论和收藏排序。本例使用 general 综合排序;如果按时间排列,使用 time_descending。

noteType 可选择 _0 综合、_1 视频或 _2 图文。本例不限定笔记类型。当前公开响应样例中,结果位于 data.items,普通笔记的 ID 位于每项的 note.id;示例跳过不含笔记 ID 的结果。

需要更多搜索结果时递增 page,保持关键词和筛选条件一致,并设置最大页数。搜索结果是平台提供的结果集,不代表某个关键词下的所有笔记。

时间排序与时间筛选是两回事

time_descending 控制排序;noteTime 控制发布时间筛选。V2 的 noteTime 可能返回所选时间范围以外的笔记,因此本文没有启用它。如果任务要求更准确的发布时间筛选,可以查看 笔记搜索 V4,并核对返回内容的时间,不能仅凭“最近一天”这个请求参数判断覆盖范围。

第二步:查询笔记详情

将搜索得到的笔记 ID 传入 笔记详情 V1。该接口也接受包含 /explore/ 的笔记链接;其他短链接不要未经解析直接当作笔记 ID。

当前公开响应样例中的 data 是数组,笔记对象位于其中条目的 note_list。代码会保留完整详情响应,再由你根据需要提取正文、作者等字段。它不会把 data 固定当成对象。

V1 不支持视频下载。如果目标是下载视频,应查看文档推荐的 笔记详情 V6,并为该版本单独核对返回结构。

第三步:分页获取评论

笔记评论 V2 支持 latest、normal 和 like_count 排序。文档建议优先使用 latest;部分笔记无法通过此排序获取评论时,可切换 normal 从第一页重新测试。

第一页将 lastCursor 留空。后续请求沿用上一页 data.cursor,当 data.has_more 为假时停止。这里没有请求参数 page,代码中的页号仅用于控制循环次数和命名文件。

当前公开样例的评论列表位于 data.comments,评论 ID 是 id,正文是 content。扩大采集时可以用“笔记 ID + 评论 ID”去重。评论列表中的 sub_comments 也不代表全部回复,如需展开,使用 评论回复接口。

Python 示例:保存笔记和评论 JSON

安装依赖并设置 Token,以下命令适用于 macOS 或 Linux。不要把真实 Token 提交到代码仓库或打印到请求日志中。

bash
python3 -m pip install requests
export JUSTONEAPI_TOKEN='your_token'

将下面的代码保存为 xiaohongshu_sample.py,运行 python3 xiaohongshu_sample.py。它最多调用 10 次接口:1 次搜索,最多 3 次详情,以及每篇最多 2 次评论请求。这是示例规模,不是平台额度。

python
import json
import os
from datetime import datetime, timezone
from pathlib import Path

import requests

BASE_URL = "https://api.justoneapi.com"
TOKEN = os.environ.get("JUSTONEAPI_TOKEN", "")


def call_api(path, method="GET", accepted_codes=(0,), **params):
    if not TOKEN or TOKEN == "your_token":
        raise RuntimeError("Set JUSTONEAPI_TOKEN before running")
    values = {"token": TOKEN, **params}
    arguments = {"data": values} if method == "POST" else {"params": values}
    try:
        response = requests.request(
            method, BASE_URL + path, timeout=120, **arguments,
        )
    except requests.RequestException:
        raise RuntimeError("Network error or timeout") from None
    if response.status_code != 200:
        raise RuntimeError(f"HTTP {response.status_code}")
    try:
        result = response.json()
    except ValueError:
        raise RuntimeError("Response is not valid JSON") from None
    if not isinstance(result, dict) or result.get("code") not in accepted_codes:
        code = result.get("code") if isinstance(result, dict) else None
        raise RuntimeError(f"API failed: code={code}; check the docs")
    return result


def output_dir(prefix):
    stamp = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%S%fZ")
    folder = Path(prefix) / stamp
    folder.mkdir(parents=True, exist_ok=False)
    return folder


def save_json(folder, filename, value):
    (folder / filename).write_text(
        json.dumps(value, ensure_ascii=False, indent=2), encoding="utf-8",
    )


KEYWORD = "防晒"
MAX_NOTES = 3
MAX_COMMENT_PAGES = 2


def main():
    folder = output_dir("xiaohongshu-output")
    search = call_api(
        "/api/xiaohongshu/search-note/v2",
        keyword=KEYWORD, page=1, sort="general", noteType="_0",
    )
    save_json(folder, "search-1.json", search)
    note_ids = []
    seen = set()
    for item in search["data"].get("items") or []:
        note_id = (item.get("note") or {}).get("id")
        if note_id and str(note_id) not in seen:
            seen.add(str(note_id))
            note_ids.append(str(note_id))
    selected = note_ids[:MAX_NOTES]
    save_json(folder, "selected-note-ids.json", selected)

    for index, note_id in enumerate(selected, start=1):
        detail = call_api("/api/xiaohongshu/get-note-detail/v1", noteId=note_id)
        save_json(folder, f"note-{index}-detail.json", detail)
        cursor = ""
        seen_cursors = set()
        for page in range(1, MAX_COMMENT_PAGES + 1):
            comments = call_api(
                "/api/xiaohongshu/get-note-comment/v2",
                noteId=note_id, sort="latest", lastCursor=cursor,
            )
            save_json(folder, f"note-{index}-comments-{page}.json", comments)
            data = comments["data"]
            if data.get("has_more") not in (True, 1, "1"):
                break
            next_cursor = data.get("cursor")
            if page < MAX_COMMENT_PAGES:
                if not next_cursor or next_cursor in seen_cursors:
                    raise RuntimeError("Missing or repeated comment cursor")
                seen_cursors.add(next_cursor)
                cursor = next_cursor
    print(f"Saved {len(selected)} note samples to {folder}")


if __name__ == "__main__":
    try:
        main()
    except RuntimeError as error:
        raise SystemExit(str(error)) from None

每次运行会在 xiaohongshu-output 下创建独立目录,保留搜索结果、选中的笔记 ID、详情和评论响应。字段路径依据当前文档公开样例;实际内容以调用时返回为准。获得稳定样本后,再把需要的字段导出 CSV 或写入数据库。

脚本在失败时停止,不会自动重试;已保存的数据仍在输出目录。再次运行会重新请求。扩大采集前可按 失败重试指南 增加断点记录和有上限的重试,并区分 Token、权限或余额问题与临时采集失败。

普通笔记数据和蒲公英数据怎么选?

如果你的目标是笔记内容、评论和讨论主题,从本文这组接口开始。如果需要达人营销画像、商业笔记表现或投放相关指标,应继续查看 小红书与蒲公英的数据区别。不要把普通笔记中的互动计数直接解释为投放曝光或阅读量。

常见问题

已有笔记链接,还要先搜索吗?

不需要。对于文档支持的 /explore/ 链接,可以直接传入详情或评论接口的 noteId。其他分享链接先查看 分享链接解析接口。

搜索不到笔记,是否代表笔记不存在?

不能这样判断。搜索覆盖与内容可见性都会影响返回结果。已知笔记 ID 时可以尝试直接查询,但不能据此保证不可见内容一定可获取。

为什么评论条数和页面显示的总数不一致?

本例限制了最多 2 页评论;排序、回复层级和平台可返回范围也会影响数量。分析报告中应注明采集页数和时间,不要把样本条数当成整篇笔记的完整评论总数。

用自己的关键词开始测试

注册并获取 Token 后,先在 小红书笔记搜索文档 中免费测试一个真实业务关键词。确认笔记与评论能回答你的问题,再调整排序、分页和数据保存方式。

继续使用 Just One API

登录 Dashboard 获取 Token,查看完整 API 文档,或打开 MCP GitHub 项目了解最新配置。