1926 字
10 分钟

抖音酒类直播间监控系统 - 实时数据采集与可视化

项目简介#

抖音酒类直播间监控系统(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关系型数据库
ORMSQLAlchemy异步数据库操作
前端图表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_items

4. 数据解析策略#

支持多种数字格式解析(如 “1.2w”、“1.2万”、“966”):

@staticmethod
def _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: 克隆项目#

Terminal window
git clone https://github.com/1776686596/douyin-live-monitor.git
cd douyin-live-monitor

Step 2: 创建虚拟环境#

Terminal window
python3 -m venv venv
source venv/bin/activate # Linux/macOS
# 或 venv\Scripts\activate # Windows

Step 3: 安装依赖#

Terminal window
pip install -r requirements.txt
playwright install chromium

Linux 用户注意: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 文件):

Terminal window
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=your_password
MYSQL_DB=jj_douyin

Step 5: 启动服务#

Terminal window
uvicorn backend.app.main:app --reload --port 8001

服务启动后访问 http://localhost:8001 即可看到监控面板。

主要配置项#

配置项默认值说明
enable_background_crawlerTrue是否启动后台爬虫
playwright_headlessTrue是否无头模式运行浏览器
jingjiu_interval_seconds5中国劲酒采集间隔(秒)
other_rooms_interval_seconds15其他直播间采集间隔(秒)
enable_human_like_actionsTrue是否启用拟人行为

数据库设计#

数据库表结构

核心数据表#

live_room_metric(直播间指标表)#

字段类型说明
idBIGINT主键
room_nameVARCHAR(64)直播间名称
room_urlVARCHAR(255)直播间链接
online_countINT在线人数
like_countBIGINT点赞数
is_liveBOOLEAN是否直播中
live_statusVARCHAR(16)状态文本
created_atDATETIME采集时间

danmu_message(弹幕表)#

字段类型说明
idBIGINT主键
room_nameVARCHAR(64)所属直播间
sender_nicknameVARCHAR(255)发送人昵称
contentTEXT弹幕内容
metric_idBIGINT关联指标ID
created_atDATETIME采集时间

API 接口#

接口方法说明
/GET监控面板首页
/healthGET健康检查
/overview/live-roomsGET获取所有直播间概览
/danmu/jingjiuGET获取中国劲酒弹幕列表
/metrics/historyGET获取直播间历史数据
/rooms/recheckPOST手动重新检测直播间状态

常见问题#

Q: 数据显示为 0 或未开播?

A: 可能原因:

  1. 直播间确实未开播
  2. 页面选择器失效(抖音页面结构更新)
  3. 被平台反爬机制拦截

可点击排行榜中的”重新检测”按钮手动触发重查。

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!

声明:本项目仅供学习和技术研究目的,请遵守相关法律法规及平台用户协议。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

抖音酒类直播间监控系统 - 实时数据采集与可视化
https://blog.daisheng.xyz/posts/douyin-live-monitor/
作者
园长
发布于
2025-12-28
许可协议
CC BY-NC-SA 4.0

目录