问答

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

需要上面那几个额外平台;量大到按次付费的总额超过你维护的时间成本;或者本来就是想学爬虫怎么写。这几种情况都可以留着它。除此之外,内容研究里有一套完整的小红书接口做法。

更新于