在短视频行业数据分析、竞品监测、内容趋势研究等实际业务场景中,抖音搜索页数据是极具价值的信息源,包含视频标题、博主信息、点赞量、评论量、发布时间等核心数据。传统手动复制搜索结果的方式效率极低,无法满足批量、多关键词、高频次的数据采集需求。
本文将从技术原理、环境搭建、核心代码实现、多关键词同步采集、反爬规避等维度,详细讲解抖音搜索页批量爬取 + 多关键词同步采集的完整实现方案,提供可直接运行的代码,帮助技术人员快速搭建高效的数据采集工具。
一、技术选型与前置准备
1. 核心技术栈
本次实现采用Python作为开发语言,生态成熟、第三方库丰富,适配爬虫开发的全流程需求:
<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">requests</font>:发送 HTTP 请求,模拟浏览器访问抖音搜索接口;<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">concurrent.futures</font>:实现多线程并发,支持多关键词同步采集,大幅提升爬取效率;<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">json</font>:解析接口返回的 JSON 格式数据,提取目标字段;<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">time</font>、<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">random</font>:控制请求间隔,规避抖音反爬机制;<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">pandas</font>:将采集的数据保存为 Excel/CSV 文件,方便后续数据分析。
2. 环境搭建
3. 关键前提:获取抖音请求参数
抖音搜索数据采用动态接口加载,无法直接爬取静态网页,需要通过浏览器开发者工具获取核心参数:
- 打开电脑端抖音网页版,登录账号;
- 按
<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">F12</font>打开开发者工具,切换到「Network」-「XHR/ Fetch」; - 在搜索框输入关键词,筛选出包含
<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">search</font>关键词的接口请求; - 复制接口的
<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">Cookie</font>、<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">User-Agent</font>、<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">X-Sec-Token</font>等请求头参数(这是绕过基础反爬的关键)。
二、核心技术原理
- 接口定向爬取:跳过静态 HTML 渲染,直接请求抖音官方搜索数据接口,获取结构化 JSON 数据;
- 多线程并发 :为每个搜索关键词分配独立线程,实现多关键词同步采集,相比单线程效率提升 5-10 倍;
- 分页遍历:自动识别搜索结果分页,循环采集全量数据,避免数据遗漏;
- 数据清洗与持久化:提取有效字段,去重后保存为本地文件,支持直接用于数据分析。
三、完整代码实现
1. 基础配置与请求头设置
首先配置固定参数,替换为自己的请求头参数,保证请求合法性:
python
运行
plain
import requests
import json
import time
import random
import pandas as pd
from concurrent.futures import ThreadPoolExecutor
# -------------------------- 配置区(必须修改) --------------------------
# 请求头:替换为你自己浏览器的参数
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
"Cookie": "你的抖音Cookie",
"X-Sec-Token": "你的X-Sec-Token",
"Referer": "https://www.douyin.com/",
"Accept": "application/json, text/plain, */*"
}
# 基础配置
BASE_URL = "https://www.douyin.com/aweme/v1/web/search/item/"
MAX_PAGE = 5 # 每个关键词爬取的最大页数
THREAD_NUM = 3 # 并发线程数,控制采集速度
# ------------------------------------------------------------------------
# 存储最终采集的所有数据
ALL_DATA = []
2. 单关键词单页数据爬取函数
该函数负责请求单个关键词、单页的搜索数据,解析并返回有效结果:
python
运行
plain
def crawl_single_page(keyword, page):
"""
爬取单个关键词的单页数据
:param keyword: 搜索关键词
:param page: 页码
:return: 解析后的视频数据列表
"""
# 构造请求参数(抖音搜索接口标准参数)
params = {
"keyword": keyword,
"cursor": (page - 1) * 10, # 分页游标,每页10条数据
"search_source": "normal",
"aid": "6383",
"channel": "douyin_web"
}
try:
# 发送GET请求,设置超时时间
response = requests.get(BASE_URL, headers=HEADERS, params=params, timeout=10)
response.raise_for_status() # 抛出请求异常
data = response.json()
# 判断数据是否存在
if "data" not in data or len(data["data"]) == 0:
print(f"【{keyword}】第{page}页无数据")
return []
# 数据清洗:提取核心字段
result_list = []
for item in data["data"]:
# 基础视频信息
video_info = {
"关键词": keyword,
"视频ID": item.get("aweme_id", ""),
"视频标题": item.get("desc", ""),
"博主昵称": item.get("author", {}).get("nickname", ""),
"博主ID": item.get("author", {}).get("unique_id", ""),
"点赞数": item.get("statistics", {}).get("digg_count", 0),
"评论数": item.get("statistics", {}).get("comment_count", 0),
"转发数": item.get("statistics", {}).get("share_count", 0),
"发布时间": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(item.get("create_time", 0))),
"视频链接": f"https://www.douyin.com/video/{item.get('aweme_id', '')}"
}
result_list.append(video_info)
print(f"【{keyword}】第{page}页采集成功,共{len(result_list)}条数据")
return result_list
except Exception as e:
print(f"【{keyword}】第{page}页爬取失败:{str(e)}")
return []
3. 单关键词全量爬取函数
遍历页码,完成单个关键词所有分页数据的采集:
python
运行
plain
def crawl_keyword(keyword):
"""
爬取单个关键词的所有分页数据
"""
for page in range(1, MAX_PAGE + 1):
page_data = crawl_single_page(keyword, page)
if page_data:
ALL_DATA.extend(page_data)
# 随机延时,规避反爬(1-3秒)
time.sleep(random.uniform(1, 3))
print(f"===== 【{keyword}】全部页码采集完成 =====")
4. 多关键词同步采集(核心功能)
使用线程池实现多关键词同步并行采集,这是本方案的核心优势:
python
运行
plain
def batch_crawl(keywords):
"""
多关键词同步采集入口函数
:param keywords: 关键词列表
"""
print(f"===== 开始多关键词同步采集,共{len(keywords)}个关键词 =====")
# 线程池并发执行
with ThreadPoolExecutor(max_workers=THREAD_NUM) as executor:
executor.map(crawl_keyword, keywords)
# 数据去重(根据视频ID去重)
df = pd.DataFrame(ALL_DATA)
df = df.drop_duplicates(subset=["视频ID"], keep="first")
# 保存数据到Excel
save_path = "抖音搜索数据.xlsx"
df.to_excel(save_path, index=False, encoding="utf-8")
print(f"\n===== 全部采集完成!=====")
print(f"总数据量:{len(df)} 条")
print(f"数据已保存至:{save_path}")
5. 主函数调用
定义需要采集的关键词列表,启动程序:
python
运行
plain
if __name__ == "__main__":
# 自定义多关键词列表
KEYWORDS = ["Python爬虫", "短视频运营", "AI工具推荐", "抖音变现技巧"]
# 启动批量采集
batch_crawl(KEYWORDS)
四、代码使用说明
- 修改核心参数 :将
<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">HEADERS</font>中的<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">Cookie</font>、<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">X-Sec-Token</font>替换为自己浏览器的真实参数; - 自定义配置 :修改
<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">MAX_PAGE</font>(爬取页数)、<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">THREAD_NUM</font>(并发数)、<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">KEYWORDS</font>(关键词列表); - 运行程序:执行代码,控制台会实时打印采集进度,最终数据自动保存为 Excel 文件;
- 结果查看 :打开生成的
<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">抖音搜索数据.xlsx</font>,包含关键词、视频标题、博主信息、互动数据等完整字段。
五、关键优化与反爬规避策略
抖音具备完善的反爬机制,直接高频爬取会触发 IP 封禁、账号限制等问题,本方案已集成以下优化策略:
- 随机请求延时:每页请求间隔 1-3 秒,模拟人工操作,避免高频请求;
- 并发数限制:线程数控制在 3-5 以内,降低服务器请求压力;
- 请求头伪装 :使用真实浏览器的
<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">User-Agent</font>和<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">Cookie</font>,伪装成合法用户; - 数据去重:避免重复采集同一视频,减少无效请求;
- 异常捕获:对网络错误、接口异常做捕获处理,保证程序稳定运行。
六、应用场景与扩展方向
1. 核心应用场景
- 行业数据分析:批量采集垂直领域关键词数据,分析内容趋势、爆款视频特征;
- 竞品监测:实时采集竞品账号的搜索曝光数据,监控运营策略;
- 选题调研:根据搜索结果的点赞、评论数据,筛选高流量选题方向;
- 营销获客:采集目标领域博主信息,用于商务合作、品牌推广。
2. 扩展方向
- 代理 IP 池集成:应对高强度采集需求,避免 IP 封禁(推荐亿牛云爬虫代理);
- 定时采集 :结合
<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">schedule</font>库实现每日 / 每周自动采集,生成数据报表; - 图片 / 视频下载:扩展代码,批量采集搜索结果中的视频文件、封面图片;
- 数据可视化 :对接
<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">Echarts</font>或<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">Matplotlib</font>,自动生成数据分析图表。