小红书 API 大规模采集最佳实践:限流、重试、分页与去重
小红书数据
最佳实践
限流分页
把小红书(RedNote / Xiaohongshu)数据采集从"能跑"做到"稳定规模化",关键在几个工程细节:限流、重试、分页、去重和成本控制。这篇总结一套可以直接照搬的最佳实践,配 Rnote API 使用。
1. 限流与并发
给请求设并发上限与节流,别一上来就打满。遇到 429(限流)时退避稍等再试,平稳的请求曲线比突发洪峰更稳定、更省心。
2. 重试与退避
只对网络错误与 5xx 做重试,用指数退避(1s、2s、4s…)。好消息是 Rnote API 仅成功请求(HTTP 2xx)扣费,失败重试不额外计费,所以你可以放心加重试逻辑。
3. 分页:不同端点游标不同
| 端点 | 翻页方式 |
|---|---|
search/notes |
page 递增 |
user/posted |
用上一页返回的 cursor |
note/comments |
游标对象 cursor + index |
topic/feed |
cursor_score + last_note_id + last_note_ct |
翻页时务必把上一次响应里的游标字段原样带入下一次请求,保证连续性。
4. 去重
跨页、跨排序、跨任务都可能拿到重复数据。统一按 note_id / user_id 去重(用集合或数据库唯一索引),既省额度也保证数据干净。
5. 成本与额度控制
- 仅成功请求扣费,失败不花钱。
- 先用小批量验证采集逻辑与字段,再规模化放量。
- 给任务设预算上限,避免脚本异常时跑飞。
一个稳健的分页采集骨架(Python)
import time, requests
API = "https://rnote.dev/api/v2/crawler"
H = {"X-API-Key": "YOUR_API_KEY"}
def get(path, params, retries=3):
for i in range(retries):
r = requests.get(f"{API}/{path}", params=params, headers=H, timeout=30)
if r.status_code == 200:
return r.json()
if r.status_code == 429:
time.sleep(2 ** i) # 限流退避
elif r.status_code >= 500:
time.sleep(2 ** i) # 服务端错误退避
else:
r.raise_for_status() # 4xx 不重试
raise RuntimeError("retries exhausted")
def search_all(keyword, max_pages=10):
seen = set()
for page in range(1, max_pages + 1):
data = get("search/notes", {"keyword": keyword, "page": page})
items = extract_items(data) # 按响应结构取列表
if not items:
break
for it in items:
nid = it["note_id"]
if nid not in seen: # 去重
seen.add(nid)
yield it
开始使用
把这套实践套进你的采集任务,几乎不用改就能稳定跑量。免费注册获取 API Key,配合 Python / Go 教程上手,详见接口文档与定价。