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

> 为什么抖音网页搜索会给爬虫弹滑块和图形验证码，还悄悄返回空列表，以及完全不用浏览器会话也能拿到关键词搜索结果的办法。

网页版：https://okdata.online/zh/answers/douyin-search-captcha/

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

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

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

## 让你这边没有会话

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

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

## 区分真没结果和请求失败

```python
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` 提示的错误，你的流程不会把被拦截误当成“今天没有新视频”。完整列表见[错误码说明](/zh/docs/errors/)。

## 限制

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

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

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

## 用到的接口

- [抖音视频搜索](https://okdata.online/zh/apis/douyin/videos/search/) `douyin.videos.search`：$0.02/次 · 每页约 20 条视频
- [抖音视频详情](https://okdata.online/zh/apis/douyin/videos/get/) `douyin.videos.get`：$0.002/次

更新于 2026-11-12
