小红书 API 接入教程:5 分钟用 Python 跑通第一个请求
小红书数据
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 打开中文会是乱码。
下一步
准备好了吗?免费注册,现在就发出你的第一个请求。