ecommerce-review-analyzer
# 淘宝京东拼多多评论分析工具
自动抓取商品评论,分析好评差评,生成专业分析报告。
## 功能特点
- 🛒 **三平台支持**:淘宝、京东、拼多多
- 📊 **自动抓取**:浏览器自动化获取评论
- 🧠 **智能分析**:AI分析评论内容和情感
- 📈 **评分统计**:好评率、差评率、评分分布
- 💬 **差评详情**:完整差评内容和出处
- 💡 **改进建议**:AI生成改进建议
- 📄 **专业报告**:Word和PDF双格式输出
- 🎯 **多商品对比**:同一店铺多个商品对比
- 🏪 **多店铺对比**:不同店铺对比分析
- 💡 **改进建议**: AI生成改进建议
- 📄 **专业报告**: Word (.docx) + PDF 输出
- 🎯 **多商品**: 支持同一店铺多个商品
- 🏪 **多店铺**: 支持不同店铺对比分析
- 🛒 **多平台**: 支持淘宝/京东/拼多多对比
## 使用场景
- "分析淘宝店铺评论" / "Analyze Taobao reviews"
- "查看京东差评" / "Check JD negative reviews"
- "帮我分析这个产品的用户反馈"
- "ecommerce-review-analyzer"
## 支持平台
| 平台 | 方式 | 需要登录 |
|------|------|----------|
| 淘宝 | 浏览器自动化 | ✅ |
| 京东 | 浏览器自动化 | ✅ |
| 拼多多 | 浏览器自动化 | ✅ |
## 前置条件
- OpenClaw v2026.3.22+ (浏览器自动化)
- **必须使用OpenClaw内置浏览器自动化**(不支持第三方浏览器工具)
- 已登录目标电商平台
- 已配置OpenClaw browser工具
## ⚠️ 重要声明
> **本技能强制使用OpenClaw内置浏览器自动化功能。**
> 不支持Playwright、Selenium等第三方浏览器工具。
> 必须使用OpenClaw v2026.3.22+的browser工具。
> 浏览器会话继承用户已登录状态。
---
## 工作流程
```
用户请求
↓
1. 检测登录状态
↓
2. 协助扫码登录(如需要)
↓
3. 抓取商品评论
↓
4. AI分析评论内容
↓
5. 生成专业报告(Word+PDF)
```
---
## 输出格式
### Word报告 (.docx)
包含:
- 商品基本信息
- 评分分布表格
- 差评详情(含完整评论)
- 改进建议
### PDF报告
与Word内容完全一致,便于打印。
---
## 示例报告
```
┌─────────────────────────────────────────────┐
│ 📊 商品评论分析报告 │
└─────────────────────────────────────────────┘
商品:智能手表 Pro
平台:淘宝 / 京东
分析评论:1,234条
📊 评分分布
├─ ⭐⭐⭐⭐⭐ 好评:78% (970条)
├─ ⭐⭐⭐ 中评:15% (186条)
└─ ⭐⭐ 差评:7% (78条)
💬 差评详情
差评 1: ⭐⭐
"充电太慢了,充满要4个小时,退货!"
👤 用户B | 📅 2026-03-18 | 🏪 科技旗舰店
差评 2: ⭐
"App经常闪退,客服态度差,差评!"
👤 用户C | 📅 2026-03-15 | 🏪 科技旗舰店
💡 改进建议
• 优化充电速度
• 修复App稳定性
• 加强客服培训
```
---
## 浏览器自动化代码
### 抓取淘宝评论
```javascript
// 1. 打开商品页面
await browser.open({
url: "https://item.taobao.com/item.htm?id=商品ID"
})
// 2. 等待页面加载
await browser.wait({ timeout: 5000 })
// 3. 检查是否需要登录
const needsLogin = await browser.evaluate(() => {
return document.querySelector('.login-dialog') !== null
})
if (needsLogin) {
// 协助用户扫码登录
const qrImage = await browser.screenshot({ selector: '.qrcode-img' })
await chat.send("⚠️ 请扫描二维码登录淘宝:", { image: qrImage })
await browser.waitForNavigation({ timeout: 120000 })
}
// 4. 点击"评价"标签
await browser.click({ selector: 'a[href="#J_TabBar"]' })
await browser.wait({ timeout: 3000 })
// 5. 滚动加载更多评论
for (let i = 0; i < 3; i++) {
await browser.evaluate(() => window.scrollBy(0, 500))
await browser.wait({ timeout: 1000 })
}
// 6. 提取评论数据
const reviews = await browser.evaluate(() => {
const items = []
document.querySelectorAll('.J_KgRate_ReviewItem').forEach(el => {
const rating = el.querySelector('.tb-rev-item-rating')?.children.length || 0
const content = el.querySelector('.tb-rev-item__body-text')?.innerText || ''
const user = el.querySelector('.tb-rev-item__user-name')?.innerText || ''
const date = el.querySelector('.tb-rev-item__time')?.innerText || ''
items.push({
rating: rating,
content: content.trim(),
user: user.trim(),
date: date.trim()
})
})
return items
})
return reviews
```
### 抓取京东评论
```javascript
// 1. 打开商品页面
await browser.open({
url: "https://item.jd.com/商品ID.html"
})
// 2. 等待加载
await browser.wait({ timeout: 5000 })
// 3. 滚动到评论区
await browser.evaluate(() => {
const element = document.querySelector('#comment')
if (element) element.scrollIntoView()
})
await browser.wait({ timeout: 2000 })
// 4. 提取评论
const reviews = await browser.evaluate(() => {
const items = []
document.querySelectorAll('.comment-item').forEach(el => {
const rating = el.querySelector('.comment-star')?.className.match(/\d+/) || [0]
const content = el.querySelector('.comment-con')?.innerText || ''
const user = el.querySelector('.user-name')?.innerText || ''
const date = el.querySelector('.comment-date')?.innerText || ''
items.push({
rating: parseInt(rating[0]) || 5,
content: content.trim(),
user: user.trim(),
date: date.trim()
})
})
return items
})
return reviews
```
### 抓取拼多多评论
```javascript
// 1. 打开商品页面
await browser.open({
url: "https://mobile.yangkeduo.com/goods.html?goods_id=商品ID"
})
// 2. 等待加载
await browser.wait({ timeout: 5000 })
// 3. 点击评价标签
await browser.click({ selector: '[class*="comment"]' })
await browser.wait({ timeout: 2000 })
// 4. 提取评论
const reviews = await browser.evaluate(() => {
const items = []
document.querySelectorAll('[class*="comment-item"]').forEach(el => {
const content = el.innerText || ''
if (content.length > 10) {
items.push({
content: content.trim(),
platform: '拼多多'
})
}
})
return items
})
return reviews
```
---
## Python代码示例
```python
from docx import Document
from docx.shared import Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from fpdf import FPDF
from datetime import datetime
import os
class ReviewAnalyzer:
def __init__(self):
self.reviews = []
def add_review(self, product, platform, store, rating, content, date, user):
"""添加评论数据"""
self.reviews.append({
'product': product,
'platform': platform,
'store': store,
'rating': rating,
'content': content,
'date': date,
'user': user
})
def analyze(self):
"""分析评论数据"""
total = len(self.reviews)
if total == 0:
return None
positive = len([r for r in self.reviews if r['rating'] >= 4])
negative = len([r for r in self.reviews if r['rating'] <= 2])
neutral = total - positive - negative
avg_rating = sum(r['rating'] for r in self.reviews) / total
return {
'total': total,
'positive': positive,
'negative': negative,
'neutral': neutral,
'avg_rating': avg_rating,
'positive_rate': positive / total * 100,
'negative_rate': negative / total * 100,
'negative_reviews': [r for r in self.reviews if r['rating'] <= 2]
}
def generate_word_report(self, analysis, output_path):
"""生成Word报告"""
doc = Document()
section = doc.sections[0]
section.top_margin = Cm(2)
section.bottom_margin = Cm(2)
section.left_margin = Cm(2.5)
section.right_margin = Cm(2.5)
# 标题
title = doc.add_heading('Product Review Analysis Report', 0)
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 基本信息
info_table = doc.add_table(rows=4, cols=2)
info_table.style = 'Table Grid'
info_table.cell(0, 0).text = 'Product'
info_table.cell(0, 1).text = self.reviews[0]['product'] if self.reviews else 'N/A'
info_table.cell(1, 0).text = 'Platform'
info_table.cell(1, 1).text = self.reviews[0]['platform'] if self.reviews else 'N/A'
info_table.cell(2, 0).text = 'Reviews'
info_table.cell(2, 1).text = str(analysis['total'])
info_table.cell(3, 0).text = 'Date'
info_table.cell(3, 1).text = datetime.now().strftime('%Y-%m-%d')
doc.add_paragraph()
# 评分分布
h = doc.add_heading('Rating Distribution', level=1)
rating_table = doc.add_table(rows=4, cols=3)
rating_table.style = 'Table Grid'
rating_table.cell(0, 0).text = 'Rating'
rating_table.cell(0, 1).text = 'Count'
rating_table.cell(0, 2).text = 'Percentage'
rating_table.cell(1, 0).text = 'Positive (4-5)'
rating_table.cell(1, 1).text = str(analysis['positive'])
rating_table.cell(1, 2).text = f"{analysis['positive_rate']:.1f}%"
rating_table.cell(2, 0).text = 'Neutral (3)'
rating_table.cell(2, 1).text = str(analysis['neutral'])
rating_table.cell(2, 2).text = f"{analysis['neutral'] / analysis['total'] * 100:.1f}%"
rating_table.cell(3, 0).text = 'Negative (1-2)'
rating_table.cell(3, 1).text = str(analysis['negative'])
rating_table.cell(3, 2).text = f"{analysis['negative_rate']:.1f}%"
doc.add_paragraph()
# 差评详情
h = doc.add_heading('Negative Reviews', level=1)
for i, review in enumerate(analysis['negative_reviews'], 1):
entry = doc.add_paragraph()
run = entry.add_run(f'Review {i}: {"*" * review["rating"]}')
run.font.bold = True
quote = doc.add_paragraph()
quote.add_run(f'"{review["content"]}"').font.italic = True
detail = doc.add_paragraph()
detail.add_run(f'User: {review["user"]} | Date: {review["date"]}').font.color.rgb = RGBColor(100, 100, 100)
doc.add_paragraph()
doc.save(output_path)
return output_path
def generate_pdf_report(self, analysis, output_path):
"""生成PDF报告"""
pdf = FPDF()
pdf.add_page()
pdf.set_auto_page_break(auto=True, margin=15)
# 标题
pdf.set_font('Helvetica', 'B', 20)
pdf.set_text_color(30, 60, 114)
pdf.cell(0, 12, 'Product Review Analysis', new_x='LMARGIN', new_y='NEXT', align='C')
pdf.ln(5)
# 基本信息
pdf.set_font('Helvetica', '', 11)
pdf.set_text_color(51, 51, 51)
pdf.cell(0, 6, f'Reviews: {analysis["total"]}', new_x='LMARGIN', new_y='NEXT')
pdf.ln(5)
# 评分分布
pdf.set_font('Helvetica', 'B', 14)
pdf.set_text_color(30, 60, 114)
pdf.cell(0, 8, 'Rating Distribution', new_x='LMARGIN', new_y='NEXT')
pdf.ln(5)
pdf.set_font('Helvetica', '', 11)
pdf.set_text_color(51, 51, 51)
pdf.cell(0, 6, f'Positive: {analysis["positive"]} ({analysis["positive_rate"]:.1f}%)', new_x='LMARGIN', new_y='NEXT')
pdf.cell(0, 6, f'Negative: {analysis["negative"]} ({analysis["negative_rate"]:.1f}%)', new_x='LMARGIN', new_y='NEXT')
pdf.ln(5)
# 差评详情
pdf.set_font('Helvetica', 'B', 14)
pdf.set_text_color(30, 60, 114)
pdf.cell(0, 8, 'Negative Reviews', new_x='LMARGIN', new_y='NEXT')
pdf.ln(5)
pdf.set_font('Helvetica', '', 10)
pdf.set_text_color(51, 51, 51)
for i, review in enumerate(analysis['negative_reviews'], 1):
pdf.cell(0, 6, f'Review {i}: {"*" * review["rating"]}', new_x='LMARGIN', new_y='NEXT')
pdf.multi_cell(0, 5, f'"{review["content"]}"')
pdf.cell(0, 5, f'User: {review["user"]} | Date: {review["date"]}', new_x='LMARGIN', new_y='NEXT')
pdf.ln(5)
pdf.output(output_path)
return output_path
# 使用示例
analyzer = ReviewAnalyzer()
# 添加评论
analyzer.add_review('Smart Watch Pro', 'Taobao', 'Tech Store', 5, 'Very good!', '2026-03-20', 'User A')
analyzer.add_review('Smart Watch Pro', 'Taobao', 'Tech Store', 2, 'Bad quality!', '2026-03-15', 'User B')
# 分析
analysis = analyzer.analyze()
# 生成报告
analyzer.generate_word_report(analysis, 'report.docx')
analyzer.generate_pdf_report(analysis, 'report.pdf')
```
---
## Notes
- 使用OpenClaw内置浏览器自动化
- 需要登录电商平台
- 支持中文评论分析
- 数据准确性优先
- 数据准确性优先
- 支持中文评论分析
标签
skill
ai