YouTube 评论分析
YouTube Pain Point Pipeline
输入一个关键词,自动爬取 YouTube 热门视频、多维度采集评论、LLM 分类与清洗、分批深度分析痛点,
最终输出商业决策(YES/NO/MAYBE)与营销文案。支持 Ollama 本地 LLM 和 Supabase 持久化。
Python
FastAPI
Playwright
OpenAI / Ollama
Supabase
Pydantic
Pandas
asyncio
系统架构
关键词输入
keyword
➔
Playwright
视频爬取
➔
LLM 视频
二次筛选
➔
评论采集
Top/Latest/痛点
➔
LLM 分类
清洗+价值筛选
➔
分批分析
痛点+需求
➔
汇总决策
商业输出
通过 POST /analyze 触发,全流程异步执行,并发限制为 2 避免触发 YouTube 反爬
Pipeline 执行流程
1
视频爬取 (VideoCollector)
Playwright 启动 Chromium,访问 YouTube 搜索结果页(按播放量排序),自动滚动加载更多视频卡片。提取 video_id、标题、播放量、发布时间,然后逐个访问视频页面补充点赞数和评论数,计算互动得分(views×0.4 + comments×0.3 + like_ratio×0.3)。
2
LLM 视频筛选 (VideoSelector)
将候选视频列表发送给 LLM,按高互动、产品相关、问题/对比类视频优先的标准,选出 TOP N 视频并给出选择理由。可关闭此步骤,退回互动得分排序。
3
评论多维采集 (CommentCollector)
对每个视频:先按"Top"排序滚动采集热门评论,再切换"Newest"排序采集最新评论。过滤无效评论(太短、纯表情),按评分排序取 Top N,额外用痛点关键词(bad/leak/broken/problem 等)匹配痛点评论。三维度合并去重。
4
LLM 评论分类 (CommentClassifier)
先用规则引擎(关键词匹配)做初分类:pain_point / positive / neutral。对痛点候选评论送 LLM 二次确认,带重试机制(最多2次)。最终合并为三类评论列表。
5
评论清洗 + 价值筛选 (CommentProcessing)
Keyword 级流水线第一步:LLM 去除垃圾评论(spam/纯表情/无意义短评论/离题内容)。第二步:LLM 仅保留含产品信息、用户抱怨、改进建议、使用体验的高价值评论。
6
分批核心分析 (InsightPipeline)
将高价值评论按 batch_size(默认80条/批)分批送入 LLM,每批提取:top 痛点列表、用户真实需求、产品改进建议、高频 SEO 关键词、推荐卖点。Pydantic 结构化验证输出。
7
汇总 + 决策 + 商业输出
多批分析结果由 LLM 汇总为最终报告(去重、排序、强化结论)。然后做出商业决策(YES/NO/MAYBE + 市场分析 + 策略建议),最终生成 SEO 标题、卖点、广告文案、目标人群定位。
项目结构
youtube_video_comment_scraper/
├── main.py
├── run_server.py
├── video_collector.py
├── video_selector.py
├── comment_collector.py
├── comment_classifier.py
├── comment_processing.py
├── insight_pipeline.py
├── llm_client.py
├── pain_extractor.py
├── script_generator.py
├── database.py
├── exporter.py
├── schema.sql
├── requirements.txt
├── .env.example
├── README.md
├── app/
│ ├── settings.py
│ ├── llm_schemas.py
│ └── logging_config.py
└── static/
└── index.html
核心模块说明
VideoCollector
video_collector.py
Playwright 驱动 Chromium,访问 YouTube 搜索结果页(sp=CAMSAhAB 按播放量排序),自动滚动加载,提取视频卡片数据,逐个访问视频页补充点赞/评论数,计算 engagement_score 后排序截取 Top N。
CommentCollector
comment_collector.py
对每个视频切换排序方式(Top/Newest)采集评论,过滤无效评论(<10字符、纯lol/wow),按 (likes×0.7 + len×0.3) 评分排序。额外用 PAIN_KEYWORDS 匹配痛点评论。返回三维度:top/latest/keyword。
CommentClassifier
comment_classifier.py
混合分类策略:先用规则引擎(PAIN_KEYWORDS / POSITIVE_KEYWORDS)初分类,对痛点候选评论送 LLM 二次确认(带重试),最终输出 pain_point / positive / neutral 三类列表。
CommentProcessing
comment_processing.py
两步 LLM 处理:clean_comments 去除 spam/纯表情/无意义评论;filter_high_value_comments 仅保留含产品问题、用户抱怨、改进建议、使用体验的信息价值评论。Pydantic 验证输出。
InsightPipeline
insight_pipeline.py
四步 LLM 管道:analyze_comments_batch(分批提取痛点/需求/建议/关键词/卖点)→ aggregate_batch_analyses(多批汇总去重排序)→ decide_business(YES/NO/MAYBE决策)→ generate_commercial_output(标题/卖点/广告/定位)。
LLMClient
llm_client.py
统一 LLM 调用层:基于 OpenAI AsyncClient,兼容 Ollama 本地模型。chat_and_validate 带最多3次重试,强制 JSON 输出并用 Pydantic 模型验证。chat_json_array 验证数组输出。
LLMSchemas
app/llm_schemas.py
Pydantic 模型定义所有 LLM 输出结构:VideoSelectionResponse、CoreAnalysisResponse、DecisionResponse、CommercialOutputResponse、FinalReportResponse 等,确保 LLM 输出格式正确。
Database
database.py
Supabase 数据访问层,6 张表的 CRUD 操作:videos (upsert)、comments (insert)、pain_points (upsert)、scripts (insert)、analysis_results (upsert by keyword+batch)、final_reports (upsert by keyword)。
数据库 Schema (6 张表)
-- 视频信息表
CREATE TABLE videos (
id text PRIMARY KEY,
title text NOT NULL,
views bigint,
likes bigint,
comment_count bigint,
engagement_score double precision,
collected_at timestamptz DEFAULT now()
);
-- 评论表 (外键关联 videos)
CREATE TABLE comments (
id bigserial PRIMARY KEY,
video_id text REFERENCES videos(id) ON DELETE CASCADE,
content text NOT NULL,
category text NOT NULL, -- pain_point / positive / neutral
source text NOT NULL, -- top / latest / keyword
like_count bigint,
published_at timestamptz,
collected_at timestamptz DEFAULT now()
);
-- 痛点表 (每视频一条 JSON)
CREATE TABLE pain_points (
video_id text PRIMARY KEY REFERENCES videos(id),
structured_json jsonb NOT NULL,
collected_at timestamptz DEFAULT now()
);
-- 营销脚本表
CREATE TABLE scripts (
id bigserial PRIMARY KEY,
video_id text REFERENCES videos(id),
script_text text NOT NULL,
collected_at timestamptz DEFAULT now()
);
-- 分批分析结果表 (keyword + batch_index 幂等 upsert)
CREATE TABLE analysis_results (
keyword text NOT NULL,
batch_index int NOT NULL,
structured_json jsonb NOT NULL,
collected_at timestamptz DEFAULT now(),
PRIMARY KEY (keyword, batch_index)
);
-- 最终报告表 (每 keyword 一条)
CREATE TABLE final_reports (
keyword text PRIMARY KEY,
final_report_json jsonb NOT NULL,
decision_json jsonb, -- YES/NO/MAYBE 决策
commercial_json jsonb, -- 标题/卖点/广告/定位
collected_at timestamptz DEFAULT now()
);
API 接口
| 方法 | 路径 | 说明 |
| GET |
/ |
返回前端调用界面 (static/index.html) |
| POST |
/analyze |
触发完整分析管道,返回视频列表、评论分类、分批分析、最终报告、商业输出 |
POST /analyze 请求参数
keyword
string, 必填
搜索关键词,英文优先(如 foil tray, wireless meat thermometer)
video_count
1 ~ 30, 默认 10
爬虫层抓取候选视频数量
selected_video_count
1 ~ 10, 默认 5
LLM 筛选后进入深度分析的视频数
top_comment_count
1 ~ 100, 默认 5
每视频抽取的高分评论数量
comment_batch_size
20 ~ 120, 默认 80
LLM 分析时每批评论数
max_total_comments
50 ~ 2000, 默认 600
keyword 级管道最大评论总数(控成本核心)
export_csv
bool, 默认 false
是否导出评论为 CSV 文件
enable_llm_*
bool, 默认 true
各环节 LLM 开关(video_select / comment_clean / value_filter / core_analysis / batch_aggregate / decision / commercial / comment_classify)
请求示例
POST /analyze
{
"keyword": "foil tray",
"export_csv": true,
"video_count": 10,
"selected_video_count": 5,
"top_comment_count": 5,
"comment_batch_size": 80,
"max_total_comments": 600,
"enable_llm_video_select": true,
"enable_llm_comment_clean": true,
"enable_llm_value_filter": true
}
环境变量配置
| 变量名 | 默认值 | 说明 |
OPENAI_API_KEY必填 |
ollama |
OpenAI API Key 或填 "ollama" 使用本地模型 |
OPENAI_BASE_URL可选 |
http://localhost:11434/v1 |
兼容 OpenAI 的 API 地址(Ollama 本地默认端口) |
OPENAI_MODEL可选 |
llama3.1:8b |
使用的模型名称 |
SUPABASE_URL可选 |
- |
Supabase 项目 URL(不配置则不持久化) |
SUPABASE_SERVICE_ROLE_KEY可选 |
- |
Supabase Service Role Key |
PLAYWRIGHT_HEADLESS可选 |
false |
是否无头模式运行浏览器(调试时设 false) |
部署指南
1. 安装依赖
pip install -r requirements.txt
# 安装 Playwright 浏览器(首次需要)
playwright install chromium
2. 配置 Ollama(本地 LLM)
# 确保 Ollama 已安装并拉取模型
ollama pull llama3.1:8b
ollama serve
# 复制 .env.example 为 .env 并填入配置
# OPENAI_API_KEY=ollama
# OPENAI_BASE_URL=http://localhost:11434/v1
# OPENAI_MODEL=llama3.1:8b
3. 启动 API
# 智能选端口(推荐,自动避开 Windows 保留端口)
python run_server.py --reload
# 或手动指定端口
uvicorn main:app --reload --host 127.0.0.1 --port 8899
4. Supabase 持久化(可选)
# 在 Supabase SQL Editor 中执行 schema.sql
# 然后在 .env 中填入 SUPABASE_URL 和 SUPABASE_SERVICE_ROLE_KEY
# 未配置时接口仍正常返回结果,仅不写入数据库
依赖清单:fastapi, uvicorn, pydantic, pydantic-settings, playwright, pandas, supabase, openai, python-dotenv, python-multipart
Windows 注意:若出现 WinError 10013,通常是端口被系统排除范围占用。优先使用 python run_server.py --reload 自动选可用端口。