返回博客

小红书 API 接入教程:5 分钟用 Python 跑通第一个请求

Rnote API 团队 · · 2491 次阅读 · English
小红书数据 API教程 Python

这篇教程带你用 Python 在 5 分钟内跑通第一个小红书(RedNote / Xiaohongshu)数据接口调用。无需自建爬虫、不用维护代理,Rnote API 把采集基础设施都帮你扛好了,你只需要发一个标准 HTTP 请求。

第一步:注册并获取 API Key

前往注册页创建账户并验证邮箱。验证后即可获得免费额度,并在管理后台查看与管理你的 API Key。

第二步:了解请求结构

所有接口都是标准 RESTful 风格:

  • 基础地址:https://rnote.dev/api/v2/crawler
  • 鉴权:在请求头携带 X-API-Key: YOUR_API_KEY
  • 返回:JSON

第三步:发起第一个请求

以"搜索笔记"为例:

import requests

API_BASE = "https://rnote.dev/api/v2/crawler"
HEADERS = {"X-API-Key": "YOUR_API_KEY"}

resp = requests.get(
    f"{API_BASE}/search/notes",
    params={"keyword": "美食推荐", "page": 1},
    headers=HEADERS,
)
print(resp.status_code)
print(resp.json())

跑通后,你可以把端点换成 note/image(图文详情)、user/info(博主信息)等,参数说明见接口文档。

第四步:处理错误与重试

Rnote API 返回标准 HTTP 状态码。一个稳健的小工具函数:

import time
import requests

def call(path, params, retries=3):
    url = f"https://rnote.dev/api/v2/crawler/{path}"
    headers = {"X-API-Key": "YOUR_API_KEY"}
    for i in range(retries):
        r = requests.get(url, params=params, headers=headers, timeout=30)
        if r.status_code == 200:
            return r.json()
        time.sleep(2 ** i)  # 指数退避
    r.raise_for_status()

好消息是:只有成功请求(HTTP 2xx)才扣费,失败重试不会产生额外费用,因此你可以放心地加重试逻辑。

计费与额度

  • 按请求计费,无月费、无最低消费,用多少付多少。
  • 仅成功请求扣费。
  • 注册即送免费额度,足够完成接口验证与小规模测试。
  • 充值方式与当前优惠见定价页。

常见报错与排查

跑不通的时候,先看状态码——它基本已经告诉你问题在哪:

状态码 含义 怎么办
401 Key 无效或没带上 检查请求头名字是不是 X-API-Key(不是 Authorization),以及 Key 有没有被停用
402 余额不足 去充值。重试无效,请求根本没执行,也没扣费
429 触发限速 退避后重试,别原地循环。见下面的并发一节
404 路径写错,或该资源不存在 先在 Swagger 上确认路径存在;确认无误就是笔记/账号本身没了
422 参数不合法 响应体里会指出是哪个字段,通常是必填漏了或类型不对

一个高频错误是把参数放错位置:爬虫接口是 GET + query 参数,用 params= 传;蒲公英接口是 POST + JSON body,用 json= 传。两者混用会得到 422。

分页怎么写

搜索类接口靠 page 翻页,但从第二页开始要带上首次响应里的 search_id 和 search_session_id,否则拿到的结果可能和第一页重复:

import requests

API = "https://rnote.dev/api/v2/crawler"
H = {"X-API-Key": "YOUR_API_KEY"}

def search_all(keyword, max_page=5):
    sid = ssid = ""
    seen, out = set(), []
    for page in range(1, max_page + 1):
        r = requests.get(f"{API}/search/notes", headers=H, timeout=30, params={
            "keyword": keyword, "page": page,
            "search_id": sid, "search_session_id": ssid,
        })
        if r.status_code != 200:
            break
        data = r.json()
        sid = data.get("search_id", sid)          # 首次响应里取,之后一直带着
        ssid = data.get("search_session_id", ssid)
        items = data.get("data", {}).get("items", []) or []
        if not items:
            break                                  # 没有更多了,别继续花钱翻
        for it in items:
            nid = it.get("id")
            if nid and nid not in seen:            # 翻页会有重叠,必须去重
                seen.add(nid); out.append(it)
    return out

两个细节值得记住:空页就停(继续翻只会白花钱),以及必须按 ID 去重(相邻页之间经常有重叠)。

把结果存下来

采集完直接落盘,别只 print:

import csv, json, pathlib

notes = search_all("露营装备")

# 原始 JSON 留一份,字段以后想加分析随时能回头解析
pathlib.Path("notes.json").write_text(
    json.dumps(notes, ensure_ascii=False, indent=2), encoding="utf-8")

# 表格给非技术同事看
with open("notes.csv", "w", newline="", encoding="utf-8-sig") as f:
    w = csv.writer(f)
    w.writerow(["note_id", "标题", "点赞"])
    for n in notes:
        w.writerow([n.get("id"), n.get("display_title", ""),
                    n.get("interact_info", {}).get("liked_count", 0)])

utf-8-sig 那个编码是给 Excel 用的——用普通 utf-8 存的 CSV,Excel 打开中文会是乱码。

下一步

准备好了吗?免费注册,现在就发出你的第一个请求。