抖音搜索页数据批量爬取,多关键词同步采集实现

在短视频行业数据分析、竞品监测、内容趋势研究等实际业务场景中,抖音搜索页数据是极具价值的信息源,包含视频标题、博主信息、点赞量、评论量、发布时间等核心数据。传统手动复制搜索结果的方式效率极低,无法满足批量、多关键词、高频次的数据采集需求。

本文将从技术原理、环境搭建、核心代码实现、多关键词同步采集、反爬规避等维度,详细讲解抖音搜索页批量爬取 + 多关键词同步采集的完整实现方案,提供可直接运行的代码,帮助技术人员快速搭建高效的数据采集工具。

一、技术选型与前置准备

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. 关键前提:获取抖音请求参数

抖音搜索数据采用动态接口加载,无法直接爬取静态网页,需要通过浏览器开发者工具获取核心参数:

  1. 打开电脑端抖音网页版,登录账号;
  2. <font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">F12</font>打开开发者工具,切换到「Network」-「XHR/ Fetch」;
  3. 在搜索框输入关键词,筛选出包含<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">search</font>关键词的接口请求;
  4. 复制接口的<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>等请求头参数(这是绕过基础反爬的关键)。

二、核心技术原理

  1. 接口定向爬取:跳过静态 HTML 渲染,直接请求抖音官方搜索数据接口,获取结构化 JSON 数据;
  2. 多线程并发 :为每个搜索关键词分配独立线程,实现多关键词同步采集,相比单线程效率提升 5-10 倍;
  3. 分页遍历:自动识别搜索结果分页,循环采集全量数据,避免数据遗漏;
  4. 数据清洗与持久化:提取有效字段,去重后保存为本地文件,支持直接用于数据分析。

三、完整代码实现

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)

四、代码使用说明

  1. 修改核心参数 :将<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>替换为自己浏览器的真实参数;
  2. 自定义配置 :修改<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>(关键词列表);
  3. 运行程序:执行代码,控制台会实时打印采集进度,最终数据自动保存为 Excel 文件;
  4. 结果查看 :打开生成的<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">抖音搜索数据.xlsx</font>,包含关键词、视频标题、博主信息、互动数据等完整字段。

五、关键优化与反爬规避策略

抖音具备完善的反爬机制,直接高频爬取会触发 IP 封禁、账号限制等问题,本方案已集成以下优化策略:

  1. 随机请求延时:每页请求间隔 1-3 秒,模拟人工操作,避免高频请求;
  2. 并发数限制:线程数控制在 3-5 以内,降低服务器请求压力;
  3. 请求头伪装 :使用真实浏览器的<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>,伪装成合法用户;
  4. 数据去重:避免重复采集同一视频,减少无效请求;
  5. 异常捕获:对网络错误、接口异常做捕获处理,保证程序稳定运行。

六、应用场景与扩展方向

1. 核心应用场景

  • 行业数据分析:批量采集垂直领域关键词数据,分析内容趋势、爆款视频特征;
  • 竞品监测:实时采集竞品账号的搜索曝光数据,监控运营策略;
  • 选题调研:根据搜索结果的点赞、评论数据,筛选高流量选题方向;
  • 营销获客:采集目标领域博主信息,用于商务合作、品牌推广。

2. 扩展方向

  1. 代理 IP 池集成:应对高强度采集需求,避免 IP 封禁(推荐亿牛云爬虫代理);
  2. 定时采集 :结合<font style="color:rgb(31, 35, 41);background-color:rgba(0, 0, 0, 0);">schedule</font>库实现每日 / 每周自动采集,生成数据报表;
  3. 图片 / 视频下载:扩展代码,批量采集搜索结果中的视频文件、封面图片;
  4. 数据可视化 :对接<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>,自动生成数据分析图表。
相关推荐
我滴老baby2 小时前
工具调用全景解析从Function Calling到MCP协议的完整实践
开发语言·人工智能·python·架构·fastapi
2301_787312433 小时前
Vue.js中Patch过程处理Teleport组件挂载位置的特殊逻辑
jvm·数据库·python
我鑫如一3 小时前
性价比高的AI API中转站推荐企业
人工智能·python
Leinwin3 小时前
GPT-5.5 Instant API接入教程:免费额度、速率限制与最佳实践
后端·python·flask
dfdfadffa3 小时前
Golang Gin怎么做JWT登录认证_Golang Gin JWT教程【实用】
jvm·数据库·python
SilentSamsara3 小时前
装饰器基础:从闭包到装饰器的自然演变
开发语言·前端·vscode·python·青少年编程·pycharm
西贝爱学习3 小时前
智能手机规格与价格数据集
数据分析·数据集
m0_736439303 小时前
C#怎么实现MVVM模式 C#如何在WPF中使用MVVM设计模式分离视图和逻辑【架构】
jvm·数据库·python
zhoutongsheng3 小时前
Chromebook适合用什么HTML函数工具_轻量化方案汇总【汇总】
jvm·数据库·python