back
loading skill details...
Amazon竞品评论深度分析 — 从产品页面采集评论、NLP关键词/痛点/场景分析、Chart.js交互式HTML报告+Excel数据文件生成。
---
name: amazon-review-analysis
description: Amazon竞品评论深度分析 — 从产品页面采集评论、NLP关键词/痛点/场景分析、Chart.js交互式HTML报告+Excel数据文件生成。
category: amazon
tags: [amazon, review, competitor-analysis, nlp, visualization]
---
# Amazon 竞品评论深度分析
对Amazon竞品进行7维度评论深度分析,输出Chart.js交互式HTML报告+Excel数据文件。
## Trigger Conditions
- 用户要求分析竞品评论、Review分析、评论对比
- 用户提供ASIN要求做用户反馈分析、痛点挖掘
- 用户说"专业分析评论"、"评论深度分析"、"差评分析"
- 关键词:评论/review/竞品分析/用户反馈/痛点/差评/好评/选品参考
- 用户提供ASIN + 要求按维度整理评论
## 输入
- ASIN列表(1-5个产品)
- 分析维度(可选,默认7维度全覆盖)
## 用户标准请求格式(模板)
当用户用以下格式请求时,直接按此模板执行:
```
请专业分析亚马逊美国站竞品的全部评论,Asin为{ASIN1}和{ASIN2},按以下维度整理:
1、好评Top5关键词、用户满意点
2、差评Top5痛点(质量、物流、尺寸、色差、功能、包装等分类)
3、统计抱怨最多的5个问题
4、挖掘用户未被满足的需求、隐藏刚需
5、给出差异化选品改进点、避坑要点
6、客户主要使用场景(比如卧室,地下室等)
7、全文采用标准数据分析格式进行输出,词频/情感直观比例+趋势可视化+折线图展示差评率变化,给出一份带有图表和详细分析的可视化分析报告(HTML),另外再生成一份带有调研数据和分析的EXCEL文件
```
## 7个分析维度
1. **好评Top5关键词** — 用户满意点,词频统计+情感比例
2. **差评Top5痛点** — 按类别分类(质量/物流/尺寸/色差/功能/包装),含严重程度评级
3. **抱怨最多的5个问题** — 跨产品汇总排序,频次+典型引用
4. **未被满足的需求** — 隐藏刚需、用户期望但未实现的功能
5. **差异化改进点** — 选品建议、避坑要点、创新方向
6. **客户使用场景** — 从评论文本提取场景(卧室/地下室/办公室等)
7. **可视化报告** — HTML图表(含差评率趋势折线图)+ Excel数据文件
## Workflow
### Step 1: 产品页面访问 & 评论提取
Amazon评论页面(`product-reviews/{asin}`)需要登录,不可直接访问。
**正确方法:从产品页面内提取评论**
```python
# 导航到产品页面
browser_navigate(url=f"https://www.amazon.com/dp/{asin}")
```
#### 1a. 提取评论(IIFE包装必须)
```javascript
// browser_console — 必须用IIFE避免变量冲突
(function() {
const results = [];
document.querySelectorAll('[data-hook="review"]').forEach(el => {
// 标题 — 在h5元素内
let title = '';
const titleEl = el.querySelector('h5[data-hook="reviewTitle"]');
if (titleEl) title = titleEl.textContent.trim();
// 正文 — reviewText容器内的文本,需清理模板文字
let body = '';
const bodyContainer = el.querySelector('[data-hook="reviewText"]');
if (bodyContainer) {
body = bodyContainer.textContent
.replace(/Brief content visible.*?content\./g, '')
.replace(/Full content visible.*?content\./g, '')
.replace(/Read moreRead less/g, '')
.trim();
}
// 评分 — 从icon-alt提取
let rating = 0;
const ratingSpan = el.querySelector('[data-hook="review-star-rating"] .a-icon-alt');
if (ratingSpan) {
const m = ratingSpan.textContent.match(/(\d+(\.\d+)?)/);
if (m) rating = parseFloat(m[1]);
}
// 日期
let date = '';
const dateEl = el.querySelector('[data-hook="review-date"]');
if (dateEl) date = dateEl.textContent.trim();
// 已验证购买
const verified = !!el.querySelector('[data-hook="avp-badge"]');
// 有用投票数
let helpful = '';
const helpEl = el.querySelector('[data-hook="helpful-vote-statement"]');
if (helpEl) helpful = helpEl.textContent.trim();
results.push({rating, title, body, date, verified, helpful});
});
// 评分分布 — 从histogram链接提取
const histLinks = document.querySelectorAll('a[href*="acr_dp_hist"]');
const hist = {};
histLinks.forEach(a => {
const text = a.textContent;
const starMatch = text.match(/(\d)\s*star/);
const pctMatch = text.match(/(\d+)%/);
if (starMatch && pctMatch) {
hist[starMatch[1] + '_star'] = parseInt(pctMatch[1]);
}
});
// 总评价数
let totalReviews = '';
const totalEl = document.querySelector('#acrCustomerReviewText');
if (totalEl) totalReviews = totalEl.textContent.trim();
// 总体评分
let overallRating = '';
const ratingEl = document.querySelector('#acrPopover .a-icon-alt');
if (ratingEl) overallRating = ratingEl.textContent.trim();
return JSON.stringify({totalReviews, overallRating, hist, count: results.length, reviews: results});
})()
```
#### 1b. 提取产品信息
```javascript
(function() {
let title = document.querySelector('#productTitle')?.textContent.trim() || '';
let price = document.querySelector('.a-price .a-offscreen')?.textContent.trim() || '';
let features = '';
const featEl = document.querySelector('#featurebullets_feature_div');
if (featEl) features = featEl.textContent.trim().substring(0, 500);
return JSON.stringify({title, price, features});
})()
```
#### 1c. 评分分布备用提取
histogram链接是提取评分分布的最可靠方法。页面HTML结构:
```
5 star4 star3 star2 star1 star5 star76%12%3%4%5%76%
```
解析:每个链接文本包含所有百分比,最后一个%是该星级的比例。
### Step 1.5: 补充更多评论(可选)
产品页面通常只显示8-11条评论。如需更多数据,通过web_search获取第三方评论摘要:
```python
# 搜索第三方评论汇总
web_search(f"amazon {asin} reviews summary analysis")
web_search(f"site:reddit.com amazon {product_name} review")
```
### Step 2: 数据存储
将提取的评论保存为JSON:
```python
import os, json
os.makedirs('/tmp/amazon_reviews', exist_ok=True)
with open('/tmp/amazon_reviews/review_data.json', 'w') as f:
json.dump(all_data, f, indent=2, ensure_ascii=False)
```
### Step 3: NLP分析
#### 3a. 关键词提取(好评+差评分离)
```python
import re
from collections import Counter
stop_words = set(['the', 'a', 'an', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',
'of', 'with', 'by', 'from', 'is', 'was', 'are', 'were', 'be', 'been', 'being',
'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could', 'should',
'may', 'might', 'can', 'this', 'that', 'these', 'those', 'i', 'you', 'he', 'she',
'it', 'we', 'they', 'what', 'which', 'who', 'when', 'where', 'why', 'how',
'all', 'each', 'every', 'both', 'few', 'more', 'most', 'other', 'some', 'such',
'no', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 'just',
'about', 'above', 'after', 'again', 'also', 'am', 'any', 'as', 'because',
'before', 'between', 'into', 'like', 'me', 'my', 'nor', 'off', 'once',
'out', 'over', 'then', 'there', 'through', 'under', 'until', 'up', 'while',
'product', 'item', 'bought', 'purchased', 'one', 'get', 'got', 'really',
'much', 'well', 'still', 'even', 'make', 'made', 'use', 'used', 'using',
'thing', 'things', 'way', 'want', 'needed', 'need', 'come', 'came',
'work', 'working', 'don', 'didn', 'doesn', 'isn', 'wasn', 'weren', 'won',
'wouldn', 'couldn', 'shouldn', 'haven', 'hasn', 'hadn'])
def extract_keywords(reviews, min_rating=None, max_rating=None):
"""从指定评分范围的评论中提取关键词"""
text = []
for r in reviews:
if min_rating and r['rating'] < min_rating: continue
if max_rating and r['rating'] > max_rating: continue
text.append(r.get('title', '').lower())
text.append(r.get('body', '').lower())
combined = ' '.join(text)
words = re.findall(r'\b[a-z]{3,}\b', combined)
filtered = [w for w in words if w not in stop_words and len(w) > 2]
return Counter(filtered).most_common(20)
# 好评关键词(4-5星)
positive_kw = extract_keywords(reviews, min_rating=4)
# 差评关键词(1-2星)
negative_kw = extract_keywords(reviews, max_rating=2)
```
#### 3b. 痛点分类(扩展版,覆盖用户要求的所有维度)
```python
pain_categories = {
'质量': ['quality', 'cheap', 'flimsy', 'broke', 'broken', 'defective', 'poor',
'damage', 'ruin', 'ruined', 'fell apart', 'durable', 'fragile', 'crack',
'cracked', 'rip', 'ripped', 'tear', 'torn', 'peel', 'peeled'],
'物流': ['shipping', 'delivery', 'arrived', 'late', 'delayed', 'package',
'packaging', 'box', 'damaged in transit', 'missing', 'lost'],
'尺寸': ['size', 'inch', 'fit', 'small', 'big', 'thin', 'thick', 'dimension',
'measurement', 'too small', 'too large', 'oversized', 'undersized',
'doesn\'t fit', 'tight', 'loose'],
'色差': ['color', 'colour', 'different color', 'not as pictured', 'shade',
'lighter', 'darker', 'faded', 'mismatch', 'looks different'],
'功能': ['function', 'feature', 'doesn\'t work', 'not work', 'fail', 'failed',
'malfunction', 'defective', 'useless', 'disappoint', 'advertised'],
'包装': ['packaging', 'package', 'box', 'wrapper', 'unpacked', 'unboxing',
'no instructions', 'missing parts', 'incomplete'],
'粘性/安装': ['stick', 'sticky', 'adhesive', 'glue', 'tape', 'peel', 'fell',
'falling', 'detach', 'nonstick', 'residue', 'install'],
'气味': ['smell', 'odor', 'stink', 'musty', 'mildew', 'chemical', 'smelly'],
'噪音': ['sound', 'noise', 'echo', 'acoustic', 'absorb', 'dampening', 'quiet', 'loud'],
'价格': ['price', 'expensive', 'cost', 'value', 'cheap', 'pricey', 'money', 'overpriced'],
'耐久性': ['last', 'lasting', 'durable', 'wear', 'fade', 'worn', 'degrade']
}
def classify_pain(reviews, max_rating=2):
"""对差评进行分类"""
pain_counts = {cat: 0 for cat in pain_categories}
pain_examples = {cat: [] for cat in pain_categories}
for r in reviews:
if r['rating'] > max_rating: continue
text = (r.get('title', '') + ' ' + r.get('body', '')).lower()
for cat, keywords in pain_categories.items():
for kw in keywords:
if kw in text:
pain_counts[cat] += 1
if len(pain_examples[cat]) < 3:
pain_examples[cat].append(r.get('body', '')[:200])
break
return pain_counts, pain_examples
```
#### 3c. 场景识别
```python
scenario_keywords = {
'卧室': ['bedroom', 'bed room', 'master bedroom', 'guest room'],
'客厅': ['living room', 'family room', 'den'],
'录音室/工作室': ['studio', 'music room', 'recording', 'home studio'],
'办公室': ['office', 'home office', 'work', 'workspace'],
'浴室': ['bathroom', 'water closet', 'bath'],
'厨房': ['kitchen', 'cabinet', 'refrigerator'],
'地下室': ['basement', 'downstairs', 'garage'],
'隔音墙': ['accent wall', 'feature wall', 'wall', 'ceiling'],
'降噪': ['neighbor', 'noise', 'soundproofing', 'hvac', 'closet', 'quiet']
}
def extract_scenarios(reviews):
"""从评论中提取使用场景"""
scenario_counts = {s: 0 for s in scenario_keywords}
scenario_examples = {s: [] for s in scenario_keywords}
for r in reviews:
text = (r.get('title', '') + ' ' + r.get('body', '')).lower()
for scene, keywords in scenario_keywords.items():
for kw in keywords:
if kw in text:
scenario_counts[scene] += 1
if len(scenario_examples[scene]) < 2:
scenario_examples[scene].append(r.get('body', '')[:150])
break
return scenario_counts, scenario_examples
```
#### 3d. 差评率趋势分析
```python
from collections import defaultdict
def review_trend(reviews):
"""按月份统计差评率趋势"""
monthly = defaultdict(lambda: {'total': 0, 'negative': 0})
for r in reviews:
date_str = r.get('date', '')
# 解析日期 "Reviewed in the United States on April 27, 2026"
import re
m = re.search(r'on\s+(\w+)\s+\d+,\s*(\d{4})', date_str)
if m:
month_key = f"{m.group(2)}-{m.group(1)[:3]}"
monthly[month_key]['total'] += 1
if r['rating'] <= 2:
monthly[month_key]['negative'] += 1
months = sorted(monthly.keys())
rates = []
for m in months:
total = monthly[m]['total']
neg = monthly[m]['negative']
rates.append(round(neg / total * 100, 1) if total > 0 else 0)
return months, rates
```
#### 3e. 未被满足需求挖掘
```python
unmet_need_patterns = [
(r'(wish|hope|should|could|would be (nice|great|better)|need|lack|missing|want|expect)',
'用户期望'),
(r'(only|just) (complain|issue|problem)', '局限性吐槽'),
(r'(compare|compared) (to|with)', '竞品对比'),
(r'(return|refund|replace)', '退货/换货需求'),
]
def extract_unmet_needs(reviews):
"""挖掘未被满足的需求"""
needs = []
for r in reviews:
text = (r.get('title', '') + ' ' + r.get('body', '')).lower()
for pattern, category in unmet_need_patterns:
if re.search(pattern, text):
needs.append({
'rating': r['rating'],
'category': category,
'text': r.get('body', '')[:300]
})
break
return needs
```
### Step 4: HTML报告生成
使用Chart.js CDN生成交互式HTML报告。
**用户偏好的配色方案:**
- 主色:`#0f3460`(深蓝)
- 强调色:`#e94560`(红)
- 好评:`#38a169` / `#48bb78` / `#68d391`(绿系)
- 中性:`#f6ad55`(橙)
- 差评:`#e53e3e` / `#fc8181`(红系)
- 功能蓝:`#3182ce` / `#4299e1` / `#63b3ed`
**HTML报告结构(按顺序):**
1. Header渐变背景(#0f3460→#16213e) + 报告标题+日期
2. 执行摘要卡片(双产品对比:ASIN/评分/评论数/好评率/差评率)
3. 评分分布柱状图(Chart.js grouped bar chart)— 双产品对比
4. 好评关键词横向柱状图(Chart.js horizontal bar)— Top10
5. 差评痛点甜甜圈图(Chart.js doughnut)— 痛点分类占比
6. 抱怨问题汇总表格 — 排名/问题/频次/典型引用
7. 未被满足需求分析 — 分类+用户原话+机会点
8. 差异化改进建议(三列布局:保留优点/避免坑/创新方向)
9. 客户使用场景极坐标图(Chart.js polarArea)
10. 差评率趋势折线图(Chart.js line chart)— **用户要求的重点**
11. 痛点雷达对比图(Chart.js radar)— 双产品对比
12. 详细评论数据(Tab切换,按评分筛选)
**CSS卡片风格:**
```css
.card { background:white; border-radius:12px; padding:24px; margin-bottom:20px; box-shadow:0 2px 12px rgba(0,0,0,0.06); }
.card h2 { color:#0f3460; border-left:4px solid #e94560; padding-left:12px; margin-bottom:16px; }
.insight { background:#fffbeb; border-left:4px solid #f6ad55; padding:16px; border-radius:0 8px 8px 0; margin:12px 0; }
.insight.green { background:#f0fff4; border-color:#48bb78; }
.insight.red { background:#fff5f5; border-color:#fc8181; }
.insight.blue { background:#ebf8ff; border-color:#4299e1; }
.metric-card { display:inline-block; background:#f7fafc; border-radius:8px; padding:16px 24px; margin:8px; text-align:center; }
.metric-value { font-size:28px; font-weight:bold; color:#0f3460; }
.metric-label { font-size:12px; color:#718096; text-transform:uppercase; }
```
**差评率趋势折线图(必须包含):**
```javascript
new Chart(document.getElementById('trendChart'), {
type: 'line',
data: {
labels: months, // ['2025-Jan', '2025-Feb', ...]
datasets: [
{
label: 'Product A 差评率',
data: ratesA,
borderColor: '#0f3460',
backgroundColor: 'rgba(15,52,96,0.1)',
fill: true,
tension: 0.3,
pointRadius: 4
},
{
label: 'Product B 差评率',
data: ratesB,
borderColor: '#e94560',
backgroundColor: 'rgba(233,69,96,0.1)',
fill: true,
tension: 0.3,
pointRadius: 4
}
]
},
options: {
responsive: true,
plugins: { title: { display: true, text: '差评率月度趋势变化' } },
scales: { y: { beginAtZero: true, title: { display: true, text: '差评率 (%)' } } }
}
});
```
### Step 5: Excel生成
使用openpyxl生成,7个工作表:
| 工作表 | 内容 | 颜色编码 |
|--------|------|----------|
| 原始评论数据 | 所有评论原始数据 | 绿=4-5★, 黄=3★, 红=1-2★ |
| 评分分布 | 评分统计汇总 | 无 |
| 好评关键词分析 | Top10关键词+频次+维度 | 绿色背景 |
| 差评痛点分析 | 痛点分类+严重程度+建议 | 红=高/极高, 黄=中 |
| 差异化改进建议 | 维度+问题+创新方向+优先级 | 红=P0, 黄=P1, 蓝=P2 |
| 使用场景分析 | 场景+提及次数+开发启示 | 无 |
| 竞品对比总表 | 多维度横向对比 | 无 |
**表头样式:**
```python
header_font = Font(bold=True, color='FFFFFF', size=11)
header_fill = PatternFill(start_color='0F3460', end_color='0F3460', fill_type='solid')
red_fill = PatternFill(start_color='FFF5F5', end_color='FFF5F5', fill_type='solid')
green_fill = PatternFill(start_color='F0FFF4', end_color='F0FFF4', fill_type='solid')
yellow_fill = PatternFill(start_color='FFFFF0', end_color='FFFFF0', fill_type='solid')
```
**自动列宽:**
```python
def auto_width(ws, min_width=10, max_width=50):
for col in range(1, ws.max_column + 1):
max_len = min_width
for row in range(1, ws.max_row + 1):
val = ws.cell(row=row, column=col).value
if val:
max_len = max(max_len, min(len(str(val)), max_width))
ws.column_dimensions[get_column_letter(col)].width = max_len + 2
```
### Step 6: 文件交付
#### 6a: 保存到本地workspace
```python
import shutil
dst_dir = os.path.expanduser('~/.hermes/workspace/amazon_review_analysis')
os.makedirs(dst_dir, exist_ok=True)
# shutil.copy2 from /tmp/amazon_review_analysis/
```
#### 6b: 上传HTML到Dinzee公网(推荐)
HTML报告必须上传到Dinzee获取公网链接,方便浏览器直接打开查看图表交互。
```bash
# curl上传(推荐,最稳定)
curl -sL -X POST "https://report.dinzee.ai/report/upload" \
-H "Authorization: 538f4ad962266f5bc62dabda825e43021820988fdeeca85caaa1aca20e49a0eb" \
-F "file=@/tmp/amazon_review_analysis/review-analysis-ASIN1-ASIN2.html;filename=review-analysis-ASIN1-ASIN2.html"
```
返回: `{"url": "https://report.dinzee.ai/review-analysis-ASIN1-ASIN2.html"}`
**命名规范**: `review-analysis-{ASIN1}-{ASIN2}.html` 或 `{类型}-{关键词}-{日期}.html`
#### 6c: 飞书IM发送附件
**⚠️ Feishu文件发送必须用MEDIA附件方式(已验证2026-05-20):**
- `send_message` 工具在Feishu上下文中不可靠(缺少home channel时会报错)
- **正确做法:在最终回复文本中直接包含 `MEDIA:` 路径,系统自动上传为飞书附件**
- HTML和Excel都要发,公网链接同时输出为裸链明文
```
MEDIA:/tmp/amazon_review_analysis/review-analysis.html
MEDIA:/tmp/amazon_review_analysis/review-analysis.xlsx
```
公网链接输出为裸链明文(不要Markdown链接格式):
```
https://report.dinzee.ai/review-analysis-ASIN1-ASIN2.html
```
**⚠️ 文件类型限制**: Dinzee仅支持 `.html`, `.csv`, `.json`, `.xlsx`, `.xls`, `.png`, `.jpg`。Excel(.xlsx)可直接上传。
#### 6d: 已验证的完整交付流程 (2026-05-20)
```bash
# 1. 生成HTML报告 → Python写入 /tmp/amazon_review_analysis/
# 2. 生成Excel文件 → openpyxl写入 /tmp/amazon_review_analysis/
# 3. 上传HTML到Dinzee
curl -sL -X POST "https://report.dinzee.ai/report/upload" \
-H "Authorization: 538f4ad962266f5bc62dabda825e43021820988fdeeca85caaa1aca20e49a0eb" \
-F "file=@/tmp/amazon_review_analysis/review-analysis-{ASIN1}-{ASIN2}.html;filename=review-analysis-{ASIN1}-{ASIN2}.html"
# 4. 上传Excel到Dinzee
curl -sL -X POST "https://report.dinzee.ai/report/upload" \
-H "Authorization: 538f4ad962266f5bc62dabda825e43021820988fdeeca85caaa1aca20e49a0eb" \
-F "file=@/tmp/amazon_review_analysis/review-analysis-{ASIN1}-{ASIN2}.xlsx;filename=review-analysis-{ASIN1}-{ASIN2}.xlsx"
# 5. 复制到workspace备份
cp /tmp/amazon_review_analysis/* ~/.hermes/workspace/amazon_review_analysis/
# 6. 在最终回复中用 MEDIA: 路径发送飞书附件 + 裸链
```
## Output 标准格式
最终输出给用户时,用中文大白话总结7个维度的分析结论,然后附上HTML和Excel文件。
格式:
```
📊 **竞品评论深度分析报告**
**ASIN: {A} vs {B}**
### 1️⃣ 好评Top5关键词
- 关键词1 (出现X次) — 用户认为...
- ...
### 2️⃣ 差评Top5痛点
- 痛点1 (X条提及, 严重程度: 高) — 典型问题:...
### 3️⃣ 抱怨最多的5个问题
1. 问题1 — X条相关评论
2. ...
### 4️⃣ 未被满足的需求/隐藏刚需
- 需求1:用户期望...但目前产品...
### 5️⃣ 差异化选品改进点 & 避坑要点
✅ 保留:...
❌ 避免:...
💡 创新方向:...
### 6️⃣ 客户主要使用场景
- 场景1 (X次提及) — 用户描述:...
### 7️⃣ 可视化报告
HTML报告:[链接]
Excel数据:[链接]
```
## Pitfalls
1. **Amazon评论页面需要登录** — `product-reviews/{asin}` URL会重定向到登录页。必须从产品页面内提取评论(产品页面显示约10条最新评论)。
2. **curl/requests被403** — Amazon反爬严格,直接HTTP请求被拦截。必须使用browser工具。
3. **IIFE包装必须** — 多次browser_console调用共享JS上下文,重复声明const会报SyntaxError。必须用`(function(){...})()`包装。
4. **评论正文被截断** — Amazon使用`a-cardui-deck`组件包裹评论,需从`[data-hook="reviewText"]`提取并清理模板文字(Brief content visible.../Read moreRead less)。
5. **histogram链接解析** — 评分分布最可靠来源是`a[href*="acr_dp_hist"]`链接文本,不是histogramTable(可能为空)。
6. **评论数量有限** — 产品页面通常只显示8-11条评论。如需更多,需在浏览器中翻页(但评论页需登录)。可补充web_search获取第三方评论摘要。
7. **浏览器console多次调用** — 每次调用都在同一JS上下文,避免全局变量污染。始终用IIFE。
8. **openpyxl需要安装** — 如果环境没有,需`pip install openpyxl`。
9. **中文输出** — 用户偏好中文,所有分析文本用中文,评论原文保留英文。
10. **多语言评论** — Amazon.com包含西语/葡语/阿拉伯语等非英语评论,关键词提取时过滤非ASCII词。
11. **差评率趋势** — 评论日期格式不统一,需用正则`on\s+(\w+)\s+\d+,\s*(\d{4})`提取月份。
12. **HTML文件体积** — 如果评论数据量大,HTML内嵌JSON可能超过1MB,注意飞书上传限制。
13. **Feishu文件发送** — `send_message`工具在Feishu上下文中不可靠(会报"no home channel"错误)。**必须用MEDIA路径**写在回复文本中,系统自动上传为飞书附件。
14. **Dinzee上传** — curl方式最稳定,从未失败。命名用 `review-analysis-{ASIN1}-{ASIN2}.html` 格式。Excel(.xlsx)可直接上传。
15. **停用词扩展** — `set/pack/first/second/third` 应加入停用词表,过滤包装量词噪声(如"18 Pack"、"6-Piece")。
## References
- `references/amazon-dom-selectors.md` — Amazon评论DOM选择器备忘录 + Anti-Bot工作区 + 评分分布提取逻辑
- `references/excel-generation-pattern.md` — openpyxl Excel生成标准模式,7个工作表结构+颜色编码
- `references/nlp-analysis-constants.md` — NLP分析常量:停用词表、11维痛点分类、场景关键词、满意度映射
- `templates/chartjs-review-report.html` — Chart.js交互式HTML报告模板,7种图表类型+CSS卡片样式
don't have the plugin yet? install it then click "run inline in claude" again.