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}')
"
Scan to join WeChat group