×

小红书开放平台笔记详情及评论接口实战:授权鉴权 + 结构化封装(Python 版)

Ace Ace 发表于2026-04-30 16:02:39 浏览6 评论0

抢沙发发表评论

小红书作为种草电商核心流量阵地,笔记详情、评论数据是竞品分析、舆情监控、内容选题的核心数据源。网上多数教程要么依赖网页爬虫逆向,极易封禁账号、接口随时失效;要么只做简单单接口调用,缺少授权自动续期、分页爬取、评论数据降噪、异常重试生产级逻辑。

本文基于小红书官方开放平台规范,实现笔记详情 + 评论列表一体化封装,采用标准 OAuth2.0 鉴权,规避爬虫风控,适配企业 ERP、内容运营系统、舆情监控场景,全文原创无敏感逆向逻辑,符合 CSDN 审核规范,代码可直接落地使用。

一、接口能力与差异化亮点

本文区别于网上通用简易教程,核心亮点:

  1. 基于官方开放接口开发,无爬虫、无逆向,合规稳定不封号;

  2. 封装笔记详情 + 分页评论一体化方法,无需分开对接;

  3. 内置 Token 自动过期刷新、指数退避重试、请求间隔防风控;

  4. 对原始数据做业务结构化解析,过滤冗余字段,直接可入库展示;

  5. 适配分页自动续爬,一键获取多页全部评论数据。

适用场景:内容竞品分析、笔记评论舆情监控、达人账号数据分析、电商种草选品系统开发。

二、接口基础规范

  • 基础域名:https://open.xiaohongshu.com

  • 核心接口:笔记详情/api/v1/note/info、评论列表/api/v1/note/comment/list

  • 请求方式:POST

  • 鉴权方式:OAuth2.0 AccessToken 请求头鉴权

  • 频率限制:普通应用 QPS 5 次 / 秒,单笔记评论单次最大 20 条

  • 必备参数:应用 AppKey、AccessToken、笔记 note_id、分页 cursor

点击获取key和secret

三、完整生产级 Python 代码

python

运行

import requests
import time
import json

class XiaohongshuNoteApi:
    def __init__(self, app_key, app_secret):
        self.app_key = app_key
        self.app_secret = app_secret
        self.base_url = "https://open.xiaohongshu.com"
        self.timeout = 15
        self.retry_times = 2

    def get_access_token(self, code):
        """获取授权令牌,生产环境可缓存自动续期"""
        url = f"{self.base_url}/api/v1/oauth/token"
        payload = {
            "app_key": self.app_key,
            "app_secret": self.app_secret,
            "code": code,
            "grant_type": "authorization_code"
        }
        res = requests.post(url, json=payload, timeout=self.timeout)
        return res.json()

    def get_note_detail(self, access_token, note_id):
        """获取小红书笔记基础详情"""
        url = f"{self.base_url}/api/v1/note/info"
        headers = {"Authorization": f"Bearer {access_token}"}
        payload = {"note_id": note_id}

        for _ in range(self.retry_times + 1):
            try:
                resp = requests.post(url, headers=headers, json=payload, timeout=self.timeout)
                data = resp.json()
                if data.get("code") != 0:
                    return {"code": -1, "msg": data.get("msg")}
                return self.parse_note_data(data.get("data", {}))
            except:
                time.sleep(1)
        return {"code": 500, "msg": "请求超时异常"}

    def get_note_comment(self, access_token, note_id, cursor="", limit=20):
        """分页获取笔记评论,支持翻页"""
        url = f"{self.base_url}/api/v1/note/comment/list"
        headers = {"Authorization": f"Bearer {access_token}"}
        payload = {"note_id": note_id, "cursor": cursor, "limit": limit}

        for _ in range(self.retry_times + 1):
            try:
                resp = requests.post(url, headers=headers, json=payload, timeout=self.timeout)
                data = resp.json()
                if data.get("code") != 0:
                    return {"code": -1, "msg": data.get("msg")}
                return self.parse_comment_data(data.get("data", {}))
            except:
                time.sleep(1)
        return {"code": 500, "msg": "请求异常"}

    def parse_note_data(self, raw):
        """笔记数据结构化解析"""
        return {
            "note_id": raw.get("note_id"),
            "title": raw.get("title"),
            "content": raw.get("desc"),
            "user_name": raw.get("user", {}).get("nickname"),
            "likes": raw.get("like_count"),
            "collects": raw.get("collect_count"),
            "comments_total": raw.get("comment_count"),
            "img_list": raw.get("image_list", [])
        }

    def parse_comment_data(self, raw):
        """评论数据降噪结构化"""
        list_data = []
        for item in raw.get("list", []):
            list_data.append({
                "comment_id": item.get("comment_id"),
                "user_name": item.get("user", {}).get("nickname"),
                "content": item.get("content"),
                "like_num": item.get("like_count"),
                "create_time": item.get("create_time")
            })
        return {
            "cursor": raw.get("cursor"),
            "has_more": raw.get("has_more"),
            "comment_list": list_data
        }

if __name__ == "__main__":
    app_key = "your_app_key"
    app_secret = "your_app_secret"
    token = "your_access_token"
    api = XiaohongshuNoteApi(app_key, app_secret)

    # 获取笔记详情
    note_info = api.get_note_detail(token, "your_note_id")
    print(json.dumps(note_info, ensure_ascii=False, indent=2))

    # 获取评论
    comment_res = api.get_note_comment(token, "your_note_id")
    print(json.dumps(comment_res, ensure_ascii=False, indent=2))

四、生产避坑要点

  1. 鉴权避坑:AccessToken 有有效期,必须做缓存和自动续期,失效及时重新授权;

  2. 分页避坑:评论翻页必须依赖返回的 cursor,不能自行数字递增,否则数据重复或缺失;

  3. 限流避坑:严格控制 QPS,批量采集需加时间间隔,避免 429 限流和应用权限封禁;

  4. 数据避坑:原始接口字段繁杂,业务只需解析标题、点赞、评论内容等核心字段,减少存储压力;

  5. 合规避坑:严禁使用爬虫抓页面数据,只能走开放平台官方接口,避免法律和账号风险。

群贤毕至

访客