抖音酒类直播间监控系统 - 实时数据采集与可视化
项目简介
抖音酒类直播间监控系统(Douyin Live Monitor)是我开发的一款实时数据采集与可视化工具。项目初衷是监控多个酒类品牌在抖音平台的直播数据,为运营决策提供数据支撑。
项目地址:https://github.com/1776686596/douyin-live-monitor
核心功能
| 功能 | 说明 |
|---|---|
| 🔴 实时监控 | 自动采集多个酒类直播间的在线人数和点赞数 |
| 💬 弹幕采集 | 针对中国劲酒直播间进行弹幕内容抓取与关键词分析 |
| 📊 数据可视化 | 内置 Web 界面展示实时排行榜、趋势图表、统计卡片 |
| 🗄️ 数据持久化 | 所有数据存储到 MySQL 数据库,支持历史分析 |
| 🤖 智能反检测 | 模拟人工操作行为,提高采集稳定性 |
| 🔄 自动重试 | 内置重试机制,确保数据采集的可靠性 |
监控品牌
当前系统监控以下 6 个酒类品牌的官方抖音直播间:
- 🥇 茅台
- 🥈 五粮液
- 🥉 汾酒
- 泸州老窖
- 剑南春
- 中国劲酒(含弹幕采集)
界面预览
监控主面板
启动服务后访问 http://localhost:8001 即可看到精美的监控仪表盘:

主面板展示核心数据统计卡片,包括:
- 监控品牌总数 / 当前直播中数量
- 总在线人数 / 总点赞数
- 近期弹幕总数
- 中国劲酒专属数据卡片
- 最后更新时间
全局数据洞察

- 在线人数分布图:柱状图展示各直播间实时在线人数对比
- 本场点赞分布图:折线图展示点赞数据趋势
- 人气排行榜:按在线人数与点赞综合排序,Top1 高亮展示
历史趋势与弹幕分析

- 历史趋势对比:点击排行榜中的直播间,可查看最近 60 分钟的数据变化
- 实时弹幕列表:展示中国劲酒直播间最近 10 分钟的弹幕
- 关键词分析:自动统计高频关键词(优惠、下单、支持等)
技术架构
项目采用前后端分离架构,核心技术栈如下:
┌─────────────────────────────────────────────────────────┐│ 前端展示层 ││ (内嵌 HTML + ECharts 图表 + CountUp.js) │└─────────────────────────┬───────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────┐│ API 接口层 ││ (FastAPI REST + Pydantic) │└─────────────────────────┬───────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────┐│ 业务逻辑层 ││ (CRUD 操作 + 数据处理 + 定时任务) │└─────────────────────────┬───────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────┐│ 数据采集层 ││ (Playwright 浏览器自动化 + 反检测策略) │└─────────────────────────┬───────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────────────┐│ 数据存储层 ││ (MySQL 8.0 + SQLAlchemy ORM) │└─────────────────────────────────────────────────────────┘技术选型
| 层级 | 技术 | 说明 |
|---|---|---|
| 后端框架 | FastAPI | 高性能异步 Web 框架 |
| 浏览器自动化 | Playwright | 支持 Chromium/Firefox/WebKit |
| 数据库 | MySQL 8.0 | 关系型数据库 |
| ORM | SQLAlchemy | 异步数据库操作 |
| 前端图表 | ECharts | 开源可视化库 |
| 数字动画 | CountUp.js | 数字滚动效果 |
项目结构
douyin-live-monitor/├── backend/│ └── app/│ ├── main.py # FastAPI 应用入口│ ├── config.py # 配置管理│ ├── database.py # 数据库连接│ ├── models.py # SQLAlchemy 模型│ ├── schemas.py # Pydantic 数据模型│ ├── crud.py # 数据库 CRUD 操作│ └── crawler/│ ├── douyin_client.py # 抖音直播间爬虫客户端│ └── tasks.py # 后台采集任务├── database/ # 数据库相关脚本├── shot/ # 项目截图├── requirements.txt # Python 依赖└── README.md核心技术实现
1. Playwright 爬虫客户端
爬虫核心是 DouyinLiveClient 类,封装了浏览器自动化和数据解析逻辑:
class DouyinLiveClient: """抖音直播间爬虫客户端"""
async def init(self) -> None: """初始化浏览器实例""" self._playwright = await async_playwright().start() self._browser = await self._playwright.chromium.launch( headless=self._headless, ) # 模拟真实用户环境 self._context = await self._browser.new_context( user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...", locale="zh-CN", )
async def fetch_room_info(self, room_name: str, room_url: str) -> LiveRoomInfo: """获取直播间实时数据""" page = await self._open_room_page(room_url) online_count, like_count = await self._extract_room_metrics(page, ...) return LiveRoomInfo( room_name=room_name, is_live=online_count > 0 or like_count > 0, online_count=online_count, like_count=like_count, )2. 智能反检测策略
为避免被平台识别为爬虫,实现了模拟人工操作的行为:
async def _simulate_human_actions(self, page: Page) -> None: """模拟人工操作,提高采集稳定性""" # 1. 随机等待 await page.wait_for_timeout(random.randint(800, 2500))
# 2. 鼠标移动到页面中间区域 x = random.randint(int(width * 0.3), int(width * 0.7)) y = random.randint(int(height * 0.3), int(height * 0.7)) await page.mouse.move(x, y, steps=random.randint(5, 20)) await page.mouse.click(x, y, delay=random.randint(50, 200))
# 3. 模拟滚动 await page.mouse.wheel(0, random.randint(200, 800))3. 弹幕采集与去重
针对中国劲酒直播间实现了弹幕快照采集:
async def fetch_danmu_snapshot(self, room_name: str, room_url: str) -> List[DanmuItem]: """抓取当前页面弹幕快照""" # 定位弹幕容器 container_locator = page.locator( "div.webcast-chatroom___list " "div:has(span.v8LY0gZF)" # 昵称 ":has(span.webcast-chatroom___content-with-emoji-text)" # 内容 )
# 去重处理 key = f"{room_name}|{sender_nickname}|{content}" if key not in seen_set: seen_set.add(key) danmu_items.append(DanmuItem(...))
return danmu_items4. 数据解析策略
支持多种数字格式解析(如 “1.2w”、“1.2万”、“966”):
@staticmethoddef _parse_number_from_text(text: str) -> int: """解析中文数字文本""" m = re.search(r"([\d.]+)\s*([wW万]?)", raw) value = float(m.group(1)) unit = m.group(2)
if unit in ("w", "W", "万"): value *= 10000
return int(value)部署教程
环境要求
- Python >= 3.8
- MySQL >= 8.0
- Node.js(可选,用于 Playwright 浏览器安装)
Step 1: 克隆项目
git clone https://github.com/1776686596/douyin-live-monitor.gitcd douyin-live-monitorStep 2: 创建虚拟环境
python3 -m venv venvsource venv/bin/activate # Linux/macOS# 或 venv\Scripts\activate # WindowsStep 3: 安装依赖
pip install -r requirements.txtplaywright install chromiumLinux 用户注意:Playwright 可能需要额外的系统依赖:
Terminal window sudo apt install libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 \libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 \libxfixes3 libxrandr2 libgbm1 libasound2 -y
Step 4: 配置数据库
创建 MySQL 数据库:
CREATE DATABASE jj_douyin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;配置数据库连接(编辑 backend/app/config.py 或创建 .env 文件):
MYSQL_HOST=127.0.0.1MYSQL_PORT=3306MYSQL_USER=rootMYSQL_PASSWORD=your_passwordMYSQL_DB=jj_douyinStep 5: 启动服务
uvicorn backend.app.main:app --reload --port 8001服务启动后访问 http://localhost:8001 即可看到监控面板。
主要配置项
| 配置项 | 默认值 | 说明 |
|---|---|---|
enable_background_crawler | True | 是否启动后台爬虫 |
playwright_headless | True | 是否无头模式运行浏览器 |
jingjiu_interval_seconds | 5 | 中国劲酒采集间隔(秒) |
other_rooms_interval_seconds | 15 | 其他直播间采集间隔(秒) |
enable_human_like_actions | True | 是否启用拟人行为 |
数据库设计

核心数据表
live_room_metric(直播间指标表)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | BIGINT | 主键 |
| room_name | VARCHAR(64) | 直播间名称 |
| room_url | VARCHAR(255) | 直播间链接 |
| online_count | INT | 在线人数 |
| like_count | BIGINT | 点赞数 |
| is_live | BOOLEAN | 是否直播中 |
| live_status | VARCHAR(16) | 状态文本 |
| created_at | DATETIME | 采集时间 |
danmu_message(弹幕表)
| 字段 | 类型 | 说明 |
|---|---|---|
| id | BIGINT | 主键 |
| room_name | VARCHAR(64) | 所属直播间 |
| sender_nickname | VARCHAR(255) | 发送人昵称 |
| content | TEXT | 弹幕内容 |
| metric_id | BIGINT | 关联指标ID |
| created_at | DATETIME | 采集时间 |
API 接口
| 接口 | 方法 | 说明 |
|---|---|---|
/ | GET | 监控面板首页 |
/health | GET | 健康检查 |
/overview/live-rooms | GET | 获取所有直播间概览 |
/danmu/jingjiu | GET | 获取中国劲酒弹幕列表 |
/metrics/history | GET | 获取直播间历史数据 |
/rooms/recheck | POST | 手动重新检测直播间状态 |
常见问题
Q: 数据显示为 0 或未开播?
A: 可能原因:
- 直播间确实未开播
- 页面选择器失效(抖音页面结构更新)
- 被平台反爬机制拦截
可点击排行榜中的”重新检测”按钮手动触发重查。
Q: 如何添加新的直播间?
A: 修改 backend/app/crawler/tasks.py 中的 LIVE_ROOMS 字典:
LIVE_ROOMS = { "茅台": "https://live.douyin.com/250926880704", "五粮液": "https://live.douyin.com/884334047259", # 添加新直播间 "新品牌": "https://live.douyin.com/xxx",}Q: 如何调整采集频率?
A: 修改配置文件中的间隔参数:
jingjiu_interval_seconds:中国劲酒采集间隔other_rooms_interval_seconds:其他直播间采集间隔
写在最后
这个项目是我在学习 Python 异步编程和浏览器自动化过程中的实践产物。通过这个项目,我深入理解了:
- FastAPI 异步 Web 开发
- Playwright 浏览器自动化与反检测策略
- SQLAlchemy 异步 ORM 操作
- ECharts 数据可视化
如果觉得有帮助,欢迎 Star 支持:GitHub
有问题或建议欢迎提 Issue!
声明:本项目仅供学习和技术研究目的,请遵守相关法律法规及平台用户协议。
分享
如果这篇文章对你有帮助,欢迎分享给更多人!