返回主页

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 # FastAPI 入口 — POST /analyze 主编排 ├── run_server.py # 智能端口选择启动脚本 ├── video_collector.py # Playwright YouTube 搜索 + 视频数据采集 ├── video_selector.py # LLM 二次筛选 TOP 视频 ├── comment_collector.py # 评论多维采集 (Top/Latest/痛点关键词) ├── comment_classifier.py # 评论分类 (规则+LLM 混合) ├── comment_processing.py # 评论清洗 + 高价值筛选 ├── insight_pipeline.py # 分批分析/汇总/决策/商业输出 ├── llm_client.py # OpenAI/Ollama 客户端封装 ├── pain_extractor.py # 痛点提取 (视频级, 可选) ├── script_generator.py # 营销脚本生成 (视频级, 可选) ├── database.py # Supabase 数据访问层 (6表) ├── exporter.py # CSV 导出 ├── schema.sql # Supabase 建表 SQL ├── requirements.txt # 依赖清单 ├── .env.example # 环境变量模板 ├── README.md ├── app/ │ ├── settings.py # pydantic-settings 配置 │ ├── llm_schemas.py # Pydantic 模型定义 (LLM 输出验证) │ └── 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 自动选可用端口。