问答
MediaCrawler 老是跑不通,换付费接口值不值?
简短回答
当你的时间比数据费贵时,就值。大家拿 MediaCrawler 跑的那些任务,在 okdata 上不用登录:小红书搜索 1000 篇 $1.00,小红书评论 1000 条 $2.00,抖音评论 1000 条 $0.10。需要目录里没有的平台,或者你乐意自己维护,就继续用 MediaCrawler。
MediaCrawler 是个好项目,它的 issue 区也老老实实记录了浏览器式采集的代价:小红书扫码登录突然失效,登录后十几秒评论采集就报 RetryError,账号收到风控提醒。每遇到一次,就搭进去一个下午。要算的就是:按次付费,比这些下午便宜吗?
同样的任务,标上价格
MediaCrawler 的几种主要模式,对应到接口是这样:
| MediaCrawler 模式 | 接口 | 价格 | 每 1000 条 |
|---|---|---|---|
| 小红书关键词搜索 | 小红书笔记搜索 | $0.02 / 20 篇 | $1.00 |
| 小红书评论 | 小红书笔记评论 | $0.02 / 10 条 | $2.00 |
| 抖音关键词搜索 | 抖音视频搜索 | $0.02 / 20 条 | $1.00 |
| 抖音评论 | 抖音视频评论 | $0.002 / 20 条 | $0.10 |
| 创作者模式 | 小红书博主笔记列表、抖音账号作品列表 | 按页 | 见接口页 |
一次典型的运行:5 个关键词,每个翻 10 页小红书搜索,再给 50 篇笔记各拉 3 页评论,合计 {{cost:xiaohongshu.notes.search50+xiaohongshu.notes.comments.list150}}。
不开浏览器的同一条流程
import json, os, requests
API = "https://api.okdata.online"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
def get(path, **params):
body = requests.get(API + path, headers=H, params=params, timeout=60).json()
if body["code"] != "ok":
raise RuntimeError(f"{body['code']}: {body['message']}")
return body
notes = get("/v1/xiaohongshu/notes/search", query="露营 装备", sort="popular")["data"]["items"]
with open("xhs_comments.jsonl", "w", encoding="utf-8") as out:
for note in notes[:10]:
for c in get("/v1/xiaohongshu/notes/comments/list", id=note["id"])["data"]["items"]:
out.write(json.dumps({"note_id": note["id"], **c}, ensure_ascii=False) + "\n")
不扫码、不用 Cookie、不装 Playwright,失败的调用不扣费。
换之前要知道的差别
- MediaCrawler 能抓二级评论;这里的接口返回一级评论,附带回复数。
- MediaCrawler 还支持快手、贴吧、知乎,这些不在本目录里。
- 只有登录后才能看到的内容不在范围内,okdata 只提供公开数据。
什么时候继续用 MediaCrawler
需要上面那几个额外平台;量大到按次付费的总额超过你维护的时间成本;或者本来就是想学爬虫怎么写。这几种情况都可以留着它。除此之外,内容研究里有一套完整的小红书接口做法。
更新于