返回 Skill 列表
extension
分类: 数据与分析无需 API Key

抖音热门视频数据爬虫

>这是一个能帮你快速掌握抖音最新爆款动向的数据分析工具。它能一键抓取蝉妈妈平台的核心情报,自动生成包含热门视频TOP10、全网热搜TOP10、电商带货TOP10的结构化报告,并附带趋势洞察。数据可直接导出为CSV表格,让你轻松拿捏流量密码与选品方向。

person作者: user_ad45f167hubcommunity

douyin-selenium-scraper — 抖音数据爬虫 v2.1

一键抓取抖音热门视频 / 电商带货 / 热搜榜 TOP10,输出结构化报告 + CSV。

目录


快速开始

前置条件

| 条件 | 要求 | |------|------| | Python | 3.10+(推荐 3.13) | | Chrome 浏览器 | 已安装(webdriver-manager 自动匹配驱动) | | 虚拟环境 | 项目目录下 .venv/ |

安装依赖

python -m venv .venv
.venv/Scripts/pip install selenium requests beautifulsoup4 pandas lxml webdriver-manager

运行

.venv/Scripts/python.exe douyin_scraper.py

预期产出

reports/
├── douyin_report_20260526_111825.txt    # 结构化报告(四段式)
├── douyin_hot_videos_20260526_111825.csv  # 热门视频原始数据
└── douyin_ecommerce_20260526_111825.csv   # 电商带货原始数据

输出模板

报告文件 .txt 结构(四段式)

============================================================
抖音热门视频 TOP 10
============================================================

🏆 Top 1 - {视频标题}
达人:{作者名}
热度:{点赞数格式化}
详情链接:https://www.douyin.com/video/{ID}

🥈 Top 2 - ...
...(共10条)

============================================================
抖音热榜 TOP 10
============================================================

🏆 Top 1 - {热搜词}
热度:{万级热度值}
详情链接:https://www.douyin.com/search/{URL编码词}
...(共10条)

============================================================
电商带货热榜视频 TOP 10
============================================================

🏆 Top 1 - {商品标题(含话题标签+挂车商品信息)}
达人:{作者名}
热度:{点赞数格式化}
详情链接:https://www.douyin.com/video/{ID}
...(共10条)

============================================================
趋势洞察
============================================================

赛道分布:萌宠(1条)、搞笑(1条)、美妆时尚(1条)...
热搜特征:财经商业 / 社会民生 / ...
超级爆款:{标题} 等 N 条视频突破30万点赞
电商热品:食品饮料(3条)、美妆护肤(2条)、家居日用(1条)...
带货王:{标题}(@达人) 以 X万 点赞领跑
今日节点:体育赛事、教育考试、天气气候... 相关内容占据主导
黑马观察:{冷门内容}(@达人)等冷门赛道内容异军突起

数据更新时间:YYYY年MM月DD日 HH:MM

CSV 文件字段

热门视频 CSV (douyin_hot_videos_*.csv):

| 字段 | 说明 | 示例 | |------|------|------| | 排名 | 1-10 | 1 | | 视频标题 | 含话题标签 | 奶牛猫是超级英雄! #黑猫警长 #萌宠 | | 达人 | 清理后昵称 | 我是小猫 | | 点赞数 | 格式化(X.X万) | 38.6万 | | 转发数 | 蝉妈妈无此数据,为空 | | | 评论数 | 整数值 | 1234 | | 播放量 | 格式化 | 500.2万 | | 赛道分类 | 自动标注(18类) | 萌宠 | | 视频链接 | douyin.com 原地址 | https://www.douyin.com/video/7643539738272592113 | | 一句话点评 | AI增强时填充 | |

电商带货 CSV (douyin_ecommerce_*.csv):字段同上,「赛道分类」替换为电商品类。

排名徽章

  • 🏆 第1名
  • 🥈 第2名
  • 🥉 第3名
  • 第4-10名 无徽章

代码架构

文件位置

<workspace>/
├── douyin_scraper.py          # 主脚本(~1100行)
├── .venv/                     # Python虚拟环境 + 依赖
└── reports/                   # 输出目录(自动创建)

核心模块

douyin_scraper.py
│
├── 配置区(第38-76行)
│   ├── OUTPUT_DIR / TODAY / NOW_TIME          # 输出路径和时间戳
│   ├── TARGET_URLS                            # 热门视频榜 URL 字典
│   ├── ECOMMERCE_URLS                         # 电商带货榜 URL 字典
│   ├── HEADERS                                # 请求头 UA
│   └── PAGE_LOAD_TIMEOUT / ELEMENT_WAIT_TIMEOUT
│
├── 浏览器初始化(第83-117行)
│   └── create_driver() → headless Chrome + stealth JS 注入
│
├── 页面抓取(第125-179行)
│   ├── fetch_page_selenium() → Selenium 渲染 + 3次滚动加载
│   └── fetch_page_requests() → 纯 requests 备用方案
│
├── 数据解析(第187-429行)★核心
│   ├── parse_chanmama()        → 三策略降级入口
│   │   ├── 策略1: 表格 <table> 解析(主力)
│   │   ├── 策略2: CSS卡片列表匹配
│   │   └── 策略3: 正则兜底全文提取
│   │
│   ├── _extract_douyin_share_links() → 提取 iesdouyin 分享链接
│   ├── convert_ies_to_douyin()            → 转换为 douyin.com 地址
│   ├── clean_author_name()                → 达人名清理(去粉丝数/时间戳)
│   ├── clean_title()                      → 标题清理
│   ├── _extract_from_cells()              → 表格行→字典
│   └── _extract_from_card() / _fallback_extract()
│
├── 数据清洗工具(第437-485行)
│   ├── _parse_number()     → "38.6万" → 386000
│   ├── _safe_int()
│   └── _deduplicate_and_rank()           → 去重 + 排序 + 补充排名
│
├── 分类引擎(第488-580行)
│   ├── categorize_video()   → 视频18赛道自动分类
│   └── _categorize_ecommerce() → 商品7大品类自动分类
│
├── 输出模块(第520-565行 / 887-977行)
│   ├── save_to_csv()        → UTF-8-BOM CSV 写入
│   ├── save_report()        → 四段式文本报告生成
│   └── _format_num()        → 数字格式化为可读字符串
│
├── 热搜抓取(第573-770行)
│   ├── fetch_hot_search_top10()      → 调度入口
│   ├── _fetch_baidu_realtime()       → 百度JSON提取(主源)★
│   ├── _fetch_tophub_douyin()       → 备用(已弃用)
│   └── _fetch_hot_selenium()         → 备用(已弃用)
│
├── 趋势洞察(第778-893行)★AI分析
│   ├── generate_trend_insights()     → 5维度分析入口
│   │   ├── 维度1: 赛道分布统计
│   │   ├── 维度2: 热搜话题分类(_classify_topics)
│   │   ├── 维度3: 超级爆款识别(>30万点赞)
│   │   ├── 维度4: 电商热点分析(新增)
│   │   ├── 维度5: 今日节点事件关键词
│   │   └── 维度6: 黑马观察(冷门赛道高赞)
│   └── _classify_topics()
│
└── 主流程 main()(第972-1053行)
    ├── Step 1: 初始化浏览器
    ├── Step 2: 抓取热门视频(TARGET_URLS)
    ├── Step 3: 抓取电商带货(ECOMMERCE_URLS) ★新增
    ├── Step 4: 抓取热搜榜(百度实时热搜)
    ├── Step 5: 写入热门视频CSV
    ├── Step 5b: 写入电商带货CSV ★新增
    ├── Step 6: 生成四段式报告
    └── Step 7: 打印预览 + 关闭浏览器

数据源与 URL

| 数据源 | URL 用途 | 解析方式 | 数据量 | |--------|----------|----------|--------| | 蝉妈妈·热门视频 | https://chanmama.com/awemeRank/hotAweme | 表格 <table> 解析 | TOP 10 | | 蝉妈妈·电商带货 | https://www.chanmama.com/awemeRank/promotionAweme/ | 表格复用同逻辑 | TOP 10 | | 百度实时热搜 | https://top.baidu.com/board?tab=realtime | JSON正则提取 word+hotScore | TOP 10 |

URL 注意事项

  • 电商带货榜正确地址含尾部斜杠 /productRank/* 系列 URL 均返回404
  • 蝉妈妈所有榜单页均为 SPA,必须用 Selenium 渲染,requests 只拿到 3.8KB 空壳
  • 百度热搜是纯服务端渲染,可直接 requests 提取嵌入的 JSON 数据

分类体系

视频18赛道分类 (categorize_video)

| 赛道 | 关键词示例 | |------|-----------| | 剧情 | 剧情, 短剧, 演绎, 段子 | | 搞笑 | 搞笑, 沙雕, 爆笑, 梗 | | 体育 | 篮球, NBA, 足球, 运动, 健身 | | 音乐 | 唱歌, 翻唱, 音乐, 吉他, 说唱 | | 游戏 | 游戏, 王者, 原神, LOL, 手游 | | 美食 | 美食, 做饭, 吃播, 烧烤 | | 情感 | 情感, 恋爱, 分手, 治愈 | | 社会热点 | 新闻, 热点, 官方, 通报 | | 二次元 | 动漫, cos, 国漫, 日漫 | | 创意 | 特效, AI, 动画, 手工, DIY | | 美妆时尚 | 化妆, 穿搭, 变装, 口红 | | 汽车 | 汽车, 跑车, 特斯拉, 比亚迪 | | 萌宠 | 猫, 狗, 宠物, 猫咪, 狗狗 | | 教育科普 | 科普, 知识, 学习, 考试 | | 舞蹈 | 跳舞, 街舞, 编舞 | | 旅行 | 旅游, 打卡, 民宿 | | 其他 | 未匹配任何关键词 |

商品7大品类分类 (_categorize_ecommerce)

| 品类 | 关键词示例 | |------|-----------| | 美妆护肤 | 口红, 粉底, 面膜, 精华, 雅诗兰黛 | | 服装鞋包 | 连衣裙, T恤, 卫衣, 鞋子, 包包 | | 食品饮料 | 零食, 坚果, 奶茶, 巧克力, 方便面 | | 家居日用 | 纸巾, 洗衣液, 收纳, 清洁剂 | | 数码家电 | 手机壳, 充电宝, 耳机, 小家电 | | 母婴亲子 | 尿不湿, 奶粉, 玩具, 童装 | | 运动户外 | 瑜伽垫, 帐篷, 泳衣, 健身器材 |


完整操作流程

标准模式:运行脚本 → 读取报告

# Step 1: 执行爬虫
cd <workspace>
.venv/Scripts/python.exe douyin_scraper.py

# Step 2: 查看最新报告
cat reports/douyin_report_$(date +%Y%m%d)*.txt

增强模式:爬虫 + AI点评 + 推送腾讯文档

# Step 1: 运行爬虫获取原始数据
.venv/Scripts/python.exe douyin_scraper.py
LATEST_REPORT=$(ls -t reports/douyin_report_*.txt | head -1)

# Step 2: 读取CSV进行AI增强
# (由Agent执行以下步骤)
#   a. 为每条视频补充一句话点评(分析爆火原因/传播特征)
#   b. 识别异常数据或值得关注的趋势变化
#   c. 与前一日数据对比,标记新上榜/掉榜/排名大幅变动

# Step 3: 格式化为 MDX → 推送到腾讯文档
# 调用 mcp__tencent-docs__create_smartcanvas_by_mdx
# content_format: mdx
# 使用 ColumnList / Callout / Table 等组件排版

仅抓取单榜单(修改配置临时运行)

如只需某一块数据,可临时修改 main() 函数注释掉不需要的 Step:

def main():
    driver = create_driver()
    # ... 只保留需要的Step ...
    # 例:只跑电商带货
    # html = fetch_page_selenium(driver, list(ECOMMERCE_URLS.values())[0])
    # records = parse_chanmama(html)
    # ...

集成自动化

Automation Prompt 模板

你是一个定时运行的抖音数据分析助手。每天自动执行以下任务:

#### Step 1:运行 Selenium 爬虫
在 workspace 目录下执行:
```bash
.venv/Scripts/python.exe douyin_scraper.py

等待执行完成。

Step 2:读取最新报告

读取 reports/ 下最新的 douyin_report_*.txt 和两个 CSV 文件。

Step 3:AI 增强

基于数据进行分析:

  • 为每条视频写一句话点评(爆火原因/传播点)
  • 对比昨日数据(如有),标注排名变动(↑↓新)
  • 识别今日特别值得关注的内容

Step 4:格式化并推送

将增强后的报告格式化为 Markdown, 通过 mcp__tencent-docs API 推送到腾讯文档。

Fallback

如果爬虫失败(日志出现 ❌),降级为 WebSearch 方式: 搜索「抖音今日热门视频」「抖音电商带货」等关键词, 手动整理 TOP10 后继续后续步骤。


### 已有自动化任务

- **ID**: `automation-1779269694504`
- **状态**: ACTIVE
- **计划**: 每日 10:00 执行
- **Prompt**: 已更新为 V2 Selenium 版本(含三数据源 + 四段式报告)

---

## 排障指南

### 常见问题

| 症状 | 原因 | 解决方案 |
|------|------|----------|
| 所有策略均未提取到有效数据 | 蝉妈妈改版了DOM结构 | 用Selenium打开页面后打印关键class名称,更新CSS选择器 |
| 电商带货显示(本次未获取到) | URL错误(返回404) | 使用正确的 `promotionAweme/` 地址 |
| Permission denied 写入CSV | 上次运行的文件仍被占用 | 文件名已加 `_HHMMSS` 时间戳后缀防冲突;若仍报错检查是否有其他进程持有 |
| ChromeDriver 版本不匹配 | Chrome自动更新了 | 删除缓存 `~/.wdm/drivers/` 重启即可重新下载 |
| 百度热搜返回空列表 | 百度改版了HTML中的JSON格式 | 检查 `"word"` 和 `"hotScore"` 正则是否仍能匹配 |
| 超时崩溃 | 网络慢或蝉妈妈响应慢 | 增大 `PAGE_LOAD_TIMEOUT` 到 45s 或 `ELEMENT_WAIT_TIMEOUT` 到 30s |
| 反爬验证码触发 | 访问太频繁 | 每天≤3次,已有 stealth 处理但仍需控制频率 |
| headless模式下白屏 | Windows沙箱限制 | 去掉 `--headless=new` 改为有头模式调试一次 |

### 关键技术决策记录

1. **iesdouyin → douyin 链接转换**:蝉妈妈表格不含直链,但每个视频行的隐藏 `<a>` 有 `iesdouyin.com/share/video/{ID}` 分享链接。提取后按规则转换为标准 `douyin.com/video/{ID}` 地址,实测 10/10 成功率。

2. **百度热搜双正则配对**:百度HTML中嵌入的JSON,`desc` 字段极长(数百字符含引号),无法用单个 `[^}]*` 正则跨越。解法:分别提取所有 `word` 和所有 `hotScore`,按数组索引一一配对。

3. **电商榜URL发现**:`productRank/*` 全线返回404。从蝉妈妈导航栏链接中定位到正确地址 `awemeRank/promotionAweme/`。经验:SPA站点URL变更频繁,应优先从导航元素动态发现而非硬编码。

4. **达人名污染清理**:蝉妈妈表格作者列常含 "昵称 粉丝10,505 05-25 03:18" 格式。用两轮正则先去时间戳再去除粉丝数,保底长度校验防止过度清理。

### Verification Checklist

运行成功标志(全部满足才算成功):

- [ ] 日志:`✅ chanmama: 成功提取 10 条记录`
- [ ] 日志:`✅ chanmama_ecommerce: 成功提取 10 条电商带货视频`
- [ ] 日志:`✅ 热搜榜: 获取到 10 条`
- [ ] `reports/douyin_report_*` 存在且 > 2000 bytes
- [ ] `reports/douyin_hot_videos_*.csv` 存在(UTF-8-BOM编码)
- [ ] `reports/douyin_ecommerce_*.csv` 存在
- [ ] 报告包含完整的四个段落(视频/热搜/电商/洞察)
- [ ] 总耗时 < 60s(正常 20-35s)

### 快速验证命令

```bash
.venv/Scripts/python.exe -c "
import csv, glob, os

# 检查最新CSV
csv_files = sorted(glob.glob('reports/douyin_hot_videos_*.csv'), reverse=True)
ec_files = sorted(glob.glob('reports/douyin_ecommerce_*.csv'), reverse=True)
txt_files = sorted(glob.glob('reports/douyin_report_*.txt'), reverse=True)

print(f'=== 最新文件 ===')
for f in csv_files[:1]:
    rows = list(csv.DictReader(open(f, encoding='utf-8-sig')))
    print(f'视频CSV: {os.path.basename(f)} → {len(rows)}条')
for f in ec_files[:1]:
    rows = list(csv.DictReader(open(f, encoding='utf-8-sig')))
    print(f'电商CSV: {os.path.basename(f)} → {len(rows)}条')
for f in txt_files[:1]:
    size = os.path.getsize(f)
    has_ec = '电商带货' in open(f, encoding='utf-8').read()
    print(f'报告TXT: {os.path.basename(f)} → {size}B, 含电商板块: {has_ec}')
"