前言
做电商运营、竞品调研、产品迭代的同学,几乎都会遇到一个痛点:想要持续跟踪商品用户反馈,人工翻看评价页面效率极低。当需要同时盯多款竞品,还要定期统计好评、差评、规格反馈、晒图情况,单纯手动复制粘贴几乎不可行。
很多同学会尝试自己写页面解析脚本,但平台防护策略更新快,经常没过几天就无法正常拿到内容,调试、维护要耗费大量时间。
最近在用 Open‑Claw 做项目,发现它可以省去页面解析、对抗防护的繁琐工作,直接拿到规整后的评价原始内容。我们可以基于这套能力,快速搭建一套简易的监控脚本,实现定时拉取商品评价、增量识别新增反馈、简单文本统计分析,输出本地报表,完成基础的竞品口碑监控。
提示:本文所有内容仅用于个人学习研究,使用相关能力请遵守对应平台规则,请勿用于违规批量爬取。
整体思路
整体分为 4 个步骤:
准备身份凭证,获取商品编号;
编写拉取逻辑,分页获取评价原始内容;
做增量判断,只处理新增评价,避免重复分析;
简单统计分析:好评差评占比、高频关键词提取,导出 csv 文件;
增加定时循环,实现简易持续监控。
拿到的数据字段包含:评价正文、评价时间、购买规格、买家脱敏昵称、晒图地址、追评内容等,足够做日常口碑调研分析万邦开放平...。
环境准备
本地需要安装依赖库
完整可运行代码
import requests
import time
import csv
import pandas as pd
from collections import Counter
# ===================== 配置区域,请自行修改 =====================
TOKEN = "your_access_key"
SECRET = "your_secret_code"
TARGET_ITEM_ID = "723456789123" # 目标商品id,从商品链接提取
MAX_PAGE = 5 # 最多读取多少页评价
SAVE_CSV_PATH = "./goods_review.csv"
# 用于内存记录已经处理过的评价id,防止重复统计
processed_review_ids = set()
# ==============================================================
def fetch_review_page(item_id, page_no, sort_type=1, rate_filter=0):
"""
获取单页评价
sort_type:1最新,2最热
rate_filter:0全部,1好评,2中评,3差评
"""
params = {
"key": TOKEN,
"secret": SECRET,
"num_iid": item_id,
"page_no": page_no,
"page_size": 40,
"sort": sort_type,
"rate_type": rate_filter,
"result_type": "json"
}
try:
resp = requests.get(
"https://collect.openclaw.cloud/pull",
params=params,
timeout=15
)
json_data = resp.json()
if json_data.get("code") != 0:
print(f"第{page_no}页请求异常:{json_data.get('msg')}")
return []
review_list = json_data.get("items", {}).get("item", [])
return review_list
except Exception as e:
print(f"网络异常 {str(e)}")
return []
def parse_raw_review(raw_item):
"""清洗单条原始数据,提取需要字段"""
rid = raw_item.get("rate_id", "")
if not rid:
return None
info = {
"review_id": rid,
"nick": raw_item.get("display_user_nick", ""),
"content": raw_item.get("rate_content", "").strip(),
"sku_spec": raw_item.get("auction_sku", ""),
"rate_date": raw_item.get("rate_date", ""),
"star": raw_item.get("rate_star", 0),
"pic_list": "|".join(raw_item.get("pics", [])) if raw_item.get("pics") else "",
"add_review": raw_item.get("add_feedback", "").strip()
}
return info
def save_to_csv(review_data_list, file_path):
"""追加写入csv,保存评价记录"""
headers = ["review_id","nick","content","sku_spec","rate_date","star","pic_list","add_review"]
file_exist = False
try:
with open(file_path, "r", encoding="utf‑8‑sig") as f:
file_exist = True
except FileNotFoundError:
pass
with open(file_path, "a", newline="", encoding="utf‑8‑sig") as f:
writer = csv.DictWriter(f, fieldnames=headers)
if not file_exist:
writer.writeheader()
for row in review_data_list:
writer.writerow(row)
def simple_text_analysis(df_new):
"""简单数据分析,打印统计结果"""
if df_new.empty:
print("本轮没有新评价")
return
total = len(df_new)
good = len(df_new[df_new["star"] >=4])
mid = len(df_new[df_new["star"] ==3])
bad = len(df_new[df_new["star"] <=2])
print("\n===========本轮新增评价统计===========")
print(f"本轮新增条数:{total}")
print(f"好评:{good},占比 {good/total:.2%}")
print(f"中评:{mid},占比 {mid/total:.2%}")
print(f"差评:{bad},占比 {bad/total:.2%}")
# 简单分词提取高频词,这里做简单切分,生产环境建议替换专业分词库
all_words = []
for text in df_new["content"]:
words = [w for w in str(text).replace(" ","") if len(w)>=2]
all_words.extend(list(words))
top_word = Counter(all_words).most_common(12)
print("高频词Top12:",top_word)
print("======================================\n")
def run_one_cycle():
"""执行一轮采集任务"""
new_reviews = []
for page in range(1, MAX_PAGE+1):
print(f"正在读取第 {page} 页")
raw_items = fetch_review_page(TARGET_ITEM_ID, page)
if not raw_items:
break
for raw in raw_items:
parsed = parse_raw_review(raw)
if not parsed:
continue
if parsed["review_id"] in processed_review_ids:
continue
processed_review_ids.add(parsed["review_id"])
new_reviews.append(parsed)
time.sleep(2)
if len(new_reviews) > 0:
save_to_csv(new_reviews, SAVE_CSV_PATH)
df = pd.DataFrame(new_reviews)
simple_text_analysis(df)
else:
print("本轮未发现新增评价")
if __name__ == "__main__":
# 单次运行 run_one_cycle()
# 如果要做持续监控,打开下面循环,注意间隔不要过短
run_one_cycle()
"""
while True:
run_one_cycle()
print("休眠30分钟,等待下一轮监控...")
time.sleep(60 * 30)
"""代码说明
fetch_review_page:负责分页获取内容,可以筛选好评、中评、差评,也可以选择最新或者最热排序。
parse_raw_review:把杂乱的原始结果做规整,把评价 id、规格、晒图、追评提取出来,评价 id 作为唯一标识,用来做增量过滤。
processed_review_ids内存集合,记录已经处理过的评价 id,每一轮只分析新出来的反馈,不会重复统计历史老评价。
simple_text_analysis简易分析,统计星级分布,简单做高频词统计。正式业务场景可以替换 jieba 分词,接入情绪分析模型做情感判断。
csv 持久化把每一轮数据追加写入本地文件,方便后续 Excel 打开复盘。
如果开启 while 循环,就变成定时监控脚本,注意休眠时间不能太短,避免短时间高频访问。
落地场景拓展
拿到结构化评价数据之后,还可以延伸做很多事情:
竞品监控:同时配置多个商品编号,循环遍历,定时输出竞品差评变化,快速感知竞品质量问题、用户集中吐槽点;
自家商品质检:持续盯自己店铺商品,一旦出现新增差评,脚本打印告警,运营可以及时跟进;
规格问题统计:统计哪个 SKU 规格对应的差评最多,辅助供应链、产品做优化;
晒图素材沉淀:把晒图链接保存,后续做用户研究素材。
踩坑总结
不要设置每页数量过大,单次返回数据量太高容易报错,建议控制在 40‑50 以内;
一定要做延时,循环中间 time.sleep,否则容易触发限流;
评价 id 务必保存,用来做增量识别,不然每次全量拉取,会重复分析历史内容;
部分评价会为空、或者只有表情符号,业务代码可以增加文本长度过滤,剔除无效内容;
正式部署不要硬编码凭证,可以放到环境变量中。
小结
借助 Open‑Claw 的能力,我们不需要花费大量精力维护页面解析规则,就可以快速完成评价获取、增量监控、简单数据分析,十几行核心代码就能搭建起个人调研使用的口碑监控脚本。