×

api 数据挖掘

Open‑Claw 实战|低成本搭建电商评论监控与口碑数据分析系统

admin admin 发表于2026-07-31 10:08:49 浏览10 评论0

抢沙发发表评论

前言

做电商运营、竞品调研、产品迭代的同学,几乎都会遇到一个痛点:想要持续跟踪商品用户反馈,人工翻看评价页面效率极低。当需要同时盯多款竞品,还要定期统计好评、差评、规格反馈、晒图情况,单纯手动复制粘贴几乎不可行。

很多同学会尝试自己写页面解析脚本,但平台防护策略更新快,经常没过几天就无法正常拿到内容,调试、维护要耗费大量时间。

最近在用 Open‑Claw 做项目,发现它可以省去页面解析、对抗防护的繁琐工作,直接拿到规整后的评价原始内容。我们可以基于这套能力,快速搭建一套简易的监控脚本,实现定时拉取商品评价、增量识别新增反馈、简单文本统计分析,输出本地报表,完成基础的竞品口碑监控。

提示:本文所有内容仅用于个人学习研究,使用相关能力请遵守对应平台规则,请勿用于违规批量爬取。

整体思路

整体分为 4 个步骤:

  1. 准备身份凭证,获取商品编号;

  2. 编写拉取逻辑,分页获取评价原始内容;

  3. 做增量判断,只处理新增评价,避免重复分析;

  4. 简单统计分析:好评差评占比、高频关键词提取,导出 csv 文件;

  5. 增加定时循环,实现简易持续监控。

拿到的数据字段包含:评价正文、评价时间、购买规格、买家脱敏昵称、晒图地址、追评内容等,足够做日常口碑调研分析万邦开放平...。

环境准备

本地需要安装依赖库

pip install requests pandas collections

完整可运行代码

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)
    """

代码说明

  1. fetch_review_page:负责分页获取内容,可以筛选好评、中评、差评,也可以选择最新或者最热排序。

  2. parse_raw_review:把杂乱的原始结果做规整,把评价 id、规格、晒图、追评提取出来,评价 id 作为唯一标识,用来做增量过滤。

  3. processed_review_ids内存集合,记录已经处理过的评价 id,每一轮只分析新出来的反馈,不会重复统计历史老评价。

  4. simple_text_analysis简易分析,统计星级分布,简单做高频词统计。正式业务场景可以替换 jieba 分词,接入情绪分析模型做情感判断。

  5. csv 持久化把每一轮数据追加写入本地文件,方便后续 Excel 打开复盘。

  6. 如果开启 while 循环,就变成定时监控脚本,注意休眠时间不能太短,避免短时间高频访问。

落地场景拓展

拿到结构化评价数据之后,还可以延伸做很多事情:

  1. 竞品监控:同时配置多个商品编号,循环遍历,定时输出竞品差评变化,快速感知竞品质量问题、用户集中吐槽点;

  2. 自家商品质检:持续盯自己店铺商品,一旦出现新增差评,脚本打印告警,运营可以及时跟进;

  3. 规格问题统计:统计哪个 SKU 规格对应的差评最多,辅助供应链、产品做优化;

  4. 晒图素材沉淀:把晒图链接保存,后续做用户研究素材。

踩坑总结

  1. 不要设置每页数量过大,单次返回数据量太高容易报错,建议控制在 40‑50 以内;

  2. 一定要做延时,循环中间 time.sleep,否则容易触发限流;

  3. 评价 id 务必保存,用来做增量识别,不然每次全量拉取,会重复分析历史内容;

  4. 部分评价会为空、或者只有表情符号,业务代码可以增加文本长度过滤,剔除无效内容;

  5. 正式部署不要硬编码凭证,可以放到环境变量中。

小结

借助 Open‑Claw 的能力,我们不需要花费大量精力维护页面解析规则,就可以快速完成评价获取、增量监控、简单数据分析,十几行核心代码就能搭建起个人调研使用的口碑监控脚本。


少长咸集

群贤毕至

访客