问答

抖音搜索总是弹验证码或者返回空结果,怎么拿到搜索数据?

简短回答

抖音会给它怀疑是自动化的会话弹验证码,很多爬虫把这种情况变成了一个空结果列表。与其去过验证码,不如通过 okdata 请求搜索:你的代码只发 API key、拿 JSON,没有可以被拦截的抖音会话,每页约 20 条视频,$0.02 一次。

关键词采集程序昨天还好好的,今天返回的全是空列表,也没有报错。你用同一个浏览器配置打开抖音,发现搜索页上挂着一个九宫格选图验证或者滑块。抖音已经盯上了这个会话,在有人手动过掉验证之前,搜索不会返回有用的东西。工具很少明说这一点,只告诉你搜索结果为空。长久的解决办法,是自己不再持有抖音会话,改为通过 API 请求搜索。

接下来大家就会问怎么绕过验证码。打码平台、拼图自动化确实存在,但这是一场你要付两次钱的军备竞赛:一次付给打码服务,抖音换题型时再付一次。

让你这边没有会话

如果你要的是公开搜索结果,你的代码根本没必要持有抖音会话。用 okdata 时,抖音视频搜索就是一次带 API key 的普通 HTTPS 调用。你拿到的要么是 JSON,要么是一个说得清楚的错误,不会是拼图。

每日任务 调用次数 每天 30 天
5 个关键词 × 2 页 10 $0.20 $6.00
20 个关键词 × 3 页 60 $1.20 $36.00

区分真没结果和请求失败

import os, requests

r = requests.get(
    "https://api.okdata.online/v1/douyin/videos/search",
    headers={"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"},
    params={"query": "露营装备", "sort": "latest"},
    timeout=60,
)
body = r.json()
if body["code"] != "ok":
    print("failed, charged:", body["charged"], "retry:", body["retry"])
elif not body["data"]["items"]:
    print("Douyin genuinely has no results for this query")
else:
    print(len(body["data"]["items"]), "videos")

失败时返回的是一个带 charged: false 和 retry 提示的错误,你的流程不会把被拦截误当成“今天没有新视频”。完整列表见错误码说明。

限制

  • 只有公开结果,需要登录才能看的都没有。
  • 一个关键词能翻多深由抖音决定。宽泛的话题拆成更细的关键词。
  • 搜索结果带互动数据,但没有播放量(metrics.views 通常为 null),也没有作者粉丝数。

如果还是要用自己的采集程序

放慢速度,每个账号固定一个浏览器配置,白天跑,一出现验证码就停,别硬重试把封禁拖得更久。MediaCrawler 的 issue 区专门讨论过人工过验证后怎么恢复采集。想要一个不用盯着的每日关键词任务,可以看内容调研方案。

更新于