<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>万邦api博客</title><link>https://shopapi.com.cn/</link><description>Good Luck To You!</description><item><title>Open Claw 落地京东商品自动化监控与数据分析，零基础搭建长效运营数据系统（完整可运行 Python 教程）</title><link>https://shopapi.com.cn/?id=208</link><description>&lt;p&gt;&lt;span data-cke-copybin-start=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;前言&lt;/h2&gt;&lt;p&gt;做京东电商运营、竞品调研、无货源铺货、品牌数据复盘的从业者，长期会面临几个棘手痛点：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;人工盯守几十上百款竞品，价格变动、库存缺货、活动调价发现严重滞后；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;手动整理商品销量、评价、规格参数、历史价格，统计效率极低，数据误差大；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;普通简易采集工具字段残缺，拿不到多 SKU 明细、图文详情、活动优惠、类目参数等深度数据；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;爬虫采集容易风控封禁，频繁失效，维护成本居高不下。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;近期一直在使用 Open Claw 做电商数据自动化落地，借助一款高阶商品详情查询能力，仅用几十行代码，就搭建出&lt;strong&gt;全天候竞品监控 + 结构化数据分析 + 数据存档&lt;/strong&gt;一体化工具，无需频繁维护采集规则，稳定性强、字段全面。本文从原理讲解、环境搭建、基础单商品拉取、定时监控、批量数据分析、数据持久化全流程落地，所有代码复制即可运行，适配个人开发者、中小型电商团队日常使用，内容适合 CSDN、知乎技术社区发布。&lt;/p&gt;&lt;h2&gt;一、方案整体思路介绍&lt;/h2&gt;&lt;h3&gt;1. Open Claw 定位&lt;/h3&gt;&lt;p&gt;Open Claw 是轻量化自动化调度框架，核心作用是统一规范化数据拉取、任务调度、异常重试、数据清洗、规则判断，不用手动编写网络请求容错、签名校验、接口轮询逻辑，专注业务逻辑开发。搭配高阶商品详情查询能力，可以一次性获取京东商品全维度信息：基础标题、实时售价、划线原价、多规格 SKU、库存、店铺信息、商品图文、详情参数、累计销量、评价标签、优惠活动、历史价格区间等全部内容。&lt;/p&gt;&lt;h3&gt;2. 整套系统三大核心模块&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;基础数据拉取模块&lt;/strong&gt;：单商品精准采集，自定义筛选返回字段，精简冗余数据；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;定时监控预警模块&lt;/strong&gt;：循环巡检商品，价格下跌、库存清零、上新活动自动告警；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据分析存档模块&lt;/strong&gt;：批量采集数据清洗，计算折扣率、销量增速，落地 CSV 表格长期复盘。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;3. 前置准备&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;运行环境：Python3.8 及以上，安装依赖库&lt;code&gt;requests&lt;/code&gt;；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;身份凭证：提前申请专属密钥对（&lt;span aria-label=&quot;a 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_inline cke_widget_csdnlink cke_widget_wrapper_link-info cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;a&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;4&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;link-info cke_widget_editable cke_widget_element&quot; contenteditable=&quot;true&quot; data-cke-enter-mode=&quot;2&quot; data-cke-widget-data=&quot;%7B%22url%22%3A%22https%3A%2F%2Fo0b.cn%2Ficris%22%2C%22text%22%3A%22key%E3%80%81secret%22%2C%22desc%22%3A%22%22%2C%22icon%22%3A%22%22%2C%22isCard%22%3Afalse%2C%22hasResquest%22%3Atrue%2C%22iconDefault%22%3A%22https%3A%2F%2Fcsdnimg.cn%2Frelease%2Fblog_editor_html%2Frelease2.4.6%2Fckeditor%2Fplugins%2FCsdnLink%2Ficons%2Ficon-default.png%3Ft%3DQ239%22%2C%22id%22%3A%22cN4TUL-1785639228896%22%2C%22classes%22%3A%7B%22link-info%22%3A1%7D%7D&quot; data-cke-widget-editable=&quot;text&quot; data-cke-widget-keep-attr=&quot;0&quot; data-link-icon=&quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=Q239&quot; data-link-title=&quot;key、secret&quot; data-widget=&quot;csdnlink&quot; href=&quot;https://o0b.cn/icris&quot; title=&quot;key、secret&quot;&gt;&lt;strong&gt;key、secret&lt;/strong&gt;&lt;/a&gt;&lt;/span&gt;）；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;商品 ID：京东商品链接末尾数字串即为商品唯一 ID； 安装依赖命令：&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;0&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22pip%20install%20requests%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;pip&amp;nbsp;install&amp;nbsp;requests&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;二、第一阶段：基础开发 —— 单商品全量数据稳定拉取&lt;/h2&gt;&lt;p&gt;这是整个系统的底层基础，先完成单次商品详情稳定获取，Open Claw 会自动处理网络超时、请求重试、缓存加速、格式转换，我们只需要配置参数、解析返回数据。&lt;/p&gt;&lt;h3&gt;完整基础代码&lt;/h3&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;1&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20requests%5Cnimport%20json%5Cnfrom%20datetime%20import%20datetime%5Cn%5Cn%23%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE%E5%8C%BA%EF%BC%8C%E8%87%AA%E8%A1%8C%E4%BF%AE%E6%94%B9%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5CnKEY%20%3D%20%5C%22%E5%A1%AB%E5%86%99%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9Ekey%5C%22%5CnSECRET%20%3D%20%5C%22%E5%A1%AB%E5%86%99%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9Esecret%5C%22%5Cn%23%20%E7%9B%AE%E6%A0%87%E4%BA%AC%E4%B8%9C%E5%95%86%E5%93%81ID%EF%BC%8C%E8%87%AA%E8%A1%8C%E6%9B%BF%E6%8D%A2%5CnTARGET_ITEM_ID%20%3D%20%5C%2210335871600%5C%22%5Cn%23%20%E5%8F%AF%E9%80%89%E5%8F%82%E6%95%B0%E9%85%8D%E7%BD%AE%EF%BC%9Ajson%E8%BF%94%E5%9B%9E%E6%A0%BC%E5%BC%8F%EF%BC%8C%E5%85%B3%E9%97%AD%E7%BC%93%E5%AD%98%E5%AE%9E%E6%97%B6%E6%9C%80%E6%96%B0%E6%95%B0%E6%8D%AE%5CnBASE_PARAMS%20%3D%20%7B%5Cn%20%20%20%20%5C%22key%5C%22%3A%20KEY%2C%5Cn%20%20%20%20%5C%22secret%5C%22%3A%20SECRET%2C%5Cn%20%20%20%20%5C%22cache%5C%22%3A%20%5C%22no%5C%22%2C%5Cn%20%20%20%20%5C%22result_type%5C%22%3A%20%5C%22json%5C%22%5Cn%7D%5Cn%5Cnclass%20JdGoodsClient%3A%5Cn%20%20%20%20def%20__init__(self)%3A%5Cn%20%20%20%20%20%20%20%20self.base_url%20%3D%20%5C%22https%3A%2F%2Fapi-gw.xxx.cn%2Fjd%2Fitem_get_pro%5C%22%5Cn%5Cn%20%20%20%20def%20get_single_goods_detail(self%2C%20item_id%2C%20need_fields%3DNone)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20%E8%8E%B7%E5%8F%96%E5%8D%95%E5%93%81%E9%AB%98%E9%98%B6%E8%AF%A6%E6%83%85%5Cn%20%20%20%20%20%20%20%20%3Aparam%20item_id%3A%20%E5%95%86%E5%93%81ID%5Cn%20%20%20%20%20%20%20%20%3Aparam%20need_fields%3A%20%E8%87%AA%E5%AE%9A%E4%B9%89%E9%9C%80%E8%A6%81%E8%BF%94%E5%9B%9E%E7%9A%84%E5%AD%97%E6%AE%B5%EF%BC%8CNone%E5%88%99%E8%BF%94%E5%9B%9E%E5%85%A8%E9%87%8F%E5%AD%97%E6%AE%B5%5Cn%20%20%20%20%20%20%20%20%3Areturn%3A%20%E7%BB%93%E6%9E%84%E5%8C%96%E5%95%86%E5%93%81%E5%AD%97%E5%85%B8%20%2F%20None%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20params%20%3D%20BASE_PARAMS.copy()%5Cn%20%20%20%20%20%20%20%20params%5B%5C%22num_iid%5C%22%5D%20%3D%20item_id%5Cn%20%20%20%20%20%20%20%20if%20need_fields%20is%20not%20None%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20params%5B%5C%22fields%5C%22%5D%20%3D%20need_fields%5Cn%20%20%20%20%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%23%20Open%20Claw%E7%BB%9F%E4%B8%80%E8%B0%83%E5%BA%A6%E5%8F%91%E8%B5%B7%E7%BD%91%E7%BB%9C%E8%AF%B7%E6%B1%82%EF%BC%8C%E5%86%85%E7%BD%AE3%E6%AC%A1%E8%B6%85%E6%97%B6%E9%87%8D%E8%AF%95%5Cn%20%20%20%20%20%20%20%20%20%20%20%20resp%20%3D%20requests.get(url%3Dself.base_url%2C%20params%3Dparams%2C%20timeout%3D12)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20resp.raise_for_status()%5Cn%20%20%20%20%20%20%20%20%20%20%20%20raw_data%20%3D%20resp.json()%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%AF%B7%E6%B1%82%E7%8A%B6%E6%80%81%E6%A0%A1%E9%AA%8C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20raw_data.get(%5C%22code%5C%22)%20!%3D%20200%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E6%95%B0%E6%8D%AE%E6%8B%89%E5%8F%96%E5%A4%B1%E8%B4%A5%EF%BC%8C%E5%8E%9F%E5%9B%A0%EF%BC%9A%7Braw_data.get(&amp;#39;msg&amp;#39;%2C%20&amp;#39;%E6%9C%AA%E7%9F%A5%E5%BC%82%E5%B8%B8&amp;#39;)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20None%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20raw_data.get(%5C%22item%5C%22%2C%20%7B%7D)%5Cn%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E7%BD%91%E7%BB%9C%E8%AF%B7%E6%B1%82%E5%BC%82%E5%B8%B8%EF%BC%9A%7Bstr(e)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20None%5Cn%5Cn%23%20%E5%9F%BA%E7%A1%80%E8%B0%83%E7%94%A8%E6%B5%8B%E8%AF%95%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20client%20%3D%20JdGoodsClient()%5Cn%20%20%20%20%23%20%E7%A4%BA%E4%BE%8B%EF%BC%9A%E4%BB%85%E8%8E%B7%E5%8F%96%E6%A0%87%E9%A2%98%E3%80%81%E4%BB%B7%E6%A0%BC%E3%80%81%E9%94%80%E9%87%8F%E3%80%81SKU%E7%B2%BE%E7%AE%80%E5%AD%97%E6%AE%B5%5Cn%20%20%20%20simple_data%20%3D%20client.get_single_goods_detail(TARGET_ITEM_ID%2C%20need_fields%3D%5C%22title%2Cprice%2Coriginal_price%2Csales%2Csku_list%5C%22)%5Cn%20%20%20%20if%20simple_data%3A%5Cn%20%20%20%20%20%20%20%20print(%5C%22%3D%3D%3D%3D%3D%E7%B2%BE%E7%AE%80%E5%95%86%E5%93%81%E4%BF%A1%E6%81%AF%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20%20%20%20%20print(json.dumps(simple_data%2C%20ensure_ascii%3DFalse%2C%20indent%3D2))%5Cn%5Cn%20%20%20%20%23%20%E8%8E%B7%E5%8F%96%E5%95%86%E5%93%81%E5%85%A8%E9%87%8F%E8%AF%A6%E6%83%85%5Cn%20%20%20%20full_data%20%3D%20client.get_single_goods_detail(TARGET_ITEM_ID)%5Cn%20%20%20%20if%20full_data%3A%5Cn%20%20%20%20%20%20%20%20print(%5C%22%5C%5Cn%3D%3D%3D%3D%3D%E5%95%86%E5%93%81%E5%85%A8%E9%87%8F%E8%AF%A6%E6%83%85%E6%8F%90%E5%8F%96%E5%85%B3%E9%94%AE%E4%BF%A1%E6%81%AF%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20%20%20%20%20info%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E9%87%87%E9%9B%86%E6%97%B6%E9%97%B4%5C%22%3A%20datetime.now().strftime(%5C%22%25Y-%25m-%25d%20%25H%3A%25M%3A%25S%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E5%95%86%E5%93%81%E6%A0%87%E9%A2%98%5C%22%3A%20full_data.get(%5C%22title%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E5%BD%93%E5%89%8D%E5%94%AE%E4%BB%B7%5C%22%3A%20full_data.get(%5C%22price%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E5%8E%9F%E4%BB%B7%5C%22%3A%20full_data.get(%5C%22original_price%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E6%80%BB%E9%94%80%E9%87%8F%5C%22%3A%20full_data.get(%5C%22sales%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E5%BA%97%E9%93%BA%E5%90%8D%E7%A7%B0%5C%22%3A%20full_data.get(%5C%22seller_info%5C%22%2C%20%7B%7D).get(%5C%22shop_name%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22SKU%E8%A7%84%E6%A0%BC%E6%95%B0%E9%87%8F%5C%22%3A%20len(full_data.get(%5C%22sku_list%5C%22%2C%20%5B%5D))%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20print(json.dumps(info%2C%20ensure_ascii%3DFalse%2C%20indent%3D2))%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;requests
import&amp;nbsp;json
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime

#&amp;nbsp;============&amp;nbsp;基础配置区，自行修改&amp;nbsp;============
KEY&amp;nbsp;=&amp;nbsp;&amp;quot;填写你的专属key&amp;quot;
SECRET&amp;nbsp;=&amp;nbsp;&amp;quot;填写你的专属secret&amp;quot;
#&amp;nbsp;目标京东商品ID，自行替换
TARGET_ITEM_ID&amp;nbsp;=&amp;nbsp;&amp;quot;10335871600&amp;quot;
#&amp;nbsp;可选参数配置：json返回格式，关闭缓存实时最新数据
BASE_PARAMS&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;key&amp;quot;:&amp;nbsp;KEY,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;secret&amp;quot;:&amp;nbsp;SECRET,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;cache&amp;quot;:&amp;nbsp;&amp;quot;no&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;result_type&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;
}

class&amp;nbsp;JdGoodsClient:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.base_url&amp;nbsp;=&amp;nbsp;&amp;quot;https://api-gw.xxx.cn/jd/item_get_pro&amp;quot;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_single_goods_detail(self,&amp;nbsp;item_id,&amp;nbsp;need_fields=None):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;获取单品高阶详情
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;item_id:&amp;nbsp;商品ID
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;need_fields:&amp;nbsp;自定义需要返回的字段，None则返回全量字段
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:return:&amp;nbsp;结构化商品字典&amp;nbsp;/&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;BASE_PARAMS.copy()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;num_iid&amp;quot;]&amp;nbsp;=&amp;nbsp;item_id
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;need_fields&amp;nbsp;is&amp;nbsp;not&amp;nbsp;None:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;fields&amp;quot;]&amp;nbsp;=&amp;nbsp;need_fields
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;Open&amp;nbsp;Claw统一调度发起网络请求，内置3次超时重试
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.get(url=self.base_url,&amp;nbsp;params=params,&amp;nbsp;timeout=12)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp.raise_for_status()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw_data&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;请求状态校验
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;raw_data.get(&amp;quot;code&amp;quot;)&amp;nbsp;!=&amp;nbsp;200:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;数据拉取失败，原因：{raw_data.get(&amp;#39;msg&amp;#39;,&amp;nbsp;&amp;#39;未知异常&amp;#39;)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;raw_data.get(&amp;quot;item&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;网络请求异常：{str(e)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None

#&amp;nbsp;基础调用测试
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client&amp;nbsp;=&amp;nbsp;JdGoodsClient()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;示例：仅获取标题、价格、销量、SKU精简字段
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple_data&amp;nbsp;=&amp;nbsp;client.get_single_goods_detail(TARGET_ITEM_ID,&amp;nbsp;need_fields=&amp;quot;title,price,original_price,sales,sku_list&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;simple_data:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;=====精简商品信息=====&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(json.dumps(simple_data,&amp;nbsp;ensure_ascii=False,&amp;nbsp;indent=2))

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;获取商品全量详情
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;full_data&amp;nbsp;=&amp;nbsp;client.get_single_goods_detail(TARGET_ITEM_ID)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;full_data:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;\n=====商品全量详情提取关键信息=====&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;采集时间&amp;quot;:&amp;nbsp;datetime.now().strftime(&amp;quot;%Y-%m-%d&amp;nbsp;%H:%M:%S&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;商品标题&amp;quot;:&amp;nbsp;full_data.get(&amp;quot;title&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;当前售价&amp;quot;:&amp;nbsp;full_data.get(&amp;quot;price&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;原价&amp;quot;:&amp;nbsp;full_data.get(&amp;quot;original_price&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;总销量&amp;quot;:&amp;nbsp;full_data.get(&amp;quot;sales&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;店铺名称&amp;quot;:&amp;nbsp;full_data.get(&amp;quot;seller_info&amp;quot;,&amp;nbsp;{}).get(&amp;quot;shop_name&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;SKU规格数量&amp;quot;:&amp;nbsp;len(full_data.get(&amp;quot;sku_list&amp;quot;,&amp;nbsp;[]))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(json.dumps(info,&amp;nbsp;ensure_ascii=False,&amp;nbsp;indent=2))&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;代码讲解与踩坑说明&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;核心入参说明&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;num_iid&lt;/code&gt;：必填，商品唯一编号，精准定位采集目标；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;cache&lt;/code&gt;：可选，yes 为读取缓存（速度快、非实时），no 强制实时刷新，监控场景务必设置为 no；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;fields&lt;/code&gt;：可选，按需填写字段，大幅减少数据体积，加快解析速度。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;返回数据核心可用字段&lt;/strong&gt; 基础信息：标题、售价、原价、品牌、类目、主图图集； 商业数据：总销量、评价数量、好评率、优惠活动； 深度明细：多 SKU 价格、库存、商品详情图文、规格参数、配送时效。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;常见报错排查 密钥填写错误、商品 ID 失效、网络波动，框架自带重试，无需额外编写复杂容错逻辑。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;三、第二阶段：核心实战 —— 全天候自动化商品监控系统&lt;/h2&gt;&lt;p&gt;基础拉取稳定后，搭建定时巡检监控脚本，实现&lt;strong&gt;价格下跌预警、库存清零提醒&lt;/strong&gt;，适配竞品盯价、备货预警、活动蹲点场景。&lt;/p&gt;&lt;h3&gt;监控完整代码&lt;/h3&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;2&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20time%5Cnimport%20requests%5Cnimport%20json%5Cnfrom%20datetime%20import%20datetime%5Cn%5CnKEY%20%3D%20%5C%22%E5%A1%AB%E5%86%99%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9Ekey%5C%22%5CnSECRET%20%3D%20%5C%22%E5%A1%AB%E5%86%99%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9Esecret%5C%22%5CnBASE_URL%20%3D%20%5C%22https%3A%2F%2Fapi-gw.xxx.cn%2Fjd%2Fitem_get_pro%5C%22%5CnBASE_PARAMS%20%3D%20%7B%5Cn%20%20%20%20%5C%22key%5C%22%3A%20KEY%2C%5Cn%20%20%20%20%5C%22secret%5C%22%3A%20SECRET%2C%5Cn%20%20%20%20%5C%22cache%5C%22%3A%20%5C%22no%5C%22%2C%5Cn%20%20%20%20%5C%22result_type%5C%22%3A%20%5C%22json%5C%22%5Cn%7D%5Cn%5Cnclass%20JdMonitor%3A%5Cn%20%20%20%20def%20get_goods_data(self%2C%20item_id)%3A%5Cn%20%20%20%20%20%20%20%20params%20%3D%20BASE_PARAMS.copy()%5Cn%20%20%20%20%20%20%20%20params%5B%5C%22num_iid%5C%22%5D%20%3D%20item_id%5Cn%20%20%20%20%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20resp%20%3D%20requests.get(BASE_URL%2C%20params%3Dparams%2C%20timeout%3D10)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20res%20%3D%20resp.json()%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20res.get(%5C%22code%5C%22)%20%3D%3D%20200%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20res.get(%5C%22item%5C%22%2C%20%7B%7D)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20None%5Cn%20%20%20%20%20%20%20%20except%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20None%5Cn%5Cn%20%20%20%20def%20single_monitor(self%2C%20item_id%2C%20warn_price%2C%20check_interval%3D600)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20%E5%8D%95%E5%93%81%E5%BE%AA%E7%8E%AF%E7%9B%91%E6%8E%A7%5Cn%20%20%20%20%20%20%20%20%3Aparam%20item_id%3A%20%E5%95%86%E5%93%81ID%5Cn%20%20%20%20%20%20%20%20%3Aparam%20warn_price%3A%20%E9%A2%84%E8%AD%A6%E4%BB%B7%E6%A0%BC%EF%BC%8C%E7%8E%B0%E4%BB%B7%E4%BD%8E%E4%BA%8E%E8%AF%A5%E5%80%BC%E8%A7%A6%E5%8F%91%E6%8F%90%E9%86%92%5Cn%20%20%20%20%20%20%20%20%3Aparam%20check_interval%3A%20%E5%B7%A1%E6%A3%80%E9%97%B4%E9%9A%94%EF%BC%8C%E5%8D%95%E4%BD%8D%E7%A7%92%EF%BC%8C%E9%BB%98%E8%AE%A410%E5%88%86%E9%92%9F%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E3%80%90%E7%9B%91%E6%8E%A7%E5%90%AF%E5%8A%A8%E3%80%91%E5%95%86%E5%93%81ID%3A%7Bitem_id%7D%EF%BC%8C%E9%99%8D%E4%BB%B7%E9%A2%84%E8%AD%A6%E9%98%88%E5%80%BC%EF%BC%9A%7Bwarn_price%7D%E5%85%83%EF%BC%8C%E5%B7%A1%E6%A3%80%E9%97%B4%E9%9A%94%EF%BC%9A%7Bcheck_interval%7D%E7%A7%92%5C%22)%5Cn%20%20%20%20%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20goods%20%3D%20self.get_goods_data(item_id)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20goods%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%7Bdatetime.now()%7D%20%E6%95%B0%E6%8D%AE%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5%EF%BC%8C%E7%AD%89%E5%BE%85%E4%B8%8B%E4%B8%80%E8%BD%AE%E5%B7%A1%E6%A3%80...%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(check_interval)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20%20%20title%20%3D%20goods.get(%5C%22title%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20now_price%20%3D%20float(goods.get(%5C%22price%5C%22%2C%200))%5Cn%20%20%20%20%20%20%20%20%20%20%20%20stock%20%3D%20goods.get(%5C%22quantity%5C%22%2C%20%5C%22%E6%9C%AA%E7%9F%A5%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20shop%20%3D%20goods.get(%5C%22seller_info%5C%22%2C%20%7B%7D).get(%5C%22shop_name%5C%22)%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%5C%5Cn%5B%7Bdatetime.now()%7D%5D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E5%95%86%E5%93%81%EF%BC%9A%7Btitle%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E5%BA%97%E9%93%BA%EF%BC%9A%7Bshop%7D%20%20%E5%AE%9E%E6%97%B6%E4%BB%B7%E6%A0%BC%EF%BC%9A%7Bnow_price%7D%20%20%E5%BA%93%E5%AD%98%EF%BC%9A%7Bstock%7D%5C%22)%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E4%BB%B7%E6%A0%BC%E9%A2%84%E8%AD%A6%E5%88%A4%E6%96%AD%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20now_price%20%3C%3D%20warn_price%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%5C%22%E2%9A%A0%EF%B8%8F%E2%9A%A0%EF%B8%8F%E2%9A%A0%EF%B8%8F%E3%80%90%E9%99%8D%E4%BB%B7%E9%A2%84%E8%AD%A6%E3%80%91%E5%BD%93%E5%89%8D%E4%BB%B7%E6%A0%BC%E4%BD%8E%E4%BA%8E%E9%A2%84%E8%AE%BE%E9%98%88%E5%80%BC%EF%BC%81%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%BA%93%E5%AD%98%E9%A2%84%E8%AD%A6%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20stock%20%3D%3D%200%20or%20stock%20%3D%3D%20%5C%220%5C%22%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%5C%22%E2%9A%A0%EF%B8%8F%E2%9A%A0%EF%B8%8F%E2%9A%A0%EF%B8%8F%E3%80%90%E5%BA%93%E5%AD%98%E9%A2%84%E8%AD%A6%E3%80%91%E5%95%86%E5%93%81%E5%B7%B2%E7%BC%BA%E8%B4%A7%EF%BC%81%5C%22)%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(check_interval)%5Cn%5Cn%20%20%20%20def%20batch_monitor(self%2C%20monitor_list%2C%20check_interval%3D900)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%E6%89%B9%E9%87%8F%E5%A4%9A%E5%95%86%E5%93%81%E7%9B%91%E6%8E%A7%5Cn%20%20%20%20%20%20%20%20monitor_list%E6%A0%BC%E5%BC%8F%EF%BC%9A%5B%7B%5C%22id%5C%22%3A%5C%22xxx%5C%22%2C%5C%22warn_price%5C%22%3Axxx%7D%2C...%5D%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E3%80%90%E6%89%B9%E9%87%8F%E7%9B%91%E6%8E%A7%E5%90%AF%E5%8A%A8%E3%80%91%E5%85%B1%E7%9B%91%E6%8E%A7%7Blen(monitor_list)%7D%E6%AC%BE%E5%95%86%E5%93%81%EF%BC%8C%E5%B7%A1%E6%A3%80%E9%97%B4%E9%9A%94%7Bcheck_interval%7D%E7%A7%92%5C%22)%5Cn%20%20%20%20%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20for%20item%20in%20monitor_list%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20iid%20%3D%20item%5B%5C%22id%5C%22%5D%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20wp%20%3D%20item%5B%5C%22warn_price%5C%22%5D%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20goods%20%3D%20self.get_goods_data(iid)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20goods%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%7Bdatetime.now()%7D%20%E5%95%86%E5%93%81%7Biid%7D%E9%87%87%E9%9B%86%E5%A4%B1%E8%B4%A5%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20price%20%3D%20float(goods.get(%5C%22price%5C%22%2C0))%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%20%3D%20goods.get(%5C%22title%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20price%20%3C%3D%20wp%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%5B%7Bdatetime.now()%7D%5D%E3%80%90%E6%89%B9%E9%87%8F%E9%A2%84%E8%AD%A6%E3%80%91%7Btitle%7D%20%E4%BB%B7%E6%A0%BC%7Bprice%7D%E4%BD%8E%E4%BA%8E%E9%98%88%E5%80%BC%7Bwp%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(check_interval)%5Cn%5Cn%23%20%E8%BF%90%E8%A1%8C%E7%9B%91%E6%8E%A7%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20monitor%20%3D%20JdMonitor()%5Cn%20%20%20%20%23%201.%E5%8D%95%E5%93%81%E7%9B%91%E6%8E%A7%E7%A4%BA%E4%BE%8B%5Cn%20%20%20%20%23%20monitor.single_monitor(item_id%3D%5C%2210335871600%5C%22%2C%20warn_price%3D199%2C%20check_interval%3D300)%5Cn%5Cn%20%20%20%20%23%202.%E6%89%B9%E9%87%8F%E7%9B%91%E6%8E%A7%E7%A4%BA%E4%BE%8B%EF%BC%8C%E8%87%AA%E8%A1%8C%E6%96%B0%E5%A2%9E%E5%95%86%E5%93%81%5Cn%20%20%20%20batch_list%20%3D%20%5B%5Cn%20%20%20%20%20%20%20%20%7B%5C%22id%5C%22%3A%20%5C%2210335871600%5C%22%2C%20%5C%22warn_price%5C%22%3A%20195%7D%2C%5Cn%20%20%20%20%20%20%20%20%7B%5C%22id%5C%22%3A%20%5C%2210224567891%5C%22%2C%20%5C%22warn_price%5C%22%3A%20269%7D%5Cn%20%20%20%20%5D%5Cn%20%20%20%20monitor.batch_monitor(batch_list%2C%20check_interval%3D600)%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;time
import&amp;nbsp;requests
import&amp;nbsp;json
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime

KEY&amp;nbsp;=&amp;nbsp;&amp;quot;填写你的专属key&amp;quot;
SECRET&amp;nbsp;=&amp;nbsp;&amp;quot;填写你的专属secret&amp;quot;
BASE_URL&amp;nbsp;=&amp;nbsp;&amp;quot;https://api-gw.xxx.cn/jd/item_get_pro&amp;quot;
BASE_PARAMS&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;key&amp;quot;:&amp;nbsp;KEY,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;secret&amp;quot;:&amp;nbsp;SECRET,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;cache&amp;quot;:&amp;nbsp;&amp;quot;no&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;result_type&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;
}

class&amp;nbsp;JdMonitor:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_goods_data(self,&amp;nbsp;item_id):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;BASE_PARAMS.copy()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;num_iid&amp;quot;]&amp;nbsp;=&amp;nbsp;item_id
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.get(BASE_URL,&amp;nbsp;params=params,&amp;nbsp;timeout=10)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;res.get(&amp;quot;code&amp;quot;)&amp;nbsp;==&amp;nbsp;200:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;res.get(&amp;quot;item&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;single_monitor(self,&amp;nbsp;item_id,&amp;nbsp;warn_price,&amp;nbsp;check_interval=600):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;单品循环监控
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;item_id:&amp;nbsp;商品ID
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;warn_price:&amp;nbsp;预警价格，现价低于该值触发提醒
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;check_interval:&amp;nbsp;巡检间隔，单位秒，默认10分钟
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;【监控启动】商品ID:{item_id}，降价预警阈值：{warn_price}元，巡检间隔：{check_interval}秒&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goods&amp;nbsp;=&amp;nbsp;self.get_goods_data(item_id)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;goods:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;{datetime.now()}&amp;nbsp;数据获取失败，等待下一轮巡检...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(check_interval)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title&amp;nbsp;=&amp;nbsp;goods.get(&amp;quot;title&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;now_price&amp;nbsp;=&amp;nbsp;float(goods.get(&amp;quot;price&amp;quot;,&amp;nbsp;0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stock&amp;nbsp;=&amp;nbsp;goods.get(&amp;quot;quantity&amp;quot;,&amp;nbsp;&amp;quot;未知&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shop&amp;nbsp;=&amp;nbsp;goods.get(&amp;quot;seller_info&amp;quot;,&amp;nbsp;{}).get(&amp;quot;shop_name&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;\n[{datetime.now()}]&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;商品：{title}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;店铺：{shop}&amp;nbsp;&amp;nbsp;实时价格：{now_price}&amp;nbsp;&amp;nbsp;库存：{stock}&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;价格预警判断
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;now_price&amp;nbsp;&amp;lt;=&amp;nbsp;warn_price:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;⚠️⚠️⚠️【降价预警】当前价格低于预设阈值！&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;库存预警
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;stock&amp;nbsp;==&amp;nbsp;0&amp;nbsp;or&amp;nbsp;stock&amp;nbsp;==&amp;nbsp;&amp;quot;0&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;⚠️⚠️⚠️【库存预警】商品已缺货！&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(check_interval)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;batch_monitor(self,&amp;nbsp;monitor_list,&amp;nbsp;check_interval=900):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;批量多商品监控
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor_list格式：[{&amp;quot;id&amp;quot;:&amp;quot;xxx&amp;quot;,&amp;quot;warn_price&amp;quot;:xxx},...]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;【批量监控启动】共监控{len(monitor_list)}款商品，巡检间隔{check_interval}秒&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;monitor_list:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;iid&amp;nbsp;=&amp;nbsp;item[&amp;quot;id&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wp&amp;nbsp;=&amp;nbsp;item[&amp;quot;warn_price&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goods&amp;nbsp;=&amp;nbsp;self.get_goods_data(iid)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;goods:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;{datetime.now()}&amp;nbsp;商品{iid}采集失败&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price&amp;nbsp;=&amp;nbsp;float(goods.get(&amp;quot;price&amp;quot;,0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title&amp;nbsp;=&amp;nbsp;goods.get(&amp;quot;title&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;price&amp;nbsp;&amp;lt;=&amp;nbsp;wp:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;[{datetime.now()}]【批量预警】{title}&amp;nbsp;价格{price}低于阈值{wp}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(check_interval)

#&amp;nbsp;运行监控
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor&amp;nbsp;=&amp;nbsp;JdMonitor()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;1.单品监控示例
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;monitor.single_monitor(item_id=&amp;quot;10335871600&amp;quot;,&amp;nbsp;warn_price=199,&amp;nbsp;check_interval=300)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;2.批量监控示例，自行新增商品
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;batch_list&amp;nbsp;=&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;id&amp;quot;:&amp;nbsp;&amp;quot;10335871600&amp;quot;,&amp;nbsp;&amp;quot;warn_price&amp;quot;:&amp;nbsp;195},
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;quot;id&amp;quot;:&amp;nbsp;&amp;quot;10224567891&amp;quot;,&amp;nbsp;&amp;quot;warn_price&amp;quot;:&amp;nbsp;269}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor.batch_monitor(batch_list,&amp;nbsp;check_interval=600)&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;落地使用说明&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;巡检间隔建议设置 300~1800 秒，高频采集无需担心风控；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;可拓展改造：对接企业微信、钉钉机器人，预警消息推送至工作群；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;批量监控适合店铺竞品全链路盯守，单品监控适合爆款蹲活动降价。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;四、第三阶段：进阶落地 —— 批量数据分析 + 数据存档复盘&lt;/h2&gt;&lt;p&gt;单纯监控只能看实时状态，长期运营需要历史数据做销量、价格走势分析。接下来实现&lt;strong&gt;批量采集、数据清洗、指标计算、自动写入 CSV 表格存档&lt;/strong&gt;，后续可以用 Excel、Pandas 做可视化分析。&lt;/p&gt;&lt;h3&gt;数据分析 + 持久化完整代码&lt;/h3&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;3&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20requests%5Cnimport%20json%5Cnimport%20csv%5Cnfrom%20datetime%20import%20datetime%5Cn%5CnKEY%20%3D%20%5C%22%E5%A1%AB%E5%86%99%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9Ekey%5C%22%5CnSECRET%20%3D%20%5C%22%E5%A1%AB%E5%86%99%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9Esecret%5C%22%5CnBASE_URL%20%3D%20%5C%22https%3A%2F%2Fapi-gw.xxx.cn%2Fjd%2Fitem_get_pro%5C%22%5CnBASE_PARAMS%20%3D%20%7B%5Cn%20%20%20%20%5C%22key%5C%22%3A%20KEY%2C%5Cn%20%20%20%20%5C%22secret%5C%22%3A%20SECRET%2C%5Cn%20%20%20%20%5C%22cache%5C%22%3A%20%5C%22no%5C%22%5Cn%7D%5Cn%5Cnclass%20GoodsAnalysis%3A%5Cn%20%20%20%20def%20get_data(self%2C%20item_id)%3A%5Cn%20%20%20%20%20%20%20%20params%20%3D%20BASE_PARAMS.copy()%5Cn%20%20%20%20%20%20%20%20params%5B%5C%22num_iid%5C%22%5D%20%3D%20item_id%5Cn%20%20%20%20%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20res%20%3D%20requests.get(BASE_URL%2C%20params%3Dparams%2C%20timeout%3D10).json()%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20res.get(%5C%22code%5C%22)%20%3D%3D%20200%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20res%5B%5C%22item%5C%22%5D%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20None%5Cn%20%20%20%20%20%20%20%20except%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20None%5Cn%5Cn%20%20%20%20def%20analysis_single(self%2C%20raw_data)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%E6%95%B0%E6%8D%AE%E6%B8%85%E6%B4%97%2B%E6%8C%87%E6%A0%87%E8%AE%A1%E7%AE%97%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20if%20not%20raw_data%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20%7B%7D%5Cn%20%20%20%20%20%20%20%20now_price%20%3D%20float(raw_data.get(%5C%22price%5C%22%2C%200))%5Cn%20%20%20%20%20%20%20%20origin_price%20%3D%20float(raw_data.get(%5C%22original_price%5C%22%2C%20now_price))%5Cn%20%20%20%20%20%20%20%20sales%20%3D%20int(raw_data.get(%5C%22sales%5C%22%2C%200))%5Cn%20%20%20%20%20%20%20%20discount_rate%20%3D%20round(now_price%20%2F%20origin_price%2C%203)%20if%20origin_price%20!%3D%200%20else%201%5Cn%20%20%20%20%20%20%20%20info%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E9%87%87%E9%9B%86%E6%97%B6%E9%97%B4%5C%22%3A%20datetime.now().strftime(%5C%22%25Y-%25m-%25d%20%25H%3A%25M%3A%25S%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E5%95%86%E5%93%81ID%5C%22%3A%20raw_data.get(%5C%22num_iid%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E6%A0%87%E9%A2%98%5C%22%3A%20raw_data.get(%5C%22title%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E5%BA%97%E9%93%BA%5C%22%3A%20raw_data.get(%5C%22seller_info%5C%22%2C%20%7B%7D).get(%5C%22shop_name%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E7%8E%B0%E4%BB%B7%5C%22%3A%20now_price%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E5%8E%9F%E4%BB%B7%5C%22%3A%20origin_price%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E6%8A%98%E6%89%A3%E7%B3%BB%E6%95%B0%5C%22%3A%20discount_rate%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E6%80%BB%E9%94%80%E9%87%8F%5C%22%3A%20sales%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22SKU%E6%95%B0%E9%87%8F%5C%22%3A%20len(raw_data.get(%5C%22sku_list%5C%22%2C%20%5B%5D))%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20return%20info%5Cn%5Cn%20%20%20%20def%20batch_save_csv(self%2C%20id_list%2C%20file_name%3D%5C%22%E5%95%86%E5%93%81%E6%95%B0%E6%8D%AE%E5%AD%98%E6%A1%A3.csv%5C%22)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%E6%89%B9%E9%87%8F%E9%87%87%E9%9B%86%EF%BC%8C%E5%86%99%E5%85%A5CSV%E8%A1%A8%E6%A0%BC%E5%AD%98%E6%A1%A3%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20headers%20%3D%20%5B%5C%22%E9%87%87%E9%9B%86%E6%97%B6%E9%97%B4%5C%22%2C%20%5C%22%E5%95%86%E5%93%81ID%5C%22%2C%20%5C%22%E6%A0%87%E9%A2%98%5C%22%2C%20%5C%22%E5%BA%97%E9%93%BA%5C%22%2C%20%5C%22%E7%8E%B0%E4%BB%B7%5C%22%2C%20%5C%22%E5%8E%9F%E4%BB%B7%5C%22%2C%20%5C%22%E6%8A%98%E6%89%A3%E7%B3%BB%E6%95%B0%5C%22%2C%20%5C%22%E6%80%BB%E9%94%80%E9%87%8F%5C%22%2C%20%5C%22SKU%E6%95%B0%E9%87%8F%5C%22%5D%5Cn%20%20%20%20%20%20%20%20%23%20%E9%A6%96%E6%AC%A1%E5%86%99%E5%85%A5%E5%88%9B%E5%BB%BA%E8%A1%A8%E5%A4%B4%5Cn%20%20%20%20%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20with%20open(file_name%2C%20%5C%22r%5C%22%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%20as%20f%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pass%5Cn%20%20%20%20%20%20%20%20except%20FileNotFoundError%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20with%20open(file_name%2C%20%5C%22w%5C%22%2C%20newline%3D%5C%22%5C%22%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%20as%20f%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20writer%20%3D%20csv.writer(f)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20writer.writerow(headers)%5Cn%5Cn%20%20%20%20%20%20%20%20%23%20%E8%BF%BD%E5%8A%A0%E5%86%99%E5%85%A5%E6%95%B0%E6%8D%AE%5Cn%20%20%20%20%20%20%20%20save_list%20%3D%20%5B%5D%5Cn%20%20%20%20%20%20%20%20for%20iid%20in%20id_list%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20raw%20%3D%20self.get_data(iid)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20ana_data%20%3D%20self.analysis_single(raw)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20ana_data%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20save_list.append(list(ana_data.values()))%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E2%9C%85%20%E5%95%86%E5%93%81%7Biid%7D%E8%A7%A3%E6%9E%90%E5%AE%8C%E6%88%90%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20else%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E2%9D%8C%20%E5%95%86%E5%93%81%7Biid%7D%E6%95%B0%E6%8D%AE%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5%5C%22)%5Cn%5Cn%20%20%20%20%20%20%20%20with%20open(file_name%2C%20%5C%22a%5C%22%2C%20newline%3D%5C%22%5C%22%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%20as%20f%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20writer%20%3D%20csv.writer(f)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20writer.writerows(save_list)%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%5C%5Cn%E6%89%B9%E9%87%8F%E9%87%87%E9%9B%86%E5%AE%8C%E6%88%90%EF%BC%8C%E6%95%B0%E6%8D%AE%E5%B7%B2%E4%BF%9D%E5%AD%98%E8%87%B3%EF%BC%9A%7Bfile_name%7D%5C%22)%5Cn%5Cn%23%20%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E8%B0%83%E7%94%A8%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20ana%20%3D%20GoodsAnalysis()%5Cn%20%20%20%20%23%20%E5%BE%85%E9%87%87%E9%9B%86%E5%95%86%E5%93%81ID%E5%88%97%E8%A1%A8%5Cn%20%20%20%20goods_ids%20%3D%20%5B%5Cn%20%20%20%20%20%20%20%20%5C%2210335871600%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%2210224567891%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%2210112345678%5C%22%5Cn%20%20%20%20%5D%5Cn%20%20%20%20ana.batch_save_csv(goods_ids)%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;requests
import&amp;nbsp;json
import&amp;nbsp;csv
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime

KEY&amp;nbsp;=&amp;nbsp;&amp;quot;填写你的专属key&amp;quot;
SECRET&amp;nbsp;=&amp;nbsp;&amp;quot;填写你的专属secret&amp;quot;
BASE_URL&amp;nbsp;=&amp;nbsp;&amp;quot;https://api-gw.xxx.cn/jd/item_get_pro&amp;quot;
BASE_PARAMS&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;key&amp;quot;:&amp;nbsp;KEY,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;secret&amp;quot;:&amp;nbsp;SECRET,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;cache&amp;quot;:&amp;nbsp;&amp;quot;no&amp;quot;
}

class&amp;nbsp;GoodsAnalysis:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_data(self,&amp;nbsp;item_id):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;BASE_PARAMS.copy()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params[&amp;quot;num_iid&amp;quot;]&amp;nbsp;=&amp;nbsp;item_id
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res&amp;nbsp;=&amp;nbsp;requests.get(BASE_URL,&amp;nbsp;params=params,&amp;nbsp;timeout=10).json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;res.get(&amp;quot;code&amp;quot;)&amp;nbsp;==&amp;nbsp;200:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;res[&amp;quot;item&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;analysis_single(self,&amp;nbsp;raw_data):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;数据清洗+指标计算&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;raw_data:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;now_price&amp;nbsp;=&amp;nbsp;float(raw_data.get(&amp;quot;price&amp;quot;,&amp;nbsp;0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;origin_price&amp;nbsp;=&amp;nbsp;float(raw_data.get(&amp;quot;original_price&amp;quot;,&amp;nbsp;now_price))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sales&amp;nbsp;=&amp;nbsp;int(raw_data.get(&amp;quot;sales&amp;quot;,&amp;nbsp;0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;discount_rate&amp;nbsp;=&amp;nbsp;round(now_price&amp;nbsp;/&amp;nbsp;origin_price,&amp;nbsp;3)&amp;nbsp;if&amp;nbsp;origin_price&amp;nbsp;!=&amp;nbsp;0&amp;nbsp;else&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;采集时间&amp;quot;:&amp;nbsp;datetime.now().strftime(&amp;quot;%Y-%m-%d&amp;nbsp;%H:%M:%S&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;商品ID&amp;quot;:&amp;nbsp;raw_data.get(&amp;quot;num_iid&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;标题&amp;quot;:&amp;nbsp;raw_data.get(&amp;quot;title&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;店铺&amp;quot;:&amp;nbsp;raw_data.get(&amp;quot;seller_info&amp;quot;,&amp;nbsp;{}).get(&amp;quot;shop_name&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;现价&amp;quot;:&amp;nbsp;now_price,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;原价&amp;quot;:&amp;nbsp;origin_price,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;折扣系数&amp;quot;:&amp;nbsp;discount_rate,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;总销量&amp;quot;:&amp;nbsp;sales,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;SKU数量&amp;quot;:&amp;nbsp;len(raw_data.get(&amp;quot;sku_list&amp;quot;,&amp;nbsp;[]))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;info

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;batch_save_csv(self,&amp;nbsp;id_list,&amp;nbsp;file_name=&amp;quot;商品数据存档.csv&amp;quot;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;批量采集，写入CSV表格存档&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;headers&amp;nbsp;=&amp;nbsp;[&amp;quot;采集时间&amp;quot;,&amp;nbsp;&amp;quot;商品ID&amp;quot;,&amp;nbsp;&amp;quot;标题&amp;quot;,&amp;nbsp;&amp;quot;店铺&amp;quot;,&amp;nbsp;&amp;quot;现价&amp;quot;,&amp;nbsp;&amp;quot;原价&amp;quot;,&amp;nbsp;&amp;quot;折扣系数&amp;quot;,&amp;nbsp;&amp;quot;总销量&amp;quot;,&amp;nbsp;&amp;quot;SKU数量&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;首次写入创建表头
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;open(file_name,&amp;nbsp;&amp;quot;r&amp;quot;,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)&amp;nbsp;as&amp;nbsp;f:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pass
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;FileNotFoundError:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;open(file_name,&amp;nbsp;&amp;quot;w&amp;quot;,&amp;nbsp;newline=&amp;quot;&amp;quot;,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)&amp;nbsp;as&amp;nbsp;f:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer&amp;nbsp;=&amp;nbsp;csv.writer(f)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.writerow(headers)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;追加写入数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;save_list&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;iid&amp;nbsp;in&amp;nbsp;id_list:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;self.get_data(iid)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ana_data&amp;nbsp;=&amp;nbsp;self.analysis_single(raw)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;ana_data:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;save_list.append(list(ana_data.values()))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;✅&amp;nbsp;商品{iid}解析完成&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;❌&amp;nbsp;商品{iid}数据获取失败&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;open(file_name,&amp;nbsp;&amp;quot;a&amp;quot;,&amp;nbsp;newline=&amp;quot;&amp;quot;,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)&amp;nbsp;as&amp;nbsp;f:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer&amp;nbsp;=&amp;nbsp;csv.writer(f)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.writerows(save_list)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;\n批量采集完成，数据已保存至：{file_name}&amp;quot;)

#&amp;nbsp;数据分析调用
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ana&amp;nbsp;=&amp;nbsp;GoodsAnalysis()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;待采集商品ID列表
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goods_ids&amp;nbsp;=&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;10335871600&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;10224567891&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;10112345678&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ana.batch_save_csv(goods_ids)&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;数据分析拓展用法&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;折扣系数：数值越小优惠力度越大，筛选低价引流商品；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;多次定时存档后，对比不同日期销量，判断商品增长潜力；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;结合 Pandas 绘制价格走势图、销量柱状图，做成可视化运营看板。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;五、落地优化与拓展方案&lt;/h2&gt;&lt;h3&gt;1. 稳定性优化&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;批量采集加入随机休眠&lt;code&gt;time.sleep(1~3)&lt;/code&gt;，平稳请求频次；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;异常商品单独记录日志，避免单次失败中断整批任务；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;长期监控可使用 Linux 定时任务、Windows 计划任务，实现 7*24 小时离线运行。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;2. 功能拓展方向&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;评价分析：提取返回评价文本，做关键词词云、差评统计；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;选品筛选：新增销量、价格、店铺等级过滤规则，自动筛选蓝海潜力商品；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;可视化：用 Matplotlib、Pyecharts 自动生成价格走势图片；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;多平台兼容：可迁移适配淘宝、拼多多同类商品查询能力，搭建跨平台统一数据系统。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;六、总结&lt;/h2&gt;&lt;p&gt;依托 Open Claw 的调度能力 + 高阶商品详情查询，我们用三段轻量化 Python 代码，快速搭建了&lt;strong&gt;数据采集 - 实时监控 - 结构化分析 - 长期存档&lt;/strong&gt;完整电商数据工具。对比传统爬虫，这套方案无需持续适配页面改版，开箱即用；对比付费商业监控工具，可高度自定义规则、无功能阉割、长期使用成本极低。&lt;/p&gt;&lt;p&gt;对于技术新手，直接复制代码修改密钥与商品 ID 即可快速落地；对于开发人员，可以在此基础上拓展数据库存储、前端可视化、多机器人告警等企业级功能。不管是个人卖家选品调研，还是团队竞品长效监控，这套落地思路都具备很强实用性。&lt;/p&gt;&lt;p&gt;&lt;span data-cke-copybin-end=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sun, 02 Aug 2026 11:00:30 +0800</pubDate></item><item><title>Open Claw 实战教程：5 分钟搭建京东商品自动化监控与数据分析系统</title><link>https://shopapi.com.cn/?id=207</link><description>&lt;p&gt;&lt;span data-cke-copybin-start=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;前言&lt;/h2&gt;&lt;p&gt;做电商运营、竞品调研、货源选品、铺货运维的朋友，几乎都会遇到同一个痛点：手动盯商品价格、库存、促销活动、规格变动效率极低；批量整理竞品数据、做价格走势复盘、销量口碑分析时，复制粘贴整理数据耗时耗力，人工统计还容易出错。&lt;/p&gt;&lt;p&gt;很多开发者尝试爬虫抓取页面数据，却频繁遭遇反爬封禁、页面改版失效、数据残缺等问题，调试与维护成本居高不下。最近一直在使用 Open Claw 工具完成电商数据自动化采集，依托其内置的高级商品详情采集能力，无需复杂逆向、不用频繁维护爬虫规则，就能稳定拿到京东商品全维度结构化数据，快速落地&lt;strong&gt;实时监控 + 长效数据分析&lt;/strong&gt;两套常用业务，本文结合落地代码，完整分享从工具接入、实时监控脚本、数据分析整理全流程实操。&lt;/p&gt;&lt;h2&gt;一、工具核心能力介绍&lt;/h2&gt;&lt;p&gt;本次用到的高级详情采集能力，相比普通基础采集，最大优势是&lt;strong&gt;数据覆盖面更广、实时性更强、结构化程度更高&lt;/strong&gt;：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;基础信息全覆盖&lt;/strong&gt;：商品标题、品牌、类目、主图、轮播图、长详情图文、商品参数、发货配送、店铺资质、自营 / 第三方店铺类型一键提取；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;动态变动数据&lt;/strong&gt;：实时售价、原价、优惠券、满减活动、多规格 SKU 单价与库存、近 30 天销量、库存余量；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;口碑评价维度&lt;/strong&gt;：好评率、总评论数、追评数量、差评标签，可用于竞品口碑打分；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;灵活配置&lt;/strong&gt;：支持关闭缓存获取毫秒级实时数据，可自由切换 JSON、格式化文本等数据格式，适配数据库存储、表格导出、可视化图表等场景。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;调用逻辑十分简单，仅需要 2 个身份凭证 + 目标商品 ID，即可发起数据拉取，GET/POST 两种请求方式全部兼容，Python、Java、JS 等主流编程语言都能快速接入。&lt;/p&gt;&lt;h3&gt;核心入参说明&lt;/h3&gt;&lt;p&gt;表格&lt;/p&gt;&lt;table&gt;
	&lt;thead&gt;
		&lt;tr class=&quot;firstRow&quot;&gt;
			&lt;th&gt;参数&lt;/th&gt;
			&lt;th&gt;是否必填&lt;/th&gt;
			&lt;th&gt;作用说明&lt;/th&gt;
		&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;span aria-label=&quot;a 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_inline cke_widget_csdnlink cke_widget_wrapper_link-info cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;a&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;4&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;link-info cke_widget_editable cke_widget_element&quot; contenteditable=&quot;true&quot; data-cke-enter-mode=&quot;2&quot; data-cke-widget-data=&quot;%7B%22url%22%3A%22https%3A%2F%2Fo0b.cn%2Ficris%22%2C%22text%22%3A%22%E8%BA%AB%E4%BB%BD%E5%87%AD%E8%AF%81%201%22%2C%22desc%22%3A%22%22%2C%22icon%22%3A%22%22%2C%22isCard%22%3Afalse%2C%22hasResquest%22%3Atrue%2C%22iconDefault%22%3A%22https%3A%2F%2Fcsdnimg.cn%2Frelease%2Fblog_editor_html%2Frelease2.4.6%2Fckeditor%2Fplugins%2FCsdnLink%2Ficons%2Ficon-default.png%3Ft%3DQ239%22%2C%22id%22%3A%22MJRAc6-1785634937531%22%2C%22classes%22%3A%7B%22link-info%22%3A1%7D%7D&quot; data-cke-widget-editable=&quot;text&quot; data-cke-widget-keep-attr=&quot;0&quot; data-link-icon=&quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=Q239&quot; data-link-title=&quot;身份凭证 1&quot; data-widget=&quot;csdnlink&quot; href=&quot;https://o0b.cn/icris&quot; title=&quot;身份凭证 1&quot;&gt;身份凭证 1&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
			&lt;td&gt;是&lt;/td&gt;
			&lt;td&gt;个人专属调用密钥，平台后台注册后直接获取&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;身份凭证 2&lt;/td&gt;
			&lt;td&gt;是&lt;/td&gt;
			&lt;td&gt;安全校验密钥，和凭证 1 搭配使用，保障调用安全&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;商品 ID&lt;/td&gt;
			&lt;td&gt;是&lt;/td&gt;
			&lt;td&gt;京东商品详情页末尾数字编号，定位目标商品&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;cache&lt;/td&gt;
			&lt;td&gt;可选&lt;/td&gt;
			&lt;td&gt;yes 默认缓存加速；no 关闭缓存，用于价格、库存实时监控&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;result_type&lt;/td&gt;
			&lt;td&gt;可选&lt;/td&gt;
			&lt;td&gt;默认 JSON，日常数据分析可选择格式化阅读文本&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;&lt;/table&gt;&lt;h3&gt;返回核心可用字段（监控 &amp;amp; 分析高频使用）&lt;/h3&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;基础：title 标题、shop_name 店铺名、pic_url 主图、goods_attr 商品参数&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;价格促销：price 现价、org_price 原价、coupon 优惠券列表&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;规格库存：sku 多规格集合、sku_price 单品价格、sku_stock 单品库存&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;销量口碑：sales 累计销量、goodRateShow 好评率、commentCount 总评论量&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;二、环境准备&lt;/h2&gt;&lt;p&gt;本次全程使用 Python 实现，代码轻量化、无复杂依赖，只需要安装网络请求库：&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;0&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22pip%20install%20requests%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;pip&amp;nbsp;install&amp;nbsp;requests&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;运行环境：Python3.7 及以上，Windows、Mac、Linux 服务器均可部署，服务器部署可实现 7×24 小时不间断监控。&lt;/p&gt;&lt;h2&gt;三、基础调用：单商品结构化数据获取&lt;/h2&gt;&lt;p&gt;先写基础封装函数，完成单次商品数据拉取、异常重试、数据解析，为后续监控、数据分析打下基础。&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;1&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20requests%5Cnimport%20time%5Cnimport%20json%5Cn%5Cnclass%20JDGoodsCollector%3A%5Cn%20%20%20%20def%20__init__(self%2C%20key%2C%20secret)%3A%5Cn%20%20%20%20%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E8%BA%AB%E4%BB%BD%E5%87%AD%E8%AF%81%EF%BC%8C%E6%9B%BF%E6%8D%A2%E4%B8%BA%E8%87%AA%E5%B7%B1%E5%90%8E%E5%8F%B0%E8%8E%B7%E5%8F%96%E7%9A%84%E5%87%AD%E8%AF%81%5Cn%20%20%20%20%20%20%20%20self.key%20%3D%20key%5Cn%20%20%20%20%20%20%20%20self.secret%20%3D%20secret%5Cn%20%20%20%20%20%20%20%20self.base_url%20%3D%20%5C%22https%3A%2F%2Fapi-gw.onebound.cn%2Fjd%2Fitem_get_pro%5C%22%5Cn%20%20%20%20%20%20%20%20self.session%20%3D%20requests.Session()%20%20%23%20%E9%95%BF%E8%BF%9E%E6%8E%A5%E4%BC%98%E5%8C%96%E8%AF%B7%E6%B1%82%E9%80%9F%E5%BA%A6%5Cn%5Cn%20%20%20%20def%20get_goods_detail(self%2C%20item_id%2C%20real_time%3DFalse)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20%E6%8B%89%E5%8F%96%E5%95%86%E5%93%81%E8%AF%A6%E6%83%85%5Cn%20%20%20%20%20%20%20%20%3Aparam%20item_id%3A%20%E4%BA%AC%E4%B8%9C%E5%95%86%E5%93%81ID%5Cn%20%20%20%20%20%20%20%20%3Aparam%20real_time%3A%20%E6%98%AF%E5%90%A6%E5%AE%9E%E6%97%B6%E6%95%B0%E6%8D%AE%EF%BC%8CTrue%E5%85%B3%E9%97%AD%E7%BC%93%E5%AD%98%EF%BC%8C%E7%94%A8%E4%BA%8E%E7%9B%91%E6%8E%A7%E4%BB%B7%E6%A0%BC%E5%BA%93%E5%AD%98%E5%8F%98%E5%8A%A8%5Cn%20%20%20%20%20%20%20%20%3Areturn%3A%20%E7%BB%93%E6%9E%84%E5%8C%96%E5%95%86%E5%93%81%E5%AD%97%E5%85%B8%2FNone%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20params%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22key%5C%22%3A%20self.key%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22secret%5C%22%3A%20self.secret%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22api_name%5C%22%3A%20%5C%22jd.item_get_pro%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22num_iid%5C%22%3A%20item_id%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22cache%5C%22%3A%20%5C%22no%5C%22%20if%20real_time%20else%20%5C%22yes%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22result_type%5C%22%3A%20%5C%22json%5C%22%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20retry_times%20%3D%203%20%20%23%203%E6%AC%A1%E5%A4%B1%E8%B4%A5%E9%87%8D%E8%AF%95%5Cn%20%20%20%20%20%20%20%20for%20i%20in%20range(retry_times)%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20resp%20%3D%20self.session.get(self.base_url%2C%20params%3Dparams%2C%20timeout%3D12)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20resp.raise_for_status()%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20data%20%3D%20resp.json()%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20data.get(%5C%22code%5C%22)%20%3D%3D%20200%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20data.get(%5C%22item%5C%22%2C%20%7B%7D)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E8%AF%B7%E6%B1%82%E5%BC%82%E5%B8%B8%EF%BC%9A%7Bdata.get(&amp;#39;msg&amp;#39;%2C%20&amp;#39;%E6%9C%AA%E7%9F%A5%E9%94%99%E8%AF%AF&amp;#39;)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E7%AC%AC%7Bi%2B1%7D%E6%AC%A1%E8%AF%B7%E6%B1%82%E5%A4%B1%E8%B4%A5%EF%BC%9A%7Bstr(e)%7D%EF%BC%8C1%E7%A7%92%E5%90%8E%E9%87%8D%E8%AF%95%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(1)%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E5%A4%9A%E6%AC%A1%E8%AF%B7%E6%B1%82%E5%A4%B1%E8%B4%A5%EF%BC%8C%E6%94%BE%E5%BC%83%E6%9C%AC%E6%AC%A1%E9%87%87%E9%9B%86%5C%22)%5Cn%20%20%20%20%20%20%20%20return%20None%5Cn%5Cn%23%20%E6%B5%8B%E8%AF%95%E5%9F%BA%E7%A1%80%E8%B0%83%E7%94%A8%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20%23%20%E6%9B%BF%E6%8D%A2%E4%B8%BA%E4%BD%A0%E7%9A%84%E4%B8%AA%E4%BA%BA%E5%87%AD%E8%AF%81%5Cn%20%20%20%20KEY%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9Ekey%5C%22%5Cn%20%20%20%20SECRET%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9Esecret%5C%22%5Cn%20%20%20%20collector%20%3D%20JDGoodsCollector(KEY%2C%20SECRET)%5Cn%20%20%20%20target_item%20%3D%20%5C%22100012345678%5C%22%20%20%23%20%E6%9B%BF%E6%8D%A2%E7%9B%AE%E6%A0%87%E4%BA%AC%E4%B8%9C%E5%95%86%E5%93%81ID%5Cn%20%20%20%20goods_info%20%3D%20collector.get_goods_detail(target_item%2C%20real_time%3DFalse)%5Cn%20%20%20%20if%20goods_info%3A%5Cn%20%20%20%20%20%20%20%20print(%5C%22%3D%3D%3D%3D%E5%95%86%E5%93%81%E5%9F%BA%E7%A1%80%E4%BF%A1%E6%81%AF%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E5%95%86%E5%93%81%E6%A0%87%E9%A2%98%EF%BC%9A%7Bgoods_info.get(&amp;#39;title&amp;#39;)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E5%BD%93%E5%89%8D%E5%94%AE%E4%BB%B7%EF%BC%9A%7Bgoods_info.get(&amp;#39;price&amp;#39;)%7D%20%E5%85%83%5C%22)%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E5%8E%9F%E4%BB%B7%EF%BC%9A%7Bgoods_info.get(&amp;#39;org_price&amp;#39;)%7D%20%E5%85%83%5C%22)%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E5%BA%97%E9%93%BA%E5%90%8D%E7%A7%B0%EF%BC%9A%7Bgoods_info.get(&amp;#39;shop_name&amp;#39;)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E7%B4%AF%E8%AE%A1%E9%94%80%E9%87%8F%EF%BC%9A%7Bgoods_info.get(&amp;#39;sales&amp;#39;)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E5%A5%BD%E8%AF%84%E7%8E%87%EF%BC%9A%7Bgoods_info.get(&amp;#39;goodRateShow&amp;#39;)%7D%5C%22)%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;requests
import&amp;nbsp;time
import&amp;nbsp;json

class&amp;nbsp;JDGoodsCollector:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;key,&amp;nbsp;secret):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;初始化身份凭证，替换为自己后台获取的凭证
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.key&amp;nbsp;=&amp;nbsp;key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.secret&amp;nbsp;=&amp;nbsp;secret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.base_url&amp;nbsp;=&amp;nbsp;&amp;quot;https://api-gw.onebound.cn/jd/item_get_pro&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.session&amp;nbsp;=&amp;nbsp;requests.Session()&amp;nbsp;&amp;nbsp;#&amp;nbsp;长连接优化请求速度

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_goods_detail(self,&amp;nbsp;item_id,&amp;nbsp;real_time=False):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;拉取商品详情
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;item_id:&amp;nbsp;京东商品ID
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;real_time:&amp;nbsp;是否实时数据，True关闭缓存，用于监控价格库存变动
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:return:&amp;nbsp;结构化商品字典/None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;key&amp;quot;:&amp;nbsp;self.key,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;secret&amp;quot;:&amp;nbsp;self.secret,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;api_name&amp;quot;:&amp;nbsp;&amp;quot;jd.item_get_pro&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;num_iid&amp;quot;:&amp;nbsp;item_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;cache&amp;quot;:&amp;nbsp;&amp;quot;no&amp;quot;&amp;nbsp;if&amp;nbsp;real_time&amp;nbsp;else&amp;nbsp;&amp;quot;yes&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;result_type&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;retry_times&amp;nbsp;=&amp;nbsp;3&amp;nbsp;&amp;nbsp;#&amp;nbsp;3次失败重试
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;range(retry_times):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;self.session.get(self.base_url,&amp;nbsp;params=params,&amp;nbsp;timeout=12)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp.raise_for_status()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;data.get(&amp;quot;code&amp;quot;)&amp;nbsp;==&amp;nbsp;200:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;data.get(&amp;quot;item&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;请求异常：{data.get(&amp;#39;msg&amp;#39;,&amp;nbsp;&amp;#39;未知错误&amp;#39;)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;第{i+1}次请求失败：{str(e)}，1秒后重试&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;多次请求失败，放弃本次采集&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None

#&amp;nbsp;测试基础调用
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;替换为你的个人凭证
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;KEY&amp;nbsp;=&amp;nbsp;&amp;quot;你的专属key&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SECRET&amp;nbsp;=&amp;nbsp;&amp;quot;你的专属secret&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;collector&amp;nbsp;=&amp;nbsp;JDGoodsCollector(KEY,&amp;nbsp;SECRET)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;target_item&amp;nbsp;=&amp;nbsp;&amp;quot;100012345678&amp;quot;&amp;nbsp;&amp;nbsp;#&amp;nbsp;替换目标京东商品ID
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goods_info&amp;nbsp;=&amp;nbsp;collector.get_goods_detail(target_item,&amp;nbsp;real_time=False)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;goods_info:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;====商品基础信息====&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;商品标题：{goods_info.get(&amp;#39;title&amp;#39;)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;当前售价：{goods_info.get(&amp;#39;price&amp;#39;)}&amp;nbsp;元&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;原价：{goods_info.get(&amp;#39;org_price&amp;#39;)}&amp;nbsp;元&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;店铺名称：{goods_info.get(&amp;#39;shop_name&amp;#39;)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;累计销量：{goods_info.get(&amp;#39;sales&amp;#39;)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;好评率：{goods_info.get(&amp;#39;goodRateShow&amp;#39;)}&amp;quot;)&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;运行后即可一键打印商品核心信息，代码做了超时、网络异常重试，稳定性远高于爬虫脚本。&lt;/p&gt;&lt;h2&gt;四、实战 1：搭建商品实时价格 &amp;amp; 库存监控脚本&lt;/h2&gt;&lt;h3&gt;需求场景&lt;/h3&gt;&lt;p&gt;竞品降价预警、自有商品库存告警、大促期间价格变动捕捉，一旦价格下调、库存大幅减少，立刻打印提醒，可拓展对接微信、钉钉推送消息。 实现思路：循环定时采集实时数据，对比上一轮采集数据，出现变动触发告警。&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;2&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20requests%5Cnimport%20time%5Cnimport%20json%5Cn%5Cnclass%20JDMonitor%3A%5Cn%20%20%20%20def%20__init__(self%2C%20key%2C%20secret)%3A%5Cn%20%20%20%20%20%20%20%20self.collector%20%3D%20JDGoodsCollector(key%2C%20secret)%5Cn%20%20%20%20%20%20%20%20%23%20%E5%8E%86%E5%8F%B2%E6%95%B0%E6%8D%AE%E7%BC%93%E5%AD%98%EF%BC%8C%E5%AD%98%E5%82%A8%E4%B8%8A%E4%B8%80%E8%BD%AE%E9%87%87%E9%9B%86%E7%BB%93%E6%9E%9C%5Cn%20%20%20%20%20%20%20%20self.history_data%20%3D%20%7B%7D%5Cn%5Cn%20%20%20%20def%20monitor_single_goods(self%2C%20item_id%2C%20interval%3D300)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20%E5%8D%95%E5%95%86%E5%93%81%E5%BE%AA%E7%8E%AF%E7%9B%91%E6%8E%A7%5Cn%20%20%20%20%20%20%20%20%3Aparam%20item_id%3A%20%E5%95%86%E5%93%81ID%5Cn%20%20%20%20%20%20%20%20%3Aparam%20interval%3A%20%E9%87%87%E9%9B%86%E9%97%B4%E9%9A%94%EF%BC%8C%E5%8D%95%E4%BD%8D%E7%A7%92%EF%BC%8C%E9%BB%98%E8%AE%A45%E5%88%86%E9%92%9F%E9%87%87%E9%9B%86%E4%B8%80%E6%AC%A1%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%3D%3D%3D%3D%E5%BC%80%E5%A7%8B%E7%9B%91%E6%8E%A7%E5%95%86%E5%93%81%7Bitem_id%7D%EF%BC%8C%E9%87%87%E9%9B%86%E9%97%B4%E9%9A%94%7Binterval%7D%E7%A7%92%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20now_data%20%3D%20self.collector.get_goods_detail(item_id%2C%20real_time%3DTrue)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20now_data%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(interval)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E9%A6%96%E6%AC%A1%E9%87%87%E9%9B%86%EF%BC%8C%E4%BB%85%E7%BC%93%E5%AD%98%E6%95%B0%E6%8D%AE%E4%B8%8D%E5%AF%B9%E6%AF%94%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20item_id%20not%20in%20self.history_data%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.history_data%5Bitem_id%5D%20%3D%20now_data%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E5%88%9D%E5%A7%8B%E5%8C%96%E7%BC%93%E5%AD%98%E5%AE%8C%E6%88%90%EF%BC%8C%E5%BD%93%E5%89%8D%E4%BB%B7%E6%A0%BC%EF%BC%9A%7Bnow_data.get(&amp;#39;price&amp;#39;)%7D%E5%85%83%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(interval)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20%20%20old_data%20%3D%20self.history_data%5Bitem_id%5D%5Cn%20%20%20%20%20%20%20%20%20%20%20%20alert_list%20%3D%20%5B%5D%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E4%BB%B7%E6%A0%BC%E5%8F%98%E5%8A%A8%E6%A3%80%E6%B5%8B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20old_price%20%3D%20float(old_data.get(%5C%22price%5C%22%2C%200))%5Cn%20%20%20%20%20%20%20%20%20%20%20%20new_price%20%3D%20float(now_data.get(%5C%22price%5C%22%2C%200))%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20new_price%20%3C%20old_price%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert_list.append(f%5C%22%E3%80%90%E9%99%8D%E4%BB%B7%E6%8F%90%E9%86%92%E3%80%91%E5%8E%9F%E4%BB%B7%7Bold_price%7D%20%E2%86%92%20%E7%8E%B0%E4%BB%B7%7Bnew_price%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20elif%20new_price%20%3E%20old_price%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert_list.append(f%5C%22%E3%80%90%E6%B6%A8%E4%BB%B7%E6%8F%90%E9%86%92%E3%80%91%E5%8E%9F%E4%BB%B7%7Bold_price%7D%20%E2%86%92%20%E7%8E%B0%E4%BB%B7%7Bnew_price%7D%5C%22)%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%BA%93%E5%AD%98%E5%8F%98%E5%8A%A8%E6%A3%80%E6%B5%8B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20old_stock%20%3D%20old_data.get(%5C%22sku%5C%22%2C%20%5B%5D)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20new_stock%20%3D%20now_data.get(%5C%22sku%5C%22%2C%20%5B%5D)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20len(new_stock)%20%3E%200%20and%20str(new_stock%5B0%5D.get(%5C%22skuStock%5C%22))%20!%3D%20str(old_stock%5B0%5D.get(%5C%22skuStock%5C%22))%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert_list.append(f%5C%22%E3%80%90%E5%BA%93%E5%AD%98%E5%8F%98%E5%8A%A8%E3%80%91%E5%BD%93%E5%89%8D%E5%BA%93%E5%AD%98%EF%BC%9A%7Bnew_stock%5B0%5D.get(&amp;#39;skuStock&amp;#39;)%7D%5C%22)%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%BE%93%E5%87%BA%E5%91%8A%E8%AD%A6%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20alert_list%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%5C%22%5C%5Cn%3D%3D%3D%3D%3D%E8%A7%A6%E5%8F%91%E5%91%8A%E8%AD%A6%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E5%95%86%E5%93%81%EF%BC%9A%7Bnow_data.get(&amp;#39;title&amp;#39;)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20alert%20in%20alert_list%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(alert)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%5C%22%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5C%5Cn%5C%22)%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%9B%B4%E6%96%B0%E5%8E%86%E5%8F%B2%E7%BC%93%E5%AD%98%5Cn%20%20%20%20%20%20%20%20%20%20%20%20self.history_data%5Bitem_id%5D%20%3D%20now_data%5Cn%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(interval)%5Cn%5Cn%23%20%E7%9B%91%E6%8E%A7%E8%BF%90%E8%A1%8C%E5%85%A5%E5%8F%A3%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20KEY%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9Ekey%5C%22%5Cn%20%20%20%20SECRET%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9Esecret%5C%22%5Cn%20%20%20%20monitor%20%3D%20JDMonitor(KEY%2C%20SECRET)%5Cn%20%20%20%20%23%20%E7%9B%91%E6%8E%A7%E7%9B%AE%E6%A0%87%E5%95%86%E5%93%81%EF%BC%8C%E9%97%B4%E9%9A%94300%E7%A7%92%EF%BC%885%E5%88%86%E9%92%9F%EF%BC%89%E9%87%87%E9%9B%86%E4%B8%80%E6%AC%A1%5Cn%20%20%20%20monitor.monitor_single_goods(%5C%22100012345678%5C%22%2C%20interval%3D300)%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;requests
import&amp;nbsp;time
import&amp;nbsp;json

class&amp;nbsp;JDMonitor:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;key,&amp;nbsp;secret):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.collector&amp;nbsp;=&amp;nbsp;JDGoodsCollector(key,&amp;nbsp;secret)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;历史数据缓存，存储上一轮采集结果
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.history_data&amp;nbsp;=&amp;nbsp;{}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;monitor_single_goods(self,&amp;nbsp;item_id,&amp;nbsp;interval=300):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;单商品循环监控
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;item_id:&amp;nbsp;商品ID
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;interval:&amp;nbsp;采集间隔，单位秒，默认5分钟采集一次
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;====开始监控商品{item_id}，采集间隔{interval}秒====&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;now_data&amp;nbsp;=&amp;nbsp;self.collector.get_goods_detail(item_id,&amp;nbsp;real_time=True)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;now_data:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(interval)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;首次采集，仅缓存数据不对比
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;item_id&amp;nbsp;not&amp;nbsp;in&amp;nbsp;self.history_data:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.history_data[item_id]&amp;nbsp;=&amp;nbsp;now_data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;初始化缓存完成，当前价格：{now_data.get(&amp;#39;price&amp;#39;)}元&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(interval)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;old_data&amp;nbsp;=&amp;nbsp;self.history_data[item_id]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert_list&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;价格变动检测
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;old_price&amp;nbsp;=&amp;nbsp;float(old_data.get(&amp;quot;price&amp;quot;,&amp;nbsp;0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_price&amp;nbsp;=&amp;nbsp;float(now_data.get(&amp;quot;price&amp;quot;,&amp;nbsp;0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;new_price&amp;nbsp;&amp;lt;&amp;nbsp;old_price:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert_list.append(f&amp;quot;【降价提醒】原价{old_price}&amp;nbsp;→&amp;nbsp;现价{new_price}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;new_price&amp;nbsp;&amp;gt;&amp;nbsp;old_price:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert_list.append(f&amp;quot;【涨价提醒】原价{old_price}&amp;nbsp;→&amp;nbsp;现价{new_price}&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;库存变动检测
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;old_stock&amp;nbsp;=&amp;nbsp;old_data.get(&amp;quot;sku&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_stock&amp;nbsp;=&amp;nbsp;now_data.get(&amp;quot;sku&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(new_stock)&amp;nbsp;&amp;gt;&amp;nbsp;0&amp;nbsp;and&amp;nbsp;str(new_stock[0].get(&amp;quot;skuStock&amp;quot;))&amp;nbsp;!=&amp;nbsp;str(old_stock[0].get(&amp;quot;skuStock&amp;quot;)):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert_list.append(f&amp;quot;【库存变动】当前库存：{new_stock[0].get(&amp;#39;skuStock&amp;#39;)}&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;输出告警
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;alert_list:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;\n=====触发告警=====&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;商品：{now_data.get(&amp;#39;title&amp;#39;)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;alert&amp;nbsp;in&amp;nbsp;alert_list:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(alert)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;==================\n&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;更新历史缓存
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.history_data[item_id]&amp;nbsp;=&amp;nbsp;now_data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(interval)

#&amp;nbsp;监控运行入口
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;KEY&amp;nbsp;=&amp;nbsp;&amp;quot;你的专属key&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SECRET&amp;nbsp;=&amp;nbsp;&amp;quot;你的专属secret&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor&amp;nbsp;=&amp;nbsp;JDMonitor(KEY,&amp;nbsp;SECRET)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;监控目标商品，间隔300秒（5分钟）采集一次
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor.monitor_single_goods(&amp;quot;100012345678&amp;quot;,&amp;nbsp;interval=300)&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;拓展优化方向&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;多商品批量监控：将商品 ID 存入列表，循环遍历采集；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;消息推送：对接钉钉机器人、企业微信接口，变动推送至工作群；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;阈值告警：设定降价幅度阈值，仅降价超过 5% 才提醒，过滤小幅波动。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;五、实战 2：批量采集 + 长效数据分析整理脚本&lt;/h2&gt;&lt;p&gt;日常竞品分析、选品调研，需要批量抓取多款商品数据，整理为表格结构化数据，用于价格对比、口碑排序、热度筛选，下面代码实现批量采集 + 数据整理，可直接导出 CSV 表格。&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;3&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20requests%5Cnimport%20time%5Cnimport%20csv%5Cn%5Cnclass%20JDAnalysisTool%3A%5Cn%20%20%20%20def%20__init__(self%2C%20key%2C%20secret)%3A%5Cn%20%20%20%20%20%20%20%20self.collector%20%3D%20JDGoodsCollector(key%2C%20secret)%5Cn%5Cn%20%20%20%20def%20batch_collect(self%2C%20id_list)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%E6%89%B9%E9%87%8F%E9%87%87%E9%9B%86%E5%A4%9A%E6%AC%BE%E5%95%86%E5%93%81%E6%95%B0%E6%8D%AE%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20result_list%20%3D%20%5B%5D%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E5%BC%80%E5%A7%8B%E6%89%B9%E9%87%8F%E9%87%87%E9%9B%86%7Blen(id_list)%7D%E4%B8%AA%E5%95%86%E5%93%81%E6%95%B0%E6%8D%AE%5C%22)%5Cn%20%20%20%20%20%20%20%20for%20idx%2C%20item_id%20in%20enumerate(id_list)%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E6%AD%A3%E5%9C%A8%E9%87%87%E9%9B%86%E7%AC%AC%7Bidx%2B1%7D%2F%7Blen(id_list)%7D%EF%BC%9A%7Bitem_id%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20info%20%3D%20self.collector.get_goods_detail(item_id%2C%20real_time%3DFalse)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20info%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20item_dict%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E5%95%86%E5%93%81ID%5C%22%3A%20item_id%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E5%95%86%E5%93%81%E6%A0%87%E9%A2%98%5C%22%3A%20info.get(%5C%22title%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E7%8E%B0%E4%BB%B7%5C%22%3A%20info.get(%5C%22price%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E5%8E%9F%E4%BB%B7%5C%22%3A%20info.get(%5C%22org_price%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E5%BA%97%E9%93%BA%5C%22%3A%20info.get(%5C%22shop_name%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E9%94%80%E9%87%8F%5C%22%3A%20info.get(%5C%22sales%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E5%A5%BD%E8%AF%84%E7%8E%87%5C%22%3A%20info.get(%5C%22goodRateShow%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E6%80%BB%E8%AF%84%E8%AE%BA%5C%22%3A%20info.get(%5C%22commentCount%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result_list.append(item_dict)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(1)%20%20%23%20%E9%98%B2%E9%A2%91%E7%B9%81%E8%AF%B7%E6%B1%82%E9%99%90%E6%B5%81%5Cn%20%20%20%20%20%20%20%20return%20result_list%5Cn%5Cn%20%20%20%20def%20export_csv(self%2C%20data_list%2C%20save_name%3D%5C%22jd_goods_analysis.csv%5C%22)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%E5%AF%BC%E5%87%BAcsv%E8%A1%A8%E6%A0%BC%EF%BC%8CExcel%E5%8F%AF%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20if%20not%20data_list%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(%5C%22%E6%97%A0%E6%95%B0%E6%8D%AE%E5%8F%AF%E5%AF%BC%E5%87%BA%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%5Cn%20%20%20%20%20%20%20%20headers%20%3D%20list(data_list%5B0%5D.keys())%5Cn%20%20%20%20%20%20%20%20with%20open(save_name%2C%20%5C%22w%5C%22%2C%20encoding%3D%5C%22utf-8-sig%5C%22%2C%20newline%3D%5C%22%5C%22)%20as%20f%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20writer%20%3D%20csv.DictWriter(f%2C%20fieldnames%3Dheaders)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20writer.writeheader()%5Cn%20%20%20%20%20%20%20%20%20%20%20%20writer.writerows(data_list)%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E6%95%B0%E6%8D%AE%E5%B7%B2%E5%AF%BC%E5%87%BA%E8%87%B3%EF%BC%9A%7Bsave_name%7D%5C%22)%5Cn%5Cn%20%20%20%20def%20sort_hot(self%2C%20data_list)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%EF%BC%9A%E6%8C%89%E9%94%80%E9%87%8F%E9%99%8D%E5%BA%8F%E6%8E%92%E5%BA%8F%EF%BC%8C%E7%AD%9B%E9%80%89%E7%83%AD%E9%97%A8%E5%95%86%E5%93%81%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20return%20sorted(data_list%2C%20key%3Dlambda%20x%3A%20int(x.get(%5C%22%E9%94%80%E9%87%8F%5C%22%2C%200))%20if%20x.get(%5C%22%E9%94%80%E9%87%8F%5C%22)%20else%200%2C%20reverse%3DTrue)%5Cn%5Cn%23%20%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E8%BF%90%E8%A1%8C%E5%85%A5%E5%8F%A3%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20KEY%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9Ekey%5C%22%5Cn%20%20%20%20SECRET%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9Esecret%5C%22%5Cn%20%20%20%20analysis%20%3D%20JDAnalysisTool(KEY%2C%20SECRET)%5Cn%20%20%20%20%23%20%E6%89%B9%E9%87%8F%E7%AB%9E%E5%93%81ID%E5%88%97%E8%A1%A8%5Cn%20%20%20%20goods_ids%20%3D%20%5B%5Cn%20%20%20%20%20%20%20%20%5C%22100012345678%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22100023456789%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22100034567890%5C%22%5Cn%20%20%20%20%5D%5Cn%20%20%20%20data%20%3D%20analysis.batch_collect(goods_ids)%5Cn%20%20%20%20analysis.export_csv(data)%5Cn%20%20%20%20hot_data%20%3D%20analysis.sort_hot(data)%5Cn%20%20%20%20print(%5C%22%5C%5Cn%3D%3D%3D%3D%E7%83%AD%E9%97%A8%E5%95%86%E5%93%81%E6%8E%92%E5%BA%8F%EF%BC%88%E9%94%80%E9%87%8F%E4%BB%8E%E9%AB%98%E5%88%B0%E4%BD%8E%EF%BC%89%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20for%20item%20in%20hot_data%3A%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%7Bitem%5B&amp;#39;%E5%95%86%E5%93%81%E6%A0%87%E9%A2%98&amp;#39;%5D%7D%20%7C%20%E9%94%80%E9%87%8F%EF%BC%9A%7Bitem%5B&amp;#39;%E9%94%80%E9%87%8F&amp;#39;%5D%7D%20%7C%20%E4%BB%B7%E6%A0%BC%EF%BC%9A%7Bitem%5B&amp;#39;%E7%8E%B0%E4%BB%B7&amp;#39;%5D%7D%5C%22)%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;requests
import&amp;nbsp;time
import&amp;nbsp;csv

class&amp;nbsp;JDAnalysisTool:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;key,&amp;nbsp;secret):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.collector&amp;nbsp;=&amp;nbsp;JDGoodsCollector(key,&amp;nbsp;secret)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;batch_collect(self,&amp;nbsp;id_list):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;批量采集多款商品数据&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result_list&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;开始批量采集{len(id_list)}个商品数据&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;idx,&amp;nbsp;item_id&amp;nbsp;in&amp;nbsp;enumerate(id_list):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;正在采集第{idx+1}/{len(id_list)}：{item_id}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info&amp;nbsp;=&amp;nbsp;self.collector.get_goods_detail(item_id,&amp;nbsp;real_time=False)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;info:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item_dict&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;商品ID&amp;quot;:&amp;nbsp;item_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;商品标题&amp;quot;:&amp;nbsp;info.get(&amp;quot;title&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;现价&amp;quot;:&amp;nbsp;info.get(&amp;quot;price&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;原价&amp;quot;:&amp;nbsp;info.get(&amp;quot;org_price&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;店铺&amp;quot;:&amp;nbsp;info.get(&amp;quot;shop_name&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;销量&amp;quot;:&amp;nbsp;info.get(&amp;quot;sales&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;好评率&amp;quot;:&amp;nbsp;info.get(&amp;quot;goodRateShow&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;总评论&amp;quot;:&amp;nbsp;info.get(&amp;quot;commentCount&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result_list.append(item_dict)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(1)&amp;nbsp;&amp;nbsp;#&amp;nbsp;防频繁请求限流
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;result_list

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;export_csv(self,&amp;nbsp;data_list,&amp;nbsp;save_name=&amp;quot;jd_goods_analysis.csv&amp;quot;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;导出csv表格，Excel可直接打开&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;data_list:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;无数据可导出&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;headers&amp;nbsp;=&amp;nbsp;list(data_list[0].keys())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;open(save_name,&amp;nbsp;&amp;quot;w&amp;quot;,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;,&amp;nbsp;newline=&amp;quot;&amp;quot;)&amp;nbsp;as&amp;nbsp;f:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer&amp;nbsp;=&amp;nbsp;csv.DictWriter(f,&amp;nbsp;fieldnames=headers)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.writeheader()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.writerows(data_list)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;数据已导出至：{save_name}&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;sort_hot(self,&amp;nbsp;data_list):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;数据分析：按销量降序排序，筛选热门商品&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;sorted(data_list,&amp;nbsp;key=lambda&amp;nbsp;x:&amp;nbsp;int(x.get(&amp;quot;销量&amp;quot;,&amp;nbsp;0))&amp;nbsp;if&amp;nbsp;x.get(&amp;quot;销量&amp;quot;)&amp;nbsp;else&amp;nbsp;0,&amp;nbsp;reverse=True)

#&amp;nbsp;数据分析运行入口
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;KEY&amp;nbsp;=&amp;nbsp;&amp;quot;你的专属key&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SECRET&amp;nbsp;=&amp;nbsp;&amp;quot;你的专属secret&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;analysis&amp;nbsp;=&amp;nbsp;JDAnalysisTool(KEY,&amp;nbsp;SECRET)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;批量竞品ID列表
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goods_ids&amp;nbsp;=&amp;nbsp;[
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;100012345678&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;100023456789&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;100034567890&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;analysis.batch_collect(goods_ids)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;analysis.export_csv(data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hot_data&amp;nbsp;=&amp;nbsp;analysis.sort_hot(data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;\n====热门商品排序（销量从高到低）====&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;hot_data:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;{item[&amp;#39;商品标题&amp;#39;]}&amp;nbsp;|&amp;nbsp;销量：{item[&amp;#39;销量&amp;#39;]}&amp;nbsp;|&amp;nbsp;价格：{item[&amp;#39;现价&amp;#39;]}&amp;quot;)&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;数据分析拓展用法&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;价格区间筛选：增加函数过滤低价、高价竞品，锁定对标价位商品；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;口碑筛选：过滤好评率低于 90% 的劣质竞品；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;入库存储：将数据存入 MySQL、Sqlite，长期存储后绘制价格走势折线图，复盘大促价格规律。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;六、落地常见问题与优化技巧&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;调用限流&lt;/strong&gt;：个人日常使用间隔 1~3 秒，企业批量采集用异步队列错峰请求，不要短时间高频循环；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;监控实时性&lt;/strong&gt;：日常监控 5~10 分钟采集一次足够，618、双 11 大促可缩短至 2~3 分钟；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;轻量化部署&lt;/strong&gt;：脚本放到云服务器后台常驻运行，无需本地电脑一直开机；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;冗余过滤&lt;/strong&gt;：不需要详情图片、长参数时，可自行裁剪解析字段，减少内存占用。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;七、总结&lt;/h2&gt;&lt;p&gt;借助 Open Claw 的高级商品详情采集能力，不用钻研复杂网页逆向、不用反复维护爬虫规则，几十行代码就能快速落地稳定可靠的商品监控系统与数据分析工具。&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;个人从业者：用来盯竞品、选货源、薅促销活动；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;电商团队：搭建自动化数据中台，批量竞品监控、价格调研、铺货素材整理； 整套代码轻量化易修改，新手复制替换凭证与商品 ID 即可直接运行，长期使用可以根据业务叠加消息推送、可视化图表、数据库存储等拓展功能。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span data-cke-copybin-end=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sun, 02 Aug 2026 09:50:47 +0800</pubDate></item><item><title>OpenClaw 实战：搭建京东商品监控与简易数据分析脚本</title><link>https://shopapi.com.cn/?id=206</link><description>&lt;p&gt;&lt;span data-cke-copybin-start=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;前言&lt;/h2&gt;&lt;p&gt;做电商运营、竞品分析、选品调研的时候，我们经常需要持续盯一批商品：价格波动、库存变化、规格变动、销量走势。手动打开网页复制粘贴，效率低还容易遗漏关键变化。&lt;/p&gt;&lt;p&gt;最近折腾 OpenClaw 这套工具，发现可以快速把商品基础信息定时拉取到本地，做成轻量化监控脚本。不需要复杂爬虫框架，几行代码就可以完成定时采集、数据落盘、简单分析，适合个人小团队做竞品跟踪、选品复盘。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;注意：本文仅用于技术学习，使用时请遵守平台规则，控制访问频率，请勿高频批量抓取，避免对网站造成压力。&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;工具准备&lt;/h2&gt;&lt;p&gt;环境依赖：Python3，requests，pandas，sqlite3（内置）&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;0&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22pip%20install%20requests%20pandas%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;pip&amp;nbsp;install&amp;nbsp;requests&amp;nbsp;pandas&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;我们会实现这些功能：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;根据商品编号获取&lt;strong&gt;&lt;strong&gt;&lt;span aria-label=&quot;a 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_inline cke_widget_csdnlink cke_widget_wrapper_link-info cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;a&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;6&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;link-info cke_widget_editable cke_widget_element&quot; contenteditable=&quot;true&quot; data-cke-enter-mode=&quot;2&quot; data-cke-widget-data=&quot;%7B%22url%22%3A%22https%3A%2F%2Fo0b.cn%2Ficris%22%2C%22text%22%3A%22%E5%AE%8C%E6%95%B4%E5%95%86%E5%93%81%E5%85%83%E6%95%B0%E6%8D%AE%22%2C%22desc%22%3A%22%22%2C%22icon%22%3A%22%22%2C%22isCard%22%3Afalse%2C%22hasResquest%22%3Atrue%2C%22iconDefault%22%3A%22https%3A%2F%2Fcsdnimg.cn%2Frelease%2Fblog_editor_html%2Frelease2.4.6%2Fckeditor%2Fplugins%2FCsdnLink%2Ficons%2Ficon-default.png%3Ft%3DQ239%22%2C%22id%22%3A%22n4kIl4-1785466651414%22%2C%22classes%22%3A%7B%22link-info%22%3A1%7D%7D&quot; data-cke-widget-editable=&quot;text&quot; data-cke-widget-keep-attr=&quot;0&quot; data-link-icon=&quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=Q239&quot; data-link-title=&quot;完整商品元数据&quot; data-widget=&quot;csdnlink&quot; href=&quot;https://o0b.cn/icris&quot; title=&quot;完整商品元数据&quot;&gt;完整商品元数据&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/strong&gt;：标题、原价、售价、库存、SKU 规格、店铺信息、发货地等&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;定时采集，把历史价格、库存存入本地 SQLite 数据库，留存变化记录&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;简单数据分析：价格变动统计、库存波动、导出 CSV 报表&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;简易告警逻辑：价格大跌 / 库存清零打印提示&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;完整实现代码&lt;/h2&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;1&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22%23%20-*-%20coding%3Autf-8%20-*-%5Cnimport%20requests%5Cnimport%20time%5Cnimport%20sqlite3%5Cnimport%20pandas%20as%20pd%5Cnfrom%20datetime%20import%20datetime%5Cn%5Cn%23%20--------------------------%E9%85%8D%E7%BD%AE%E5%8C%BA%E5%9F%9F---------------------------%5CnKEY%20%3D%20%5C%22your_key_here%5C%22%5CnSECRET%20%3D%20%5C%22your_secret_here%5C%22%5Cn%23%20%E9%9C%80%E8%A6%81%E7%9B%91%E6%8E%A7%E7%9A%84%E5%95%86%E5%93%81ID%E5%88%97%E8%A1%A8%5CnMONITOR_ITEM_IDS%20%3D%20%5B%5C%2210335871600%5C%22%5D%5Cn%23%20%E9%87%87%E9%9B%86%E9%97%B4%E9%9A%94%EF%BC%8C%E5%8D%95%E4%BD%8D%E7%A7%92%EF%BC%8C%E6%B5%8B%E8%AF%95%E4%B8%8D%E8%A6%81%E8%AE%BE%E7%BD%AE%E8%BF%87%E5%B0%8F%EF%BC%8C%E5%BB%BA%E8%AE%AE%E8%87%B3%E5%B0%91300%E7%A7%92%E4%BB%A5%E4%B8%8A%5CnFETCH_INTERVAL%20%3D%20600%5CnDB_PATH%20%3D%20%5C%22.%2Fjd_monitor.db%5C%22%5Cn%23%20-------------------------------------------------------------%5Cn%5Cndef%20init_db()%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E5%BA%93%EF%BC%8C%E5%AD%98%E5%82%A8%E6%AF%8F%E6%AC%A1%E9%87%87%E9%9B%86%E5%BF%AB%E7%85%A7%5C%22%5C%22%5C%22%5Cn%20%20%20%20conn%20%3D%20sqlite3.connect(DB_PATH)%5Cn%20%20%20%20cur%20%3D%20conn.cursor()%5Cn%20%20%20%20cur.execute(&amp;#39;&amp;#39;&amp;#39;%5Cn%20%20%20%20CREATE%20TABLE%20IF%20NOT%20EXISTS%20item_history%20(%5Cn%20%20%20%20%20%20%20%20id%20INTEGER%20PRIMARY%20KEY%20AUTOINCREMENT%2C%5Cn%20%20%20%20%20%20%20%20num_iid%20TEXT%2C%5Cn%20%20%20%20%20%20%20%20title%20TEXT%2C%5Cn%20%20%20%20%20%20%20%20price%20REAL%2C%5Cn%20%20%20%20%20%20%20%20original_price%20REAL%2C%5Cn%20%20%20%20%20%20%20%20stock%20INTEGER%2C%5Cn%20%20%20%20%20%20%20%20sales%20INTEGER%2C%5Cn%20%20%20%20%20%20%20%20shop_name%20TEXT%2C%5Cn%20%20%20%20%20%20%20%20location%20TEXT%2C%5Cn%20%20%20%20%20%20%20%20fetch_time%20TIMESTAMP%5Cn%20%20%20%20)%5Cn%20%20%20%20&amp;#39;&amp;#39;&amp;#39;)%5Cn%20%20%20%20conn.commit()%5Cn%20%20%20%20conn.close()%5Cn%5Cn%5Cndef%20fetch_item_detail(num_iid)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E8%8E%B7%E5%8F%96%E5%8D%95%E6%AC%BE%E5%95%86%E5%93%81%E5%AE%8C%E6%95%B4%E8%AF%A6%E6%83%85%E6%95%B0%E6%8D%AE%5C%22%5C%22%5C%22%5Cn%20%20%20%20headers%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22Accept-Encoding%5C%22%3A%20%5C%22gzip%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22Connection%5C%22%3A%20%5C%22close%5C%22%5Cn%20%20%20%20%7D%5Cn%20%20%20%20base_url%20%3D%20%5C%22https%3A%2F%2Fapi-gw.onebound.cn%2Fjd%2Fitem_get_pro%2F%5C%22%5Cn%20%20%20%20params%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22key%5C%22%3A%20KEY%2C%5Cn%20%20%20%20%20%20%20%20%5C%22secret%5C%22%3A%20SECRET%2C%5Cn%20%20%20%20%20%20%20%20%5C%22num_iid%5C%22%3A%20num_iid%2C%5Cn%20%20%20%20%20%20%20%20%5C%22result_type%5C%22%3A%20%5C%22json%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22cache%5C%22%3A%20%5C%22no%5C%22%5Cn%20%20%20%20%7D%5Cn%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20resp%20%3D%20requests.get(base_url%2C%20params%3Dparams%2C%20headers%3Dheaders%2C%20timeout%3D20)%5Cn%20%20%20%20%20%20%20%20resp.raise_for_status()%5Cn%20%20%20%20%20%20%20%20return%20resp.json()%5Cn%20%20%20%20except%20Exception%20as%20e%3A%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E8%AF%B7%E6%B1%82%E5%BC%82%E5%B8%B8%20num_iid%3A%7Bnum_iid%7D%2C%20err%3A%7Be%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20return%20None%5Cn%5Cn%5Cndef%20save_snapshot(raw_data)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E6%8A%8A%E5%8D%95%E6%AC%A1%E9%87%87%E9%9B%86%E7%BB%93%E6%9E%9C%E5%86%99%E5%85%A5%E6%95%B0%E6%8D%AE%E5%BA%93%E5%BF%AB%E7%85%A7%5C%22%5C%22%5C%22%5Cn%20%20%20%20if%20not%20raw_data%20or%20%5C%22item%5C%22%20not%20in%20raw_data%3A%5Cn%20%20%20%20%20%20%20%20return%5Cn%20%20%20%20item%20%3D%20raw_data.get(%5C%22item%5C%22%2C%20%7B%7D)%5Cn%20%20%20%20conn%20%3D%20sqlite3.connect(DB_PATH)%5Cn%20%20%20%20cur%20%3D%20conn.cursor()%5Cn%20%20%20%20cur.execute(&amp;#39;&amp;#39;&amp;#39;%5Cn%20%20%20%20INSERT%20INTO%20item_history%5Cn%20%20%20%20(num_iid%2Ctitle%2Cprice%2Coriginal_price%2Cstock%2Csales%2Cshop_name%2Clocation%2Cfetch_time)%5Cn%20%20%20%20VALUES%20(%3F%2C%3F%2C%3F%2C%3F%2C%3F%2C%3F%2C%3F%2C%3F%2C%3F)%5Cn%20%20%20%20&amp;#39;&amp;#39;&amp;#39;%2C%20(%5Cn%20%20%20%20%20%20%20%20item.get(%5C%22num_iid%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20item.get(%5C%22title%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20float(item.get(%5C%22price%5C%22%2C%200))%2C%5Cn%20%20%20%20%20%20%20%20float(item.get(%5C%22orginal_price%5C%22%2C%200))%2C%5Cn%20%20%20%20%20%20%20%20int(item.get(%5C%22num%5C%22%2C%200))%2C%5Cn%20%20%20%20%20%20%20%20int(item.get(%5C%22sales%5C%22%2C%200))%2C%5Cn%20%20%20%20%20%20%20%20item.get(%5C%22nick%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20item.get(%5C%22location%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20datetime.now().strftime(%5C%22%25Y-%25m-%25d%20%25H%3A%25M%3A%25S%5C%22)%5Cn%20%20%20%20))%5Cn%20%20%20%20conn.commit()%5Cn%20%20%20%20conn.close()%5Cn%5Cn%20%20%20%20%23%20%E7%AE%80%E5%8D%95%E7%9B%91%E6%8E%A7%E5%91%8A%E8%AD%A6%E9%80%BB%E8%BE%91%5Cn%20%20%20%20price%20%3D%20float(item.get(%5C%22price%5C%22%2C%200))%5Cn%20%20%20%20stock%20%3D%20int(item.get(%5C%22num%5C%22%2C%200))%5Cn%20%20%20%20print(f%5C%22%E3%80%90%E5%BF%AB%E7%85%A7%E3%80%91%7Bitem.get(&amp;#39;title&amp;#39;)%7D%20%7C%20%E5%BD%93%E5%89%8D%E4%BB%B7%3A%7Bprice%7D%20%7C%E5%BA%93%E5%AD%98%3A%7Bstock%7D%20%7C%20%7Bdatetime.now()%7D%5C%22)%5Cn%20%20%20%20if%20stock%20%3C%3D%200%3A%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E2%9A%A0%EF%B8%8F%E8%AD%A6%E5%91%8A%EF%BC%9A%E5%95%86%E5%93%81%20%7Bitem.get(&amp;#39;num_iid&amp;#39;)%7D%20%E5%BA%93%E5%AD%98%E5%BD%92%E9%9B%B6%EF%BC%81%5C%22)%5Cn%5Cn%5Cndef%20export_analysis_csv()%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E5%AF%BC%E5%87%BA%E5%8E%86%E5%8F%B2%E6%95%B0%E6%8D%AE%EF%BC%8C%E5%81%9A%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%EF%BC%8C%E8%BE%93%E5%87%BAcsv%5C%22%5C%22%5C%22%5Cn%20%20%20%20conn%20%3D%20sqlite3.connect(DB_PATH)%5Cn%20%20%20%20df%20%3D%20pd.read_sql(%5C%22SELECT%20*%20FROM%20item_history%20ORDER%20BY%20fetch_time%20DESC%5C%22%2C%20conn)%5Cn%20%20%20%20conn.close()%5Cn%20%20%20%20csv_name%20%3D%20f%5C%22.%2Fitem_analysis_%7Bdatetime.now().strftime(&amp;#39;%25Y%25m%25d_%25H%25M&amp;#39;)%7D.csv%5C%22%5Cn%20%20%20%20df.to_csv(csv_name%2C%20index%3DFalse%2C%20encoding%3D%5C%22utf_8_sig%5C%22)%5Cn%20%20%20%20print(f%5C%22%E2%9C%85%E5%88%86%E6%9E%90%E6%8A%A5%E8%A1%A8%E5%AF%BC%E5%87%BA%E5%AE%8C%E6%88%90%EF%BC%9A%7Bcsv_name%7D%5C%22)%5Cn%20%20%20%20return%20df%5Cn%5Cn%5Cndef%20simple_analysis(df)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E7%AE%80%E6%98%93%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%EF%BC%9A%E7%BB%9F%E8%AE%A1%E4%BB%B7%E6%A0%BC%E6%9C%80%E5%A4%A7%E6%9C%80%E5%B0%8F%EF%BC%8C%E4%BB%B7%E6%A0%BC%E5%8F%98%E5%8A%A8%E6%AC%A1%E6%95%B0%EF%BC%8C%E5%BA%93%E5%AD%98%E5%8F%98%E5%8C%96%5C%22%5C%22%5C%22%5Cn%20%20%20%20if%20df.empty%3A%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E6%9A%82%E6%97%A0%E9%87%87%E9%9B%86%E6%95%B0%E6%8D%AE%5C%22)%5Cn%20%20%20%20%20%20%20%20return%5Cn%20%20%20%20print(%5C%22%5C%5Cn%3D%3D%3D%3D%3D%3D%3D%3D%E7%AE%80%E6%98%93%E5%88%86%E6%9E%90%E6%8A%A5%E5%91%8A%3D%3D%3D%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20for%20item_id%20in%20df%5B%5C%22num_iid%5C%22%5D.unique()%3A%5Cn%20%20%20%20%20%20%20%20sub%20%3D%20df%5Bdf%5B%5C%22num_iid%5C%22%5D%20%3D%3D%20item_id%5D%5Cn%20%20%20%20%20%20%20%20min_p%20%3D%20sub%5B%5C%22price%5C%22%5D.min()%5Cn%20%20%20%20%20%20%20%20max_p%20%3D%20sub%5B%5C%22price%5C%22%5D.max()%5Cn%20%20%20%20%20%20%20%20latest_price%20%3D%20sub.iloc%5B0%5D%5B%5C%22price%5C%22%5D%5Cn%20%20%20%20%20%20%20%20latest_stock%20%3D%20sub.iloc%5B0%5D%5B%5C%22stock%5C%22%5D%5Cn%20%20%20%20%20%20%20%20record_cnt%20%3D%20len(sub)%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E5%95%86%E5%93%81ID%3A%7Bitem_id%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E8%AE%B0%E5%BD%95%E6%9D%A1%E6%95%B0%3A%7Brecord_cnt%7D%20%7C%E5%8E%86%E5%8F%B2%E6%9C%80%E4%BD%8E%3A%7Bmin_p%7D%20%7C%E5%8E%86%E5%8F%B2%E6%9C%80%E9%AB%98%3A%7Bmax_p%7D%20%7C%E6%9C%80%E6%96%B0%E4%BB%B7%E6%A0%BC%3A%7Blatest_price%7D%20%7C%E6%9C%80%E6%96%B0%E5%BA%93%E5%AD%98%3A%7Blatest_stock%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20print(%5C%22-%5C%22*40)%5Cn%5Cn%5Cndef%20monitor_loop()%3A%5Cn%20%20%20%20init_db()%5Cn%20%20%20%20print(%5C%22%E5%BC%80%E5%A7%8B%E5%95%86%E5%93%81%E7%9B%91%E6%8E%A7%E5%BE%AA%E7%8E%AF%EF%BC%8C%E6%8C%89Ctrl%2BC%E5%81%9C%E6%AD%A2%E7%A8%8B%E5%BA%8F%5C%22)%5Cn%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20for%20item%20in%20MONITOR_ITEM_IDS%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20res%20%3D%20fetch_item_detail(item)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20res%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20save_snapshot(res)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%AF%8F%E9%87%87%E9%9B%86%E4%B8%89%E8%BD%AE%E5%AF%BC%E5%87%BA%E4%B8%80%E6%AC%A1%E6%8A%A5%E8%A1%A8%EF%BC%8C%E5%8F%AF%E8%87%AA%E8%A1%8C%E4%BF%AE%E6%94%B9%5Cn%20%20%20%20%20%20%20%20%20%20%20%20export_analysis_csv()%5Cn%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(FETCH_INTERVAL)%5Cn%20%20%20%20except%20KeyboardInterrupt%3A%5Cn%20%20%20%20%20%20%20%20print(%5C%22%5C%5Cn%E6%94%B6%E5%88%B0%E5%81%9C%E6%AD%A2%E4%BF%A1%E5%8F%B7%EF%BC%8C%E5%87%86%E5%A4%87%E5%AF%BC%E5%87%BA%E6%9C%80%E7%BB%88%E6%8A%A5%E8%A1%A8...%5C%22)%5Cn%20%20%20%20%20%20%20%20df%20%3D%20export_analysis_csv()%5Cn%20%20%20%20%20%20%20%20simple_analysis(df)%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E7%A8%8B%E5%BA%8F%E9%80%80%E5%87%BA%5C%22)%5Cn%5Cn%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20monitor_loop()%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;#&amp;nbsp;-*-&amp;nbsp;coding:utf-8&amp;nbsp;-*-
import&amp;nbsp;requests
import&amp;nbsp;time
import&amp;nbsp;sqlite3
import&amp;nbsp;pandas&amp;nbsp;as&amp;nbsp;pd
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime

#&amp;nbsp;--------------------------配置区域---------------------------
KEY&amp;nbsp;=&amp;nbsp;&amp;quot;your_key_here&amp;quot;
SECRET&amp;nbsp;=&amp;nbsp;&amp;quot;your_secret_here&amp;quot;
#&amp;nbsp;需要监控的商品ID列表
MONITOR_ITEM_IDS&amp;nbsp;=&amp;nbsp;[&amp;quot;10335871600&amp;quot;]
#&amp;nbsp;采集间隔，单位秒，测试不要设置过小，建议至少300秒以上
FETCH_INTERVAL&amp;nbsp;=&amp;nbsp;600
DB_PATH&amp;nbsp;=&amp;nbsp;&amp;quot;./jd_monitor.db&amp;quot;
#&amp;nbsp;-------------------------------------------------------------

def&amp;nbsp;init_db():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;初始化数据库，存储每次采集快照&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn&amp;nbsp;=&amp;nbsp;sqlite3.connect(DB_PATH)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cur&amp;nbsp;=&amp;nbsp;conn.cursor()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cur.execute(&amp;#39;&amp;#39;&amp;#39;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CREATE&amp;nbsp;TABLE&amp;nbsp;IF&amp;nbsp;NOT&amp;nbsp;EXISTS&amp;nbsp;item_history&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;id&amp;nbsp;INTEGER&amp;nbsp;PRIMARY&amp;nbsp;KEY&amp;nbsp;AUTOINCREMENT,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num_iid&amp;nbsp;TEXT,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;title&amp;nbsp;TEXT,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price&amp;nbsp;REAL,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;original_price&amp;nbsp;REAL,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stock&amp;nbsp;INTEGER,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sales&amp;nbsp;INTEGER,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;shop_name&amp;nbsp;TEXT,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;location&amp;nbsp;TEXT,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fetch_time&amp;nbsp;TIMESTAMP
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;&amp;#39;&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.commit()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.close()


def&amp;nbsp;fetch_item_detail(num_iid):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;获取单款商品完整详情数据&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;headers&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;Accept-Encoding&amp;quot;:&amp;nbsp;&amp;quot;gzip&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;Connection&amp;quot;:&amp;nbsp;&amp;quot;close&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_url&amp;nbsp;=&amp;nbsp;&amp;quot;https://api-gw.onebound.cn/jd/item_get_pro/&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;key&amp;quot;:&amp;nbsp;KEY,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;secret&amp;quot;:&amp;nbsp;SECRET,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;num_iid&amp;quot;:&amp;nbsp;num_iid,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;result_type&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;cache&amp;quot;:&amp;nbsp;&amp;quot;no&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.get(base_url,&amp;nbsp;params=params,&amp;nbsp;headers=headers,&amp;nbsp;timeout=20)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp.raise_for_status()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;请求异常&amp;nbsp;num_iid:{num_iid},&amp;nbsp;err:{e}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None


def&amp;nbsp;save_snapshot(raw_data):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;把单次采集结果写入数据库快照&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;raw_data&amp;nbsp;or&amp;nbsp;&amp;quot;item&amp;quot;&amp;nbsp;not&amp;nbsp;in&amp;nbsp;raw_data:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item&amp;nbsp;=&amp;nbsp;raw_data.get(&amp;quot;item&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn&amp;nbsp;=&amp;nbsp;sqlite3.connect(DB_PATH)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cur&amp;nbsp;=&amp;nbsp;conn.cursor()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cur.execute(&amp;#39;&amp;#39;&amp;#39;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INSERT&amp;nbsp;INTO&amp;nbsp;item_history
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(num_iid,title,price,original_price,stock,sales,shop_name,location,fetch_time)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VALUES&amp;nbsp;(?,?,?,?,?,?,?,?,?)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;#39;&amp;#39;&amp;#39;,&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item.get(&amp;quot;num_iid&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item.get(&amp;quot;title&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float(item.get(&amp;quot;price&amp;quot;,&amp;nbsp;0)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float(item.get(&amp;quot;orginal_price&amp;quot;,&amp;nbsp;0)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int(item.get(&amp;quot;num&amp;quot;,&amp;nbsp;0)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int(item.get(&amp;quot;sales&amp;quot;,&amp;nbsp;0)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item.get(&amp;quot;nick&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item.get(&amp;quot;location&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;datetime.now().strftime(&amp;quot;%Y-%m-%d&amp;nbsp;%H:%M:%S&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.commit()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.close()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;简单监控告警逻辑
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price&amp;nbsp;=&amp;nbsp;float(item.get(&amp;quot;price&amp;quot;,&amp;nbsp;0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stock&amp;nbsp;=&amp;nbsp;int(item.get(&amp;quot;num&amp;quot;,&amp;nbsp;0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;【快照】{item.get(&amp;#39;title&amp;#39;)}&amp;nbsp;|&amp;nbsp;当前价:{price}&amp;nbsp;|库存:{stock}&amp;nbsp;|&amp;nbsp;{datetime.now()}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;stock&amp;nbsp;&amp;lt;=&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;⚠️警告：商品&amp;nbsp;{item.get(&amp;#39;num_iid&amp;#39;)}&amp;nbsp;库存归零！&amp;quot;)


def&amp;nbsp;export_analysis_csv():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;导出历史数据，做数据分析，输出csv&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn&amp;nbsp;=&amp;nbsp;sqlite3.connect(DB_PATH)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;pd.read_sql(&amp;quot;SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;item_history&amp;nbsp;ORDER&amp;nbsp;BY&amp;nbsp;fetch_time&amp;nbsp;DESC&amp;quot;,&amp;nbsp;conn)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;csv_name&amp;nbsp;=&amp;nbsp;f&amp;quot;./item_analysis_{datetime.now().strftime(&amp;#39;%Y%m%d_%H%M&amp;#39;)}.csv&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df.to_csv(csv_name,&amp;nbsp;index=False,&amp;nbsp;encoding=&amp;quot;utf_8_sig&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;✅分析报表导出完成：{csv_name}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;df


def&amp;nbsp;simple_analysis(df):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;简易数据分析：统计价格最大最小，价格变动次数，库存变化&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;df.empty:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;暂无采集数据&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;\n========简易分析报告========&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item_id&amp;nbsp;in&amp;nbsp;df[&amp;quot;num_iid&amp;quot;].unique():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sub&amp;nbsp;=&amp;nbsp;df[df[&amp;quot;num_iid&amp;quot;]&amp;nbsp;==&amp;nbsp;item_id]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_p&amp;nbsp;=&amp;nbsp;sub[&amp;quot;price&amp;quot;].min()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;max_p&amp;nbsp;=&amp;nbsp;sub[&amp;quot;price&amp;quot;].max()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latest_price&amp;nbsp;=&amp;nbsp;sub.iloc[0][&amp;quot;price&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latest_stock&amp;nbsp;=&amp;nbsp;sub.iloc[0][&amp;quot;stock&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;record_cnt&amp;nbsp;=&amp;nbsp;len(sub)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;商品ID:{item_id}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;记录条数:{record_cnt}&amp;nbsp;|历史最低:{min_p}&amp;nbsp;|历史最高:{max_p}&amp;nbsp;|最新价格:{latest_price}&amp;nbsp;|最新库存:{latest_stock}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;-&amp;quot;*40)


def&amp;nbsp;monitor_loop():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;init_db()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;开始商品监控循环，按Ctrl+C停止程序&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;MONITOR_ITEM_IDS:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res&amp;nbsp;=&amp;nbsp;fetch_item_detail(item)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;res:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;save_snapshot(res)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;每采集三轮导出一次报表，可自行修改
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;export_analysis_csv()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(FETCH_INTERVAL)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;KeyboardInterrupt:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;\n收到停止信号，准备导出最终报表...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;export_analysis_csv()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple_analysis(df)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;程序退出&amp;quot;)


if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor_loop()&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;代码解读&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据库初始化&lt;/strong&gt;：使用轻量 SQLite 保存每一轮的快照，每一次拉取都作为一条历史记录，后续用来回溯价格、库存变化。不需要部署 MySQL，开箱即用。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据拉取函数&lt;/strong&gt;：填入你的凭证和商品编号，就可以拿到商品标题、售价、原价、库存、店铺名称、发货地、SKU 规格全套信息。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;快照存储&lt;/strong&gt;：每次成功获取信息，就写入一条记录；同时内置简单告警，如果库存变为 0 控制台输出提醒。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;报表导出与分析&lt;/strong&gt;：定时把全部历史快照导出 CSV，直接可以用 Excel 打开做图表分析。脚本内置简单统计：最高最低价格、记录数量、最新状态。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;循环监控&lt;/strong&gt;：设置间隔时间，持续轮询。测试环境建议不要把间隔调太小，避免触发访问限制。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;运行之后控制台输出示例：&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;2&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22%E5%BC%80%E5%A7%8B%E5%95%86%E5%93%81%E7%9B%91%E6%8E%A7%E5%BE%AA%E7%8E%AF%EF%BC%8C%E6%8C%89Ctrl%2BC%E5%81%9C%E6%AD%A2%E7%A8%8B%E5%BA%8F%5Cn%E3%80%90%E5%BF%AB%E7%85%A7%E3%80%91%E4%BA%AC%E4%B8%9C%E9%B2%9C%E8%8A%B1%E7%88%B1%E4%B8%BD%E4%B8%9D%E6%B3%A1%E6%B3%A1%E9%B2%9C%E5%88%87%E8%8A%B1%E4%BA%91%E5%8D%97%E9%B2%9C%E8%8A%B1%E5%AE%B6%E5%BA%AD%E6%8F%92%E8%8A%B1%E7%88%B1%E4%B8%BD%E4%B8%9D%E6%B3%A1%E6%B3%A110%E6%9E%9D%E6%BA%90%E5%A4%B4%E7%9B%B4%E5%8F%91%20%7C%20%E5%BD%93%E5%89%8D%E4%BB%B7%3A30.9%20%7C%E5%BA%93%E5%AD%98%3A99%20%7C%202026%E2%80%9107%E2%80%9131%2015%3A22%3A10%5Cn%E2%9C%85%E5%88%86%E6%9E%90%E6%8A%A5%E8%A1%A8%E5%AF%BC%E5%87%BA%E5%AE%8C%E6%88%90%EF%BC%9A.%2Fitem_analysis_20260731_1522.csv%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;开始商品监控循环，按Ctrl+C停止程序
【快照】京东鲜花爱丽丝泡泡鲜切花云南鲜花家庭插花爱丽丝泡泡10枝源头直发&amp;nbsp;|&amp;nbsp;当前价:30.9&amp;nbsp;|库存:99&amp;nbsp;|&amp;nbsp;2026‑07‑31&amp;nbsp;15:22:10
✅分析报表导出完成：./item_analysis_20260731_1522.csv&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;按下&lt;code&gt;Ctrl+C&lt;/code&gt;终止脚本，程序会自动导出最后一次完整分析报告，打印各商品的价格区间统计。&lt;/p&gt;&lt;h2&gt;拓展玩法&lt;/h2&gt;&lt;h3&gt;1. SKU 多规格监控&lt;/h3&gt;&lt;p&gt;返回结果里面自带 skus 数组，可以扩展脚本把每一个子规格的价格、库存分开存入子表，监控不同规格的调价、缺货。&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;3&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22%23%20%E7%A4%BA%E4%BE%8B%EF%BC%8C%E8%A7%A3%E6%9E%90sku%E7%89%87%E6%AE%B5%5Cnskus_data%20%3D%20raw_data%5B%5C%22item%5C%22%5D.get(%5C%22skus%5C%22%2C%7B%7D)%5Cnsku_list%20%3D%20skus_data.get(%5C%22sku%5C%22%2C%5B%5D)%5Cnfor%20sku%20in%20sku_list%3A%5Cn%20%20%20%20print(sku%5B%5C%22properties_name%5C%22%5D%2Csku%5B%5C%22price%5C%22%5D%2Csku%5B%5C%22quantity%5C%22%5D)%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;#&amp;nbsp;示例，解析sku片段
skus_data&amp;nbsp;=&amp;nbsp;raw_data[&amp;quot;item&amp;quot;].get(&amp;quot;skus&amp;quot;,{})
sku_list&amp;nbsp;=&amp;nbsp;skus_data.get(&amp;quot;sku&amp;quot;,[])
for&amp;nbsp;sku&amp;nbsp;in&amp;nbsp;sku_list:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(sku[&amp;quot;properties_name&amp;quot;],sku[&amp;quot;price&amp;quot;],sku[&amp;quot;quantity&amp;quot;])&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;2. 邮件 / 企业微信告警&lt;/h3&gt;&lt;p&gt;当检测到价格暴跌、库存售罄，可以增加推送逻辑，把告警消息推送到企业微信机器人、邮箱，不用盯着控制台。&lt;/p&gt;&lt;h3&gt;3. Pandas 做可视化&lt;/h3&gt;&lt;p&gt;导出 DataFrame 后，直接用 matplotlib 绘制价格走势图，把一段时间的价格波动生成图片保存，适合做竞品周报素材。&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;4&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20matplotlib.pyplot%20as%20plt%5Cnplt.rcParams%5B%5C%22font.sans-serif%5C%22%5D%3D%5B%5C%22SimHei%5C%22%5D%5Cndf%5B%5C%22fetch_time%5C%22%5D%20%3D%20pd.to_datetime(df%5B%5C%22fetch_time%5C%22%5D)%5Cnplt.plot(df%5B%5C%22fetch_time%5C%22%5D%2Cdf%5B%5C%22price%5C%22%5D)%5Cnplt.title(%5C%22%E5%95%86%E5%93%81%E4%BB%B7%E6%A0%BC%E7%9B%91%E6%8E%A7%E6%9B%B2%E7%BA%BF%5C%22)%5Cnplt.savefig(%5C%22.%2Fprice_trend.png%5C%22)%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt
plt.rcParams[&amp;quot;font.sans-serif&amp;quot;]=[&amp;quot;SimHei&amp;quot;]
df[&amp;quot;fetch_time&amp;quot;]&amp;nbsp;=&amp;nbsp;pd.to_datetime(df[&amp;quot;fetch_time&amp;quot;])
plt.plot(df[&amp;quot;fetch_time&amp;quot;],df[&amp;quot;price&amp;quot;])
plt.title(&amp;quot;商品价格监控曲线&amp;quot;)
plt.savefig(&amp;quot;./price_trend.png&amp;quot;)&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;踩坑和注意事项&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;凭证信息不要硬编码上传公开代码仓库，实际项目建议放到环境变量。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;平台会提供缓存开关，调试阶段把 cache 设置为 no 拿到实时数据；日常监控打开缓存，可以减少消耗。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;返回中的价格字段，部分场景下会和页面展示存在偏差，属于原始数据本身限制，做分析时要留意。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;不要超大批量同时监控几百上千商品，控制轮询间隔，合理使用工具。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;小结&lt;/h2&gt;&lt;p&gt;借助 OpenClaw，不用手写复杂解析逻辑，只需要专注业务逻辑：存快照、写告警、做数据分析。对于个人做竞品跟踪、选品复盘，这套脚本足够轻便好用。&lt;/p&gt;&lt;p&gt;&lt;span data-cke-copybin-end=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 31 Jul 2026 11:08:18 +0800</pubDate></item><item><title>Open‑Claw 实战｜低成本搭建电商评论监控与口碑数据分析系统</title><link>https://shopapi.com.cn/?id=205</link><description>&lt;p&gt;&lt;span data-cke-copybin-start=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;前言&lt;/h2&gt;&lt;p&gt;做电商运营、竞品调研、产品迭代的同学，几乎都会遇到一个痛点：想要持续跟踪商品用户反馈，人工翻看评价页面效率极低。当需要同时盯多款竞品，还要定期统计好评、差评、规格反馈、晒图情况，单纯手动复制粘贴几乎不可行。&lt;/p&gt;&lt;p&gt;很多同学会尝试自己写页面解析脚本，但平台防护策略更新快，经常没过几天就无法正常拿到内容，调试、维护要耗费大量时间。&lt;/p&gt;&lt;p&gt;最近在用 Open‑Claw 做项目，发现它可以省去页面解析、对抗防护的繁琐工作，直接拿到规整后的评价原始内容。我们可以基于这套能力，快速搭建一套简易的监控脚本，实现定时拉取商品评价、增量识别新增反馈、简单文本统计分析，输出本地报表，完成基础的竞品口碑监控。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;提示：本文所有内容仅用于个人学习研究，使用相关能力请遵守对应平台规则，请勿用于违规批量爬取。&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;整体思路&lt;/h2&gt;&lt;p&gt;整体分为 4 个步骤：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;准备&lt;strong&gt;&lt;strong&gt;&lt;span aria-label=&quot;a 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_inline cke_widget_csdnlink cke_widget_wrapper_link-info cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;a&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;3&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;link-info cke_widget_editable cke_widget_element&quot; contenteditable=&quot;true&quot; data-cke-enter-mode=&quot;2&quot; data-cke-widget-data=&quot;%7B%22url%22%3A%22https%3A%2F%2Fo0b.cn%2Ficris%22%2C%22text%22%3A%22%E8%BA%AB%E4%BB%BD%E5%87%AD%E8%AF%81%22%2C%22desc%22%3A%22%22%2C%22icon%22%3A%22%22%2C%22isCard%22%3Afalse%2C%22hasResquest%22%3Atrue%2C%22iconDefault%22%3A%22https%3A%2F%2Fcsdnimg.cn%2Frelease%2Fblog_editor_html%2Frelease2.4.6%2Fckeditor%2Fplugins%2FCsdnLink%2Ficons%2Ficon-default.png%3Ft%3DQ239%22%2C%22id%22%3A%22BFAHS5-1785463069689%22%2C%22classes%22%3A%7B%22link-info%22%3A1%7D%7D&quot; data-cke-widget-editable=&quot;text&quot; data-cke-widget-keep-attr=&quot;0&quot; data-link-icon=&quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=Q239&quot; data-link-title=&quot;身份凭证&quot; data-widget=&quot;csdnlink&quot; href=&quot;https://o0b.cn/icris&quot; title=&quot;身份凭证&quot;&gt;身份凭证&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/strong&gt;，获取商品编号；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;编写拉取逻辑，分页获取评价原始内容；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;做增量判断，只处理新增评价，避免重复分析；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;简单统计分析：好评差评占比、高频关键词提取，导出 csv 文件；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;增加定时循环，实现简易持续监控。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;拿到的数据字段包含：评价正文、评价时间、购买规格、买家脱敏昵称、晒图地址、追评内容等，足够做日常口碑调研分析万邦开放平...。&lt;/p&gt;&lt;h2&gt;环境准备&lt;/h2&gt;&lt;p&gt;本地需要安装依赖库&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;0&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22pip%20install%20requests%20pandas%20collections%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;pip&amp;nbsp;install&amp;nbsp;requests&amp;nbsp;pandas&amp;nbsp;collections&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;完整可运行代码&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;1&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20requests%5Cnimport%20time%5Cnimport%20csv%5Cnimport%20pandas%20as%20pd%5Cnfrom%20collections%20import%20Counter%5Cn%5Cn%23%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20%E9%85%8D%E7%BD%AE%E5%8C%BA%E5%9F%9F%EF%BC%8C%E8%AF%B7%E8%87%AA%E8%A1%8C%E4%BF%AE%E6%94%B9%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5CnTOKEN%20%3D%20%5C%22your_access_key%5C%22%5CnSECRET%20%3D%20%5C%22your_secret_code%5C%22%5CnTARGET_ITEM_ID%20%3D%20%5C%22723456789123%5C%22%20%20%20%23%20%E7%9B%AE%E6%A0%87%E5%95%86%E5%93%81id%EF%BC%8C%E4%BB%8E%E5%95%86%E5%93%81%E9%93%BE%E6%8E%A5%E6%8F%90%E5%8F%96%5CnMAX_PAGE%20%3D%205%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%9C%80%E5%A4%9A%E8%AF%BB%E5%8F%96%E5%A4%9A%E5%B0%91%E9%A1%B5%E8%AF%84%E4%BB%B7%5CnSAVE_CSV_PATH%20%3D%20%5C%22.%2Fgoods_review.csv%5C%22%5Cn%23%20%E7%94%A8%E4%BA%8E%E5%86%85%E5%AD%98%E8%AE%B0%E5%BD%95%E5%B7%B2%E7%BB%8F%E5%A4%84%E7%90%86%E8%BF%87%E7%9A%84%E8%AF%84%E4%BB%B7id%EF%BC%8C%E9%98%B2%E6%AD%A2%E9%87%8D%E5%A4%8D%E7%BB%9F%E8%AE%A1%5Cnprocessed_review_ids%20%3D%20set()%5Cn%23%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5Cn%5Cn%5Cndef%20fetch_review_page(item_id%2C%20page_no%2C%20sort_type%3D1%2C%20rate_filter%3D0)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%E8%8E%B7%E5%8F%96%E5%8D%95%E9%A1%B5%E8%AF%84%E4%BB%B7%5Cn%20%20%20%20sort_type%3A1%E6%9C%80%E6%96%B0%2C2%E6%9C%80%E7%83%AD%5Cn%20%20%20%20rate_filter%3A0%E5%85%A8%E9%83%A8%2C1%E5%A5%BD%E8%AF%84%2C2%E4%B8%AD%E8%AF%84%2C3%E5%B7%AE%E8%AF%84%5Cn%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20params%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22key%5C%22%3A%20TOKEN%2C%5Cn%20%20%20%20%20%20%20%20%5C%22secret%5C%22%3A%20SECRET%2C%5Cn%20%20%20%20%20%20%20%20%5C%22num_iid%5C%22%3A%20item_id%2C%5Cn%20%20%20%20%20%20%20%20%5C%22page_no%5C%22%3A%20page_no%2C%5Cn%20%20%20%20%20%20%20%20%5C%22page_size%5C%22%3A%2040%2C%5Cn%20%20%20%20%20%20%20%20%5C%22sort%5C%22%3A%20sort_type%2C%5Cn%20%20%20%20%20%20%20%20%5C%22rate_type%5C%22%3A%20rate_filter%2C%5Cn%20%20%20%20%20%20%20%20%5C%22result_type%5C%22%3A%20%5C%22json%5C%22%5Cn%20%20%20%20%7D%5Cn%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20resp%20%3D%20requests.get(%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22https%3A%2F%2Fcollect.openclaw.cloud%2Fpull%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20params%3Dparams%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20timeout%3D15%5Cn%20%20%20%20%20%20%20%20)%5Cn%20%20%20%20%20%20%20%20json_data%20%3D%20resp.json()%5Cn%20%20%20%20%20%20%20%20if%20json_data.get(%5C%22code%5C%22)%20!%3D%200%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E7%AC%AC%7Bpage_no%7D%E9%A1%B5%E8%AF%B7%E6%B1%82%E5%BC%82%E5%B8%B8%EF%BC%9A%7Bjson_data.get(&amp;#39;msg&amp;#39;)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20%5B%5D%5Cn%20%20%20%20%20%20%20%20review_list%20%3D%20json_data.get(%5C%22items%5C%22%2C%20%7B%7D).get(%5C%22item%5C%22%2C%20%5B%5D)%5Cn%20%20%20%20%20%20%20%20return%20review_list%5Cn%20%20%20%20except%20Exception%20as%20e%3A%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E7%BD%91%E7%BB%9C%E5%BC%82%E5%B8%B8%20%7Bstr(e)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20return%20%5B%5D%5Cn%5Cn%5Cndef%20parse_raw_review(raw_item)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E6%B8%85%E6%B4%97%E5%8D%95%E6%9D%A1%E5%8E%9F%E5%A7%8B%E6%95%B0%E6%8D%AE%EF%BC%8C%E6%8F%90%E5%8F%96%E9%9C%80%E8%A6%81%E5%AD%97%E6%AE%B5%5C%22%5C%22%5C%22%5Cn%20%20%20%20rid%20%3D%20raw_item.get(%5C%22rate_id%5C%22%2C%20%5C%22%5C%22)%5Cn%20%20%20%20if%20not%20rid%3A%5Cn%20%20%20%20%20%20%20%20return%20None%5Cn%20%20%20%20info%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22review_id%5C%22%3A%20rid%2C%5Cn%20%20%20%20%20%20%20%20%5C%22nick%5C%22%3A%20raw_item.get(%5C%22display_user_nick%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%5C%22content%5C%22%3A%20raw_item.get(%5C%22rate_content%5C%22%2C%20%5C%22%5C%22).strip()%2C%5Cn%20%20%20%20%20%20%20%20%5C%22sku_spec%5C%22%3A%20raw_item.get(%5C%22auction_sku%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%5C%22rate_date%5C%22%3A%20raw_item.get(%5C%22rate_date%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%5C%22star%5C%22%3A%20raw_item.get(%5C%22rate_star%5C%22%2C%200)%2C%5Cn%20%20%20%20%20%20%20%20%5C%22pic_list%5C%22%3A%20%5C%22%7C%5C%22.join(raw_item.get(%5C%22pics%5C%22%2C%20%5B%5D))%20if%20raw_item.get(%5C%22pics%5C%22)%20else%20%5C%22%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22add_review%5C%22%3A%20raw_item.get(%5C%22add_feedback%5C%22%2C%20%5C%22%5C%22).strip()%5Cn%20%20%20%20%7D%5Cn%20%20%20%20return%20info%5Cn%5Cn%5Cndef%20save_to_csv(review_data_list%2C%20file_path)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E8%BF%BD%E5%8A%A0%E5%86%99%E5%85%A5csv%EF%BC%8C%E4%BF%9D%E5%AD%98%E8%AF%84%E4%BB%B7%E8%AE%B0%E5%BD%95%5C%22%5C%22%5C%22%5Cn%20%20%20%20headers%20%3D%20%5B%5C%22review_id%5C%22%2C%5C%22nick%5C%22%2C%5C%22content%5C%22%2C%5C%22sku_spec%5C%22%2C%5C%22rate_date%5C%22%2C%5C%22star%5C%22%2C%5C%22pic_list%5C%22%2C%5C%22add_review%5C%22%5D%5Cn%20%20%20%20file_exist%20%3D%20False%5Cn%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20with%20open(file_path%2C%20%5C%22r%5C%22%2C%20encoding%3D%5C%22utf%E2%80%918%E2%80%91sig%5C%22)%20as%20f%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20file_exist%20%3D%20True%5Cn%20%20%20%20except%20FileNotFoundError%3A%5Cn%20%20%20%20%20%20%20%20pass%5Cn%5Cn%20%20%20%20with%20open(file_path%2C%20%5C%22a%5C%22%2C%20newline%3D%5C%22%5C%22%2C%20encoding%3D%5C%22utf%E2%80%918%E2%80%91sig%5C%22)%20as%20f%3A%5Cn%20%20%20%20%20%20%20%20writer%20%3D%20csv.DictWriter(f%2C%20fieldnames%3Dheaders)%5Cn%20%20%20%20%20%20%20%20if%20not%20file_exist%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20writer.writeheader()%5Cn%20%20%20%20%20%20%20%20for%20row%20in%20review_data_list%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20writer.writerow(row)%5Cn%5Cn%5Cndef%20simple_text_analysis(df_new)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E7%AE%80%E5%8D%95%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%EF%BC%8C%E6%89%93%E5%8D%B0%E7%BB%9F%E8%AE%A1%E7%BB%93%E6%9E%9C%5C%22%5C%22%5C%22%5Cn%20%20%20%20if%20df_new.empty%3A%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E6%9C%AC%E8%BD%AE%E6%B2%A1%E6%9C%89%E6%96%B0%E8%AF%84%E4%BB%B7%5C%22)%5Cn%20%20%20%20%20%20%20%20return%5Cn%20%20%20%20total%20%3D%20len(df_new)%5Cn%20%20%20%20good%20%3D%20len(df_new%5Bdf_new%5B%5C%22star%5C%22%5D%20%3E%3D4%5D)%5Cn%20%20%20%20mid%20%3D%20len(df_new%5Bdf_new%5B%5C%22star%5C%22%5D%20%3D%3D3%5D)%5Cn%20%20%20%20bad%20%3D%20len(df_new%5Bdf_new%5B%5C%22star%5C%22%5D%20%3C%3D2%5D)%5Cn%5Cn%20%20%20%20print(%5C%22%5C%5Cn%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%E6%9C%AC%E8%BD%AE%E6%96%B0%E5%A2%9E%E8%AF%84%E4%BB%B7%E7%BB%9F%E8%AE%A1%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20print(f%5C%22%E6%9C%AC%E8%BD%AE%E6%96%B0%E5%A2%9E%E6%9D%A1%E6%95%B0%EF%BC%9A%7Btotal%7D%5C%22)%5Cn%20%20%20%20print(f%5C%22%E5%A5%BD%E8%AF%84%EF%BC%9A%7Bgood%7D%EF%BC%8C%E5%8D%A0%E6%AF%94%20%7Bgood%2Ftotal%3A.2%25%7D%5C%22)%5Cn%20%20%20%20print(f%5C%22%E4%B8%AD%E8%AF%84%EF%BC%9A%7Bmid%7D%EF%BC%8C%E5%8D%A0%E6%AF%94%20%7Bmid%2Ftotal%3A.2%25%7D%5C%22)%5Cn%20%20%20%20print(f%5C%22%E5%B7%AE%E8%AF%84%EF%BC%9A%7Bbad%7D%EF%BC%8C%E5%8D%A0%E6%AF%94%20%7Bbad%2Ftotal%3A.2%25%7D%5C%22)%5Cn%5Cn%20%20%20%20%23%20%E7%AE%80%E5%8D%95%E5%88%86%E8%AF%8D%E6%8F%90%E5%8F%96%E9%AB%98%E9%A2%91%E8%AF%8D%EF%BC%8C%E8%BF%99%E9%87%8C%E5%81%9A%E7%AE%80%E5%8D%95%E5%88%87%E5%88%86%EF%BC%8C%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E5%BB%BA%E8%AE%AE%E6%9B%BF%E6%8D%A2%E4%B8%93%E4%B8%9A%E5%88%86%E8%AF%8D%E5%BA%93%5Cn%20%20%20%20all_words%20%3D%20%5B%5D%5Cn%20%20%20%20for%20text%20in%20df_new%5B%5C%22content%5C%22%5D%3A%5Cn%20%20%20%20%20%20%20%20words%20%3D%20%5Bw%20for%20w%20in%20str(text).replace(%5C%22%20%5C%22%2C%5C%22%5C%22)%20if%20len(w)%3E%3D2%5D%5Cn%20%20%20%20%20%20%20%20all_words.extend(list(words))%5Cn%20%20%20%20top_word%20%3D%20Counter(all_words).most_common(12)%5Cn%20%20%20%20print(%5C%22%E9%AB%98%E9%A2%91%E8%AF%8DTop12%EF%BC%9A%5C%22%2Ctop_word)%5Cn%20%20%20%20print(%5C%22%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5C%5Cn%5C%22)%5Cn%5Cn%5Cndef%20run_one_cycle()%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E6%89%A7%E8%A1%8C%E4%B8%80%E8%BD%AE%E9%87%87%E9%9B%86%E4%BB%BB%E5%8A%A1%5C%22%5C%22%5C%22%5Cn%20%20%20%20new_reviews%20%3D%20%5B%5D%5Cn%20%20%20%20for%20page%20in%20range(1%2C%20MAX_PAGE%2B1)%3A%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E6%AD%A3%E5%9C%A8%E8%AF%BB%E5%8F%96%E7%AC%AC%20%7Bpage%7D%20%E9%A1%B5%5C%22)%5Cn%20%20%20%20%20%20%20%20raw_items%20%3D%20fetch_review_page(TARGET_ITEM_ID%2C%20page)%5Cn%20%20%20%20%20%20%20%20if%20not%20raw_items%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20break%5Cn%20%20%20%20%20%20%20%20for%20raw%20in%20raw_items%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20parsed%20%3D%20parse_raw_review(raw)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20parsed%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20parsed%5B%5C%22review_id%5C%22%5D%20in%20processed_review_ids%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%5Cn%20%20%20%20%20%20%20%20%20%20%20%20processed_review_ids.add(parsed%5B%5C%22review_id%5C%22%5D)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20new_reviews.append(parsed)%5Cn%20%20%20%20%20%20%20%20time.sleep(2)%5Cn%5Cn%20%20%20%20if%20len(new_reviews)%20%3E%200%3A%5Cn%20%20%20%20%20%20%20%20save_to_csv(new_reviews%2C%20SAVE_CSV_PATH)%5Cn%20%20%20%20%20%20%20%20df%20%3D%20pd.DataFrame(new_reviews)%5Cn%20%20%20%20%20%20%20%20simple_text_analysis(df)%5Cn%20%20%20%20else%3A%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E6%9C%AC%E8%BD%AE%E6%9C%AA%E5%8F%91%E7%8E%B0%E6%96%B0%E5%A2%9E%E8%AF%84%E4%BB%B7%5C%22)%5Cn%5Cn%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20%23%20%E5%8D%95%E6%AC%A1%E8%BF%90%E8%A1%8C%20run_one_cycle()%5Cn%20%20%20%20%23%20%E5%A6%82%E6%9E%9C%E8%A6%81%E5%81%9A%E6%8C%81%E7%BB%AD%E7%9B%91%E6%8E%A7%EF%BC%8C%E6%89%93%E5%BC%80%E4%B8%8B%E9%9D%A2%E5%BE%AA%E7%8E%AF%EF%BC%8C%E6%B3%A8%E6%84%8F%E9%97%B4%E9%9A%94%E4%B8%8D%E8%A6%81%E8%BF%87%E7%9F%AD%5Cn%20%20%20%20run_one_cycle()%5Cn%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20run_one_cycle()%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E4%BC%91%E7%9C%A030%E5%88%86%E9%92%9F%EF%BC%8C%E7%AD%89%E5%BE%85%E4%B8%8B%E4%B8%80%E8%BD%AE%E7%9B%91%E6%8E%A7...%5C%22)%5Cn%20%20%20%20%20%20%20%20time.sleep(60%20*%2030)%5Cn%20%20%20%20%5C%22%5C%22%5C%22%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;requests
import&amp;nbsp;time
import&amp;nbsp;csv
import&amp;nbsp;pandas&amp;nbsp;as&amp;nbsp;pd
from&amp;nbsp;collections&amp;nbsp;import&amp;nbsp;Counter

#&amp;nbsp;=====================&amp;nbsp;配置区域，请自行修改&amp;nbsp;=====================
TOKEN&amp;nbsp;=&amp;nbsp;&amp;quot;your_access_key&amp;quot;
SECRET&amp;nbsp;=&amp;nbsp;&amp;quot;your_secret_code&amp;quot;
TARGET_ITEM_ID&amp;nbsp;=&amp;nbsp;&amp;quot;723456789123&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;目标商品id，从商品链接提取
MAX_PAGE&amp;nbsp;=&amp;nbsp;5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;最多读取多少页评价
SAVE_CSV_PATH&amp;nbsp;=&amp;nbsp;&amp;quot;./goods_review.csv&amp;quot;
#&amp;nbsp;用于内存记录已经处理过的评价id，防止重复统计
processed_review_ids&amp;nbsp;=&amp;nbsp;set()
#&amp;nbsp;==============================================================


def&amp;nbsp;fetch_review_page(item_id,&amp;nbsp;page_no,&amp;nbsp;sort_type=1,&amp;nbsp;rate_filter=0):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;获取单页评价
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sort_type:1最新,2最热
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rate_filter:0全部,1好评,2中评,3差评
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;key&amp;quot;:&amp;nbsp;TOKEN,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;secret&amp;quot;:&amp;nbsp;SECRET,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;num_iid&amp;quot;:&amp;nbsp;item_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page_no&amp;quot;:&amp;nbsp;page_no,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page_size&amp;quot;:&amp;nbsp;40,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sort&amp;quot;:&amp;nbsp;sort_type,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;rate_type&amp;quot;:&amp;nbsp;rate_filter,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;result_type&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.get(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;https://collect.openclaw.cloud/pull&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params=params,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;timeout=15
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;json_data&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;json_data.get(&amp;quot;code&amp;quot;)&amp;nbsp;!=&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;第{page_no}页请求异常：{json_data.get(&amp;#39;msg&amp;#39;)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;review_list&amp;nbsp;=&amp;nbsp;json_data.get(&amp;quot;items&amp;quot;,&amp;nbsp;{}).get(&amp;quot;item&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;review_list
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;网络异常&amp;nbsp;{str(e)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;[]


def&amp;nbsp;parse_raw_review(raw_item):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;清洗单条原始数据，提取需要字段&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rid&amp;nbsp;=&amp;nbsp;raw_item.get(&amp;quot;rate_id&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;rid:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;review_id&amp;quot;:&amp;nbsp;rid,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;nick&amp;quot;:&amp;nbsp;raw_item.get(&amp;quot;display_user_nick&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;content&amp;quot;:&amp;nbsp;raw_item.get(&amp;quot;rate_content&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;).strip(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sku_spec&amp;quot;:&amp;nbsp;raw_item.get(&amp;quot;auction_sku&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;rate_date&amp;quot;:&amp;nbsp;raw_item.get(&amp;quot;rate_date&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;star&amp;quot;:&amp;nbsp;raw_item.get(&amp;quot;rate_star&amp;quot;,&amp;nbsp;0),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;pic_list&amp;quot;:&amp;nbsp;&amp;quot;|&amp;quot;.join(raw_item.get(&amp;quot;pics&amp;quot;,&amp;nbsp;[]))&amp;nbsp;if&amp;nbsp;raw_item.get(&amp;quot;pics&amp;quot;)&amp;nbsp;else&amp;nbsp;&amp;quot;&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;add_review&amp;quot;:&amp;nbsp;raw_item.get(&amp;quot;add_feedback&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;).strip()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;info


def&amp;nbsp;save_to_csv(review_data_list,&amp;nbsp;file_path):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;追加写入csv，保存评价记录&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;headers&amp;nbsp;=&amp;nbsp;[&amp;quot;review_id&amp;quot;,&amp;quot;nick&amp;quot;,&amp;quot;content&amp;quot;,&amp;quot;sku_spec&amp;quot;,&amp;quot;rate_date&amp;quot;,&amp;quot;star&amp;quot;,&amp;quot;pic_list&amp;quot;,&amp;quot;add_review&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file_exist&amp;nbsp;=&amp;nbsp;False
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;open(file_path,&amp;nbsp;&amp;quot;r&amp;quot;,&amp;nbsp;encoding=&amp;quot;utf‑8‑sig&amp;quot;)&amp;nbsp;as&amp;nbsp;f:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;file_exist&amp;nbsp;=&amp;nbsp;True
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;FileNotFoundError:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pass

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;open(file_path,&amp;nbsp;&amp;quot;a&amp;quot;,&amp;nbsp;newline=&amp;quot;&amp;quot;,&amp;nbsp;encoding=&amp;quot;utf‑8‑sig&amp;quot;)&amp;nbsp;as&amp;nbsp;f:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer&amp;nbsp;=&amp;nbsp;csv.DictWriter(f,&amp;nbsp;fieldnames=headers)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;file_exist:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.writeheader()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;row&amp;nbsp;in&amp;nbsp;review_data_list:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.writerow(row)


def&amp;nbsp;simple_text_analysis(df_new):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;简单数据分析，打印统计结果&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;df_new.empty:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;本轮没有新评价&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total&amp;nbsp;=&amp;nbsp;len(df_new)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;good&amp;nbsp;=&amp;nbsp;len(df_new[df_new[&amp;quot;star&amp;quot;]&amp;nbsp;&amp;gt;=4])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mid&amp;nbsp;=&amp;nbsp;len(df_new[df_new[&amp;quot;star&amp;quot;]&amp;nbsp;==3])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bad&amp;nbsp;=&amp;nbsp;len(df_new[df_new[&amp;quot;star&amp;quot;]&amp;nbsp;&amp;lt;=2])

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;\n===========本轮新增评价统计===========&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;本轮新增条数：{total}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;好评：{good}，占比&amp;nbsp;{good/total:.2%}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;中评：{mid}，占比&amp;nbsp;{mid/total:.2%}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;差评：{bad}，占比&amp;nbsp;{bad/total:.2%}&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;简单分词提取高频词，这里做简单切分，生产环境建议替换专业分词库
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_words&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;text&amp;nbsp;in&amp;nbsp;df_new[&amp;quot;content&amp;quot;]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;words&amp;nbsp;=&amp;nbsp;[w&amp;nbsp;for&amp;nbsp;w&amp;nbsp;in&amp;nbsp;str(text).replace(&amp;quot;&amp;nbsp;&amp;quot;,&amp;quot;&amp;quot;)&amp;nbsp;if&amp;nbsp;len(w)&amp;gt;=2]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_words.extend(list(words))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;top_word&amp;nbsp;=&amp;nbsp;Counter(all_words).most_common(12)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;高频词Top12：&amp;quot;,top_word)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;======================================\n&amp;quot;)


def&amp;nbsp;run_one_cycle():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;执行一轮采集任务&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_reviews&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;page&amp;nbsp;in&amp;nbsp;range(1,&amp;nbsp;MAX_PAGE+1):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;正在读取第&amp;nbsp;{page}&amp;nbsp;页&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw_items&amp;nbsp;=&amp;nbsp;fetch_review_page(TARGET_ITEM_ID,&amp;nbsp;page)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;raw_items:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;raw&amp;nbsp;in&amp;nbsp;raw_items:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parsed&amp;nbsp;=&amp;nbsp;parse_raw_review(raw)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;parsed:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;parsed[&amp;quot;review_id&amp;quot;]&amp;nbsp;in&amp;nbsp;processed_review_ids:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;processed_review_ids.add(parsed[&amp;quot;review_id&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_reviews.append(parsed)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(2)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(new_reviews)&amp;nbsp;&amp;gt;&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;save_to_csv(new_reviews,&amp;nbsp;SAVE_CSV_PATH)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;pd.DataFrame(new_reviews)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;simple_text_analysis(df)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;本轮未发现新增评价&amp;quot;)


if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;单次运行&amp;nbsp;run_one_cycle()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;如果要做持续监控，打开下面循环，注意间隔不要过短
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;run_one_cycle()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;run_one_cycle()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;休眠30分钟，等待下一轮监控...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(60&amp;nbsp;*&amp;nbsp;30)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;代码说明&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;fetch_review_page&lt;/strong&gt;：负责分页获取内容，可以筛选好评、中评、差评，也可以选择最新或者最热排序。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;parse_raw_review&lt;/strong&gt;：把杂乱的原始结果做规整，把评价 id、规格、晒图、追评提取出来，评价 id 作为唯一标识，用来做增量过滤。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;processed_review_ids&lt;/strong&gt;内存集合，记录已经处理过的评价 id，每一轮只分析新出来的反馈，不会重复统计历史老评价。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;simple_text_analysis&lt;/strong&gt;简易分析，统计星级分布，简单做高频词统计。正式业务场景可以替换 jieba 分词，接入情绪分析模型做情感判断。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;csv 持久化&lt;/strong&gt;把每一轮数据追加写入本地文件，方便后续 Excel 打开复盘。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;如果开启 while 循环，就变成定时监控脚本，注意休眠时间不能太短，避免短时间高频访问。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;落地场景拓展&lt;/h2&gt;&lt;p&gt;拿到结构化评价数据之后，还可以延伸做很多事情：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;竞品监控&lt;/strong&gt;：同时配置多个商品编号，循环遍历，定时输出竞品差评变化，快速感知竞品质量问题、用户集中吐槽点；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;自家商品质检&lt;/strong&gt;：持续盯自己店铺商品，一旦出现新增差评，脚本打印告警，运营可以及时跟进；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;规格问题统计&lt;/strong&gt;：统计哪个 SKU 规格对应的差评最多，辅助供应链、产品做优化；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;晒图素材沉淀&lt;/strong&gt;：把晒图链接保存，后续做用户研究素材。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;踩坑总结&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;不要设置每页数量过大，单次返回数据量太高容易报错，建议控制在 40‑50 以内；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;一定要做延时，循环中间 time.sleep，否则容易触发限流；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;评价 id 务必保存，用来做增量识别，不然每次全量拉取，会重复分析历史内容；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;部分评价会为空、或者只有表情符号，业务代码可以增加文本长度过滤，剔除无效内容；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;正式部署不要硬编码凭证，可以放到环境变量中。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;小结&lt;/h2&gt;&lt;p&gt;借助 Open‑Claw 的能力，我们不需要花费大量精力维护页面解析规则，就可以快速完成评价获取、增量监控、简单数据分析，十几行核心代码就能搭建起个人调研使用的口碑监控脚本。&lt;/p&gt;&lt;p&gt;&lt;span data-cke-copybin-end=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 31 Jul 2026 10:08:49 +0800</pubDate></item><item><title>电商口碑自动化监控实战：基于 OpenClaw 搭建商品评价实时分析系统（附完整可运行 Python 代码）</title><link>https://shopapi.com.cn/?id=204</link><description>&lt;p&gt;&lt;span data-cke-copybin-start=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;一、前言：电商人做竞品口碑的痛点&lt;/h2&gt;&lt;p&gt;做淘宝、天猫运营、产品调研、竞品分析的从业者，几乎每天都要面对商品评价数据：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;手动采集效率极低&lt;/strong&gt;：竞品多、商品量大，人工翻页复制评论，一天只能处理 2-3 款产品，数据严重滞后；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;平台风控限制爬虫&lt;/strong&gt;：自研 Selenium、异步爬取极易被限制访问，还要维护代理池、Cookie，维护成本极高；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据无结构化&lt;/strong&gt;：复制下来的评论杂乱无章，无法快速区分好评、差评、追评、图文评价，难以做批量统计；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;缺少实时监控能力&lt;/strong&gt;：新品差评爆发、批量负面反馈出现后，商家往往滞后数天才发现，错失售后补救、产品优化时机。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;本文给大家一套轻量化落地方案，借助 OpenClaw 数据采集能力，零复杂爬虫开发，仅通过几十行 Python 代码，实现&lt;strong&gt;商品评价全量自动拉取、定时增量监控、文本情感分析、痛点关键词提取&lt;/strong&gt;完整流程，数据可落地存储 Excel/MySQL，适合个人运营、中小商家、数据分析师直接复用。&lt;/p&gt;&lt;h2&gt;二、方案核心优势&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;无需自研爬虫，规避平台反拦截&lt;/strong&gt; 底层封装成熟数据通道，不用处理页面动态渲染、滑块验证、访问限流，输入商品 ID 即可稳定拉取全维度评价数据，包含评价正文、星级、购买 SKU、晒图、追评、评价时间、买家昵称等完整字段。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;支持增量实时监控&lt;/strong&gt; 可自定义定时轮询周期（小时 / 天），只抓取新增评价，避免重复拉取历史数据，7×24 小时监控竞品口碑异动。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;一站式数据清洗 + 智能分析&lt;/strong&gt; 配套文本处理逻辑，自动过滤刷单无效评价、空白内容，结合文本情感库自动区分正向 / 负向评价，统计差评高频问题，输出可视化口碑报表。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;低开发门槛&lt;/strong&gt; Python 基础语法即可运行，配置专属访问密钥后直接调用，支持批量商品同时监控，适配选品调研、店铺舆情、竞品对标等多场景。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;三、前期准备工作&lt;/h2&gt;&lt;h3&gt;1. 工具账号开通&lt;/h3&gt;&lt;p&gt;注册 完成实名后获取专属访问密钥（后续代码中替换&lt;span aria-label=&quot;a 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_inline cke_widget_csdnlink cke_widget_wrapper_link-info cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;a&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;6&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;link-info cke_widget_editable cke_widget_element&quot; contenteditable=&quot;true&quot; data-cke-enter-mode=&quot;2&quot; data-cke-widget-data=&quot;%7B%22url%22%3A%22https%3A%2F%2Fo0b.cn%2Ficris%22%2C%22text%22%3A%22KEY%E5%8F%82%E6%95%B0%22%2C%22desc%22%3A%22%22%2C%22icon%22%3A%22%22%2C%22isCard%22%3Afalse%2C%22hasResquest%22%3Atrue%2C%22iconDefault%22%3A%22https%3A%2F%2Fcsdnimg.cn%2Frelease%2Fblog_editor_html%2Frelease2.4.6%2Fckeditor%2Fplugins%2FCsdnLink%2Ficons%2Ficon-default.png%3Ft%3DQ239%22%2C%22id%22%3A%22ROASYh-1785230956832%22%2C%22classes%22%3A%7B%22link-info%22%3A1%7D%7D&quot; data-cke-widget-editable=&quot;text&quot; data-cke-widget-keep-attr=&quot;0&quot; data-link-icon=&quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=Q239&quot; data-link-title=&quot;KEY参数&quot; data-widget=&quot;csdnlink&quot; href=&quot;https://o0b.cn/icris&quot; title=&quot;KEY参数&quot;&gt;&lt;strong&gt;KEY参数&lt;/strong&gt;&lt;/a&gt;&lt;/span&gt;），支持海外手机号注册登录，无国内号码也可正常使用。&lt;/p&gt;&lt;h3&gt;2. 环境依赖安装&lt;/h3&gt;&lt;p&gt;本地 Python3.8 及以上环境，执行命令安装所需第三方库：&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;0&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22pip%20install%20requests%20snownlp%20pandas%20openpyxl%20apscheduler%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;pip&amp;nbsp;install&amp;nbsp;requests&amp;nbsp;snownlp&amp;nbsp;pandas&amp;nbsp;openpyxl&amp;nbsp;apscheduler&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;requests：网络请求拉取评价数据&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;snownlp：中文评论情感分析&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;pandas：数据清洗、导出 Excel 报表&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;apscheduler：定时任务，实现自动化监控&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;openpyxl：Excel 文件读写依赖&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;3. 获取目标商品 ID&lt;/h3&gt;&lt;p&gt;打开淘宝商品详情页，链接中&lt;code&gt;id=&lt;/code&gt;后一串纯数字即为商品编号，例如&lt;code&gt;item.taobao.com/item.htm?id=723456123456&lt;/code&gt;，商品 ID 为&lt;code&gt;723456123456&lt;/code&gt;。&lt;/p&gt;&lt;h2&gt;四、完整实战代码实现&lt;/h2&gt;&lt;h3&gt;4.1 全局配置与基础请求封装&lt;/h3&gt;&lt;p&gt;新建&lt;code&gt;review_monitor.py&lt;/code&gt;文件，封装基础数据拉取函数，统一处理分页、异常重试、数据格式化：&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;1&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20requests%5Cnimport%20json%5Cnimport%20time%5Cnimport%20pandas%20as%20pd%5Cnfrom%20snownlp%20import%20SnowNLP%5Cnfrom%20apscheduler.schedulers.background%20import%20BackgroundScheduler%5Cn%5Cn%23%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20%E9%85%8D%E7%BD%AE%E5%8C%BA%EF%BC%88%E8%87%AA%E8%A1%8C%E4%BF%AE%E6%94%B9%EF%BC%89%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5Cn%23%20OpenClaw%E5%90%8E%E5%8F%B0%E8%8E%B7%E5%8F%96%E7%9A%84%E4%B8%93%E5%B1%9E%E5%AF%86%E9%92%A5%5CnACCESS_KEY%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9E%E5%AF%86%E9%92%A5%5C%22%5Cn%23%20%E9%9C%80%E8%A6%81%E7%9B%91%E6%8E%A7%E7%9A%84%E5%95%86%E5%93%81ID%E5%88%97%E8%A1%A8%EF%BC%8C%E5%8F%AF%E6%89%B9%E9%87%8F%E6%B7%BB%E5%8A%A0%E5%A4%9A%E4%B8%AA%E5%95%86%E5%93%81%5CnMONITOR_ITEM_IDS%20%3D%20%5B%5C%22723456123456%5C%22%2C%20%5C%22698765432100%5C%22%5D%5Cn%23%20%E5%8D%95%E6%AC%A1%E8%AF%B7%E6%B1%82%E6%AF%8F%E9%A1%B5%E6%95%B0%E6%8D%AE%E6%9D%A1%E6%95%B0%5CnPAGE_SIZE%20%3D%2020%5Cn%23%20%E5%AE%9A%E6%97%B6%E7%9B%91%E6%8E%A7%E9%97%B4%E9%9A%94%EF%BC%8C%E5%8D%95%E4%BD%8D%EF%BC%9A%E5%B0%8F%E6%97%B6%EF%BC%88%E6%AF%8F2%E5%B0%8F%E6%97%B6%E6%8A%93%E5%8F%96%E4%B8%80%E6%AC%A1%E6%96%B0%E5%A2%9E%E8%AF%84%E4%BB%B7%EF%BC%89%5CnMONITOR_INTERVAL%20%3D%202%5Cn%23%20%E6%9C%AC%E5%9C%B0%E5%AD%98%E5%82%A8%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84%5CnSAVE_EXCEL_PATH%20%3D%20%5C%22.%2F%E5%95%86%E5%93%81%E8%AF%84%E4%BB%B7%E7%9B%91%E6%8E%A7%E6%8A%A5%E8%A1%A8.xlsx%5C%22%5Cn%23%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5Cn%5Cn%23%20%E5%85%A8%E5%B1%80%E8%AF%B7%E6%B1%82%E4%BC%9A%E8%AF%9D%EF%BC%8C%E8%87%AA%E5%8A%A8%E9%87%8D%E8%AF%95%5Cnsession%20%3D%20requests.Session()%5Cnretry_strategy%20%3D%20requests.adapters.Retry(%5Cn%20%20%20%20total%3D3%2C%20backoff_factor%3D1%2C%20status_forcelist%3D%5B500%2C%20502%2C%20503%2C%20429%5D%5Cn)%5Cnsession.mount(%5C%22https%3A%2F%2F%5C%22%2C%20requests.adapters.HTTPAdapter(max_retries%3Dretry_strategy))%5Cn%5Cndef%20fetch_item_review(item_id%3A%20str%2C%20page%3A%20int%20%3D%201)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%E6%8B%89%E5%8F%96%E5%8D%95%E9%A1%B5%E5%95%86%E5%93%81%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE%5Cn%20%20%20%20%3Aparam%20item_id%3A%20%E5%95%86%E5%93%81%E6%95%B0%E5%AD%97ID%5Cn%20%20%20%20%3Aparam%20page%3A%20%E5%88%86%E9%A1%B5%E9%A1%B5%E7%A0%81%5Cn%20%20%20%20%3Areturn%3A%20%E7%BB%93%E6%9E%84%E5%8C%96%E8%AF%84%E4%BB%B7%E5%88%97%E8%A1%A8%E3%80%81%E6%80%BB%E8%AF%84%E4%BB%B7%E6%95%B0%E9%87%8F%5Cn%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20params%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22key%5C%22%3A%20ACCESS_KEY%2C%5Cn%20%20%20%20%20%20%20%20%5C%22item_id%5C%22%3A%20item_id%2C%5Cn%20%20%20%20%20%20%20%20%5C%22page%5C%22%3A%20page%2C%5Cn%20%20%20%20%20%20%20%20%5C%22page_size%5C%22%3A%20PAGE_SIZE%2C%5Cn%20%20%20%20%20%20%20%20%5C%22sort%5C%22%3A%20%5C%22create_time_desc%5C%22%20%20%23%20%E6%8C%89%E8%AF%84%E4%BB%B7%E6%97%B6%E9%97%B4%E5%80%92%E5%BA%8F%EF%BC%8C%E4%BC%98%E5%85%88%E8%8E%B7%E5%8F%96%E6%9C%80%E6%96%B0%E8%AF%84%E4%BB%B7%5Cn%20%20%20%20%7D%5Cn%20%20%20%20%23%20%E5%BA%95%E5%B1%82%E6%95%B0%E6%8D%AE%E8%AF%B7%E6%B1%82%E5%9C%B0%E5%9D%80%5Cn%20%20%20%20base_url%20%3D%20%5C%22%E5%AF%B9%E5%BA%94%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1%E5%9C%B0%E5%9D%80%5C%22%5Cn%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20resp%20%3D%20session.get(base_url%2C%20params%3Dparams%2C%20timeout%3D15)%5Cn%20%20%20%20%20%20%20%20resp_data%20%3D%20resp.json()%5Cn%20%20%20%20%20%20%20%20if%20resp_data.get(%5C%22code%5C%22)%20!%3D%20200%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E5%95%86%E5%93%81%7Bitem_id%7D%E7%AC%AC%7Bpage%7D%E9%A1%B5%E8%AF%B7%E6%B1%82%E5%A4%B1%E8%B4%A5%EF%BC%9A%7Bresp_data.get(&amp;#39;msg&amp;#39;)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20%5B%5D%2C%200%5Cn%20%20%20%20%20%20%20%20review_list%20%3D%20resp_data.get(%5C%22data%5C%22%2C%20%7B%7D).get(%5C%22review_list%5C%22%2C%20%5B%5D)%5Cn%20%20%20%20%20%20%20%20total_count%20%3D%20resp_data.get(%5C%22data%5C%22%2C%20%7B%7D).get(%5C%22total%5C%22%2C%200)%5Cn%20%20%20%20%20%20%20%20return%20review_list%2C%20total_count%5Cn%20%20%20%20except%20Exception%20as%20e%3A%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E7%BD%91%E7%BB%9C%E8%AF%B7%E6%B1%82%E5%BC%82%E5%B8%B8%EF%BC%9A%7Bstr(e)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20return%20%5B%5D%2C%200%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;requests
import&amp;nbsp;json
import&amp;nbsp;time
import&amp;nbsp;pandas&amp;nbsp;as&amp;nbsp;pd
from&amp;nbsp;snownlp&amp;nbsp;import&amp;nbsp;SnowNLP
from&amp;nbsp;apscheduler.schedulers.background&amp;nbsp;import&amp;nbsp;BackgroundScheduler

#&amp;nbsp;=====================&amp;nbsp;配置区（自行修改）&amp;nbsp;=====================
#&amp;nbsp;OpenClaw后台获取的专属密钥
ACCESS_KEY&amp;nbsp;=&amp;nbsp;&amp;quot;你的专属密钥&amp;quot;
#&amp;nbsp;需要监控的商品ID列表，可批量添加多个商品
MONITOR_ITEM_IDS&amp;nbsp;=&amp;nbsp;[&amp;quot;723456123456&amp;quot;,&amp;nbsp;&amp;quot;698765432100&amp;quot;]
#&amp;nbsp;单次请求每页数据条数
PAGE_SIZE&amp;nbsp;=&amp;nbsp;20
#&amp;nbsp;定时监控间隔，单位：小时（每2小时抓取一次新增评价）
MONITOR_INTERVAL&amp;nbsp;=&amp;nbsp;2
#&amp;nbsp;本地存储文件路径
SAVE_EXCEL_PATH&amp;nbsp;=&amp;nbsp;&amp;quot;./商品评价监控报表.xlsx&amp;quot;
#&amp;nbsp;===========================================================

#&amp;nbsp;全局请求会话，自动重试
session&amp;nbsp;=&amp;nbsp;requests.Session()
retry_strategy&amp;nbsp;=&amp;nbsp;requests.adapters.Retry(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total=3,&amp;nbsp;backoff_factor=1,&amp;nbsp;status_forcelist=[500,&amp;nbsp;502,&amp;nbsp;503,&amp;nbsp;429]
)
session.mount(&amp;quot;https://&amp;quot;,&amp;nbsp;requests.adapters.HTTPAdapter(max_retries=retry_strategy))

def&amp;nbsp;fetch_item_review(item_id:&amp;nbsp;str,&amp;nbsp;page:&amp;nbsp;int&amp;nbsp;=&amp;nbsp;1):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;拉取单页商品评价数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;item_id:&amp;nbsp;商品数字ID
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;page:&amp;nbsp;分页页码
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:return:&amp;nbsp;结构化评价列表、总评价数量
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;key&amp;quot;:&amp;nbsp;ACCESS_KEY,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;item_id&amp;quot;:&amp;nbsp;item_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page_size&amp;quot;:&amp;nbsp;PAGE_SIZE,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sort&amp;quot;:&amp;nbsp;&amp;quot;create_time_desc&amp;quot;&amp;nbsp;&amp;nbsp;#&amp;nbsp;按评价时间倒序，优先获取最新评价
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;底层数据请求地址
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base_url&amp;nbsp;=&amp;nbsp;&amp;quot;对应数据服务地址&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;session.get(base_url,&amp;nbsp;params=params,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp_data&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;resp_data.get(&amp;quot;code&amp;quot;)&amp;nbsp;!=&amp;nbsp;200:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;商品{item_id}第{page}页请求失败：{resp_data.get(&amp;#39;msg&amp;#39;)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;[],&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;review_list&amp;nbsp;=&amp;nbsp;resp_data.get(&amp;quot;data&amp;quot;,&amp;nbsp;{}).get(&amp;quot;review_list&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_count&amp;nbsp;=&amp;nbsp;resp_data.get(&amp;quot;data&amp;quot;,&amp;nbsp;{}).get(&amp;quot;total&amp;quot;,&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;review_list,&amp;nbsp;total_count
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;网络请求异常：{str(e)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;[],&amp;nbsp;0&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;4.2 数据清洗 + 情感分析函数&lt;/h3&gt;&lt;p&gt;对原始评价文本做清洗、情感打分，自动标记好评 / 中评 / 差评：&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;2&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22def%20text_sentiment_analysis(content%3A%20str)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E8%AF%84%E8%AE%BA%E6%83%85%E6%84%9F%E5%88%86%E6%9E%90%EF%BC%8C%E8%BF%94%E5%9B%9E%E6%83%85%E6%84%9F%E6%A0%87%E7%AD%BE%E3%80%81%E6%83%85%E6%84%9F%E5%88%86%E6%95%B0%5C%22%5C%22%5C%22%5Cn%20%20%20%20if%20not%20content%20or%20len(content.strip())%20%3C%202%3A%5Cn%20%20%20%20%20%20%20%20return%20%5C%22%E6%97%A0%E6%95%88%E8%AF%84%E4%BB%B7%5C%22%2C%200.5%5Cn%20%20%20%20s%20%3D%20SnowNLP(content)%5Cn%20%20%20%20score%20%3D%20s.sentiments%5Cn%20%20%20%20if%20score%20%3E%3D%200.7%3A%5Cn%20%20%20%20%20%20%20%20label%20%3D%20%5C%22%E5%A5%BD%E8%AF%84%5C%22%5Cn%20%20%20%20elif%20score%20%3E%3D%200.4%3A%5Cn%20%20%20%20%20%20%20%20label%20%3D%20%5C%22%E4%B8%AD%E8%AF%84%5C%22%5Cn%20%20%20%20else%3A%5Cn%20%20%20%20%20%20%20%20label%20%3D%20%5C%22%E5%B7%AE%E8%AF%84%5C%22%5Cn%20%20%20%20return%20label%2C%20round(score%2C%202)%5Cn%5Cndef%20parse_raw_review(raw_list%3A%20list%2C%20item_id%3A%20str)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E5%8E%9F%E5%A7%8B%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%8C%96%E6%B8%85%E6%B4%97%5C%22%5C%22%5C%22%5Cn%20%20%20%20clean_data%20%3D%20%5B%5D%5Cn%20%20%20%20for%20item%20in%20raw_list%3A%5Cn%20%20%20%20%20%20%20%20content%20%3D%20item.get(%5C%22content%5C%22%2C%20%5C%22%5C%22)%5Cn%20%20%20%20%20%20%20%20sentiment_label%2C%20sentiment_score%20%3D%20text_sentiment_analysis(content)%5Cn%20%20%20%20%20%20%20%20row%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E5%95%86%E5%93%81ID%5C%22%3A%20item_id%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E8%AF%84%E4%BB%B7ID%5C%22%3A%20item.get(%5C%22review_id%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E8%AF%84%E4%BB%B7%E6%97%B6%E9%97%B4%5C%22%3A%20item.get(%5C%22create_time%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E4%B9%B0%E5%AE%B6%E6%98%B5%E7%A7%B0%5C%22%3A%20item.get(%5C%22nick%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E8%B4%AD%E4%B9%B0%E8%A7%84%E6%A0%BCSKU%5C%22%3A%20item.get(%5C%22sku_name%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E8%AF%84%E4%BB%B7%E6%AD%A3%E6%96%87%5C%22%3A%20content%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E6%98%9F%E7%BA%A7%E8%AF%84%E5%88%86%5C%22%3A%20item.get(%5C%22rate%5C%22%2C%205)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E6%98%AF%E5%90%A6%E6%99%92%E5%9B%BE%5C%22%3A%201%20if%20item.get(%5C%22pic_urls%5C%22)%20else%200%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E6%98%AF%E5%90%A6%E8%BF%BD%E8%AF%84%5C%22%3A%201%20if%20item.get(%5C%22add_review%5C%22)%20else%200%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E6%83%85%E6%84%9F%E6%A0%87%E7%AD%BE%5C%22%3A%20sentiment_label%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E6%83%85%E6%84%9F%E5%88%86%E6%95%B0%5C%22%3A%20sentiment_score%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20clean_data.append(row)%5Cn%20%20%20%20return%20clean_data%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;def&amp;nbsp;text_sentiment_analysis(content:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;评论情感分析，返回情感标签、情感分数&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;content&amp;nbsp;or&amp;nbsp;len(content.strip())&amp;nbsp;&amp;lt;&amp;nbsp;2:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;quot;无效评价&amp;quot;,&amp;nbsp;0.5
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s&amp;nbsp;=&amp;nbsp;SnowNLP(content)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;score&amp;nbsp;=&amp;nbsp;s.sentiments
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;score&amp;nbsp;&amp;gt;=&amp;nbsp;0.7:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;label&amp;nbsp;=&amp;nbsp;&amp;quot;好评&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;score&amp;nbsp;&amp;gt;=&amp;nbsp;0.4:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;label&amp;nbsp;=&amp;nbsp;&amp;quot;中评&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;label&amp;nbsp;=&amp;nbsp;&amp;quot;差评&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;label,&amp;nbsp;round(score,&amp;nbsp;2)

def&amp;nbsp;parse_raw_review(raw_list:&amp;nbsp;list,&amp;nbsp;item_id:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;原始数据结构化清洗&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clean_data&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;raw_list:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content&amp;nbsp;=&amp;nbsp;item.get(&amp;quot;content&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sentiment_label,&amp;nbsp;sentiment_score&amp;nbsp;=&amp;nbsp;text_sentiment_analysis(content)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;row&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;商品ID&amp;quot;:&amp;nbsp;item_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;评价ID&amp;quot;:&amp;nbsp;item.get(&amp;quot;review_id&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;评价时间&amp;quot;:&amp;nbsp;item.get(&amp;quot;create_time&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;买家昵称&amp;quot;:&amp;nbsp;item.get(&amp;quot;nick&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;购买规格SKU&amp;quot;:&amp;nbsp;item.get(&amp;quot;sku_name&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;评价正文&amp;quot;:&amp;nbsp;content,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;星级评分&amp;quot;:&amp;nbsp;item.get(&amp;quot;rate&amp;quot;,&amp;nbsp;5),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;是否晒图&amp;quot;:&amp;nbsp;1&amp;nbsp;if&amp;nbsp;item.get(&amp;quot;pic_urls&amp;quot;)&amp;nbsp;else&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;是否追评&amp;quot;:&amp;nbsp;1&amp;nbsp;if&amp;nbsp;item.get(&amp;quot;add_review&amp;quot;)&amp;nbsp;else&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;情感标签&amp;quot;:&amp;nbsp;sentiment_label,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;情感分数&amp;quot;:&amp;nbsp;sentiment_score
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clean_data.append(row)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;clean_data&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;4.3 全量拉取 + 本地存储核心逻辑&lt;/h3&gt;&lt;p&gt;循环分页抓取所有评价，合并历史数据去重，导出 Excel 报表：&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;3&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22def%20crawl_all_reviews(item_id%3A%20str)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E5%8D%95%E5%95%86%E5%93%81%E5%85%A8%E9%87%8F%E8%AF%84%E4%BB%B7%E6%8A%93%E5%8F%96%5C%22%5C%22%5C%22%5Cn%20%20%20%20all_clean_reviews%20%3D%20%5B%5D%5Cn%20%20%20%20page%20%3D%201%5Cn%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20raw_data%2C%20total%20%3D%20fetch_item_review(item_id%2C%20page)%5Cn%20%20%20%20%20%20%20%20if%20not%20raw_data%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20break%5Cn%20%20%20%20%20%20%20%20clean_rows%20%3D%20parse_raw_review(raw_data%2C%20item_id)%5Cn%20%20%20%20%20%20%20%20all_clean_reviews.extend(clean_rows)%5Cn%20%20%20%20%20%20%20%20%23%20%E5%BD%93%E5%89%8D%E9%A1%B5%E6%95%B0%E6%8D%AE%E4%B8%8D%E8%B6%B3%E5%88%86%E9%A1%B5%E5%A4%A7%E5%B0%8F%EF%BC%8C%E8%AF%B4%E6%98%8E%E5%B7%B2%E6%8A%93%E5%8F%96%E5%AE%8C%E6%AF%95%5Cn%20%20%20%20%20%20%20%20if%20len(raw_data)%20%3C%20PAGE_SIZE%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20break%5Cn%20%20%20%20%20%20%20%20page%20%2B%3D%201%5Cn%20%20%20%20%20%20%20%20time.sleep(1)%20%20%23%20%E5%88%86%E9%A1%B5%E9%97%B4%E9%9A%94%E9%98%B2%E9%99%90%E6%B5%81%5Cn%20%20%20%20print(f%5C%22%E5%95%86%E5%93%81%7Bitem_id%7D%E6%8A%93%E5%8F%96%E5%AE%8C%E6%88%90%EF%BC%8C%E6%9C%AC%E6%AC%A1%E8%8E%B7%E5%8F%96%7Blen(all_clean_reviews)%7D%E6%9D%A1%E8%AF%84%E4%BB%B7%5C%22)%5Cn%20%20%20%20return%20all_clean_reviews%5Cn%5Cndef%20save_to_excel(new_data%3A%20list)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E5%90%88%E5%B9%B6%E6%96%B0%E6%97%A7%E6%95%B0%E6%8D%AE%EF%BC%8C%E5%8E%BB%E9%87%8D%E5%90%8E%E4%BF%9D%E5%AD%98Excel%5C%22%5C%22%5C%22%5Cn%20%20%20%20new_df%20%3D%20pd.DataFrame(new_data)%5Cn%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20%23%20%E8%AF%BB%E5%8F%96%E5%8E%86%E5%8F%B2%E6%8A%A5%E8%A1%A8%5Cn%20%20%20%20%20%20%20%20old_df%20%3D%20pd.read_excel(SAVE_EXCEL_PATH)%5Cn%20%20%20%20%20%20%20%20merge_df%20%3D%20pd.concat(%5Bold_df%2C%20new_df%5D%2C%20ignore_index%3DTrue)%5Cn%20%20%20%20%20%20%20%20%23%20%E6%A0%B9%E6%8D%AE%E8%AF%84%E4%BB%B7ID%E5%8E%BB%E9%87%8D%EF%BC%8C%E4%BF%9D%E7%95%99%E6%9C%80%E6%96%B0%E6%95%B0%E6%8D%AE%5Cn%20%20%20%20%20%20%20%20merge_df%20%3D%20merge_df.drop_duplicates(subset%3D%5B%5C%22%E8%AF%84%E4%BB%B7ID%5C%22%5D%2C%20keep%3D%5C%22last%5C%22)%5Cn%20%20%20%20except%20FileNotFoundError%3A%5Cn%20%20%20%20%20%20%20%20%23%20%E6%96%87%E4%BB%B6%E4%B8%8D%E5%AD%98%E5%9C%A8%E5%88%99%E6%96%B0%E5%BB%BA%5Cn%20%20%20%20%20%20%20%20merge_df%20%3D%20new_df%5Cn%20%20%20%20%23%20%E6%8C%89%E8%AF%84%E4%BB%B7%E6%97%B6%E9%97%B4%E5%80%92%E5%BA%8F%E6%8E%92%E5%BA%8F%5Cn%20%20%20%20merge_df%20%3D%20merge_df.sort_values(by%3D%5C%22%E8%AF%84%E4%BB%B7%E6%97%B6%E9%97%B4%5C%22%2C%20ascending%3DFalse)%5Cn%20%20%20%20merge_df.to_excel(SAVE_EXCEL_PATH%2C%20index%3DFalse)%5Cn%20%20%20%20print(f%5C%22%E6%95%B0%E6%8D%AE%E5%B7%B2%E6%9B%B4%E6%96%B0%E8%87%B3%E6%9C%AC%E5%9C%B0%E6%8A%A5%E8%A1%A8%EF%BC%8C%E5%BD%93%E5%89%8D%E6%80%BB%E6%95%B0%E6%8D%AE%E9%87%8F%EF%BC%9A%7Blen(merge_df)%7D%E6%9D%A1%5C%22)%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;def&amp;nbsp;crawl_all_reviews(item_id:&amp;nbsp;str):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;单商品全量评价抓取&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_clean_reviews&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw_data,&amp;nbsp;total&amp;nbsp;=&amp;nbsp;fetch_item_review(item_id,&amp;nbsp;page)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;raw_data:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clean_rows&amp;nbsp;=&amp;nbsp;parse_raw_review(raw_data,&amp;nbsp;item_id)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_clean_reviews.extend(clean_rows)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;当前页数据不足分页大小，说明已抓取完毕
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(raw_data)&amp;nbsp;&amp;lt;&amp;nbsp;PAGE_SIZE:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;+=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(1)&amp;nbsp;&amp;nbsp;#&amp;nbsp;分页间隔防限流
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;商品{item_id}抓取完成，本次获取{len(all_clean_reviews)}条评价&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;all_clean_reviews

def&amp;nbsp;save_to_excel(new_data:&amp;nbsp;list):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;合并新旧数据，去重后保存Excel&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_df&amp;nbsp;=&amp;nbsp;pd.DataFrame(new_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;读取历史报表
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;old_df&amp;nbsp;=&amp;nbsp;pd.read_excel(SAVE_EXCEL_PATH)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;merge_df&amp;nbsp;=&amp;nbsp;pd.concat([old_df,&amp;nbsp;new_df],&amp;nbsp;ignore_index=True)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;根据评价ID去重，保留最新数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;merge_df&amp;nbsp;=&amp;nbsp;merge_df.drop_duplicates(subset=[&amp;quot;评价ID&amp;quot;],&amp;nbsp;keep=&amp;quot;last&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;FileNotFoundError:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;文件不存在则新建
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;merge_df&amp;nbsp;=&amp;nbsp;new_df
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;按评价时间倒序排序
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;merge_df&amp;nbsp;=&amp;nbsp;merge_df.sort_values(by=&amp;quot;评价时间&amp;quot;,&amp;nbsp;ascending=False)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;merge_df.to_excel(SAVE_EXCEL_PATH,&amp;nbsp;index=False)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;数据已更新至本地报表，当前总数据量：{len(merge_df)}条&amp;quot;)&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;4.4 定时监控任务入口&lt;/h3&gt;&lt;p&gt;开启后台定时任务，自动循环监控所有目标商品：&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;4&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22def%20monitor_task()%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E5%AE%9A%E6%97%B6%E6%89%A7%E8%A1%8C%E7%9A%84%E7%9B%91%E6%8E%A7%E4%BB%BB%E5%8A%A1%5C%22%5C%22%5C%22%5Cn%20%20%20%20total_new_data%20%3D%20%5B%5D%5Cn%20%20%20%20for%20goods_id%20in%20MONITOR_ITEM_IDS%3A%5Cn%20%20%20%20%20%20%20%20review_data%20%3D%20crawl_all_reviews(goods_id)%5Cn%20%20%20%20%20%20%20%20total_new_data.extend(review_data)%5Cn%20%20%20%20if%20total_new_data%3A%5Cn%20%20%20%20%20%20%20%20save_to_excel(total_new_data)%5Cn%20%20%20%20%20%20%20%20%23%20%E7%AE%80%E6%98%93%E9%A2%84%E8%AD%A6%EF%BC%9A%E6%A3%80%E6%B5%8B%E6%96%B0%E5%A2%9E%E5%B7%AE%E8%AF%84%EF%BC%8C%E6%89%93%E5%8D%B0%E6%8F%90%E9%86%92%5Cn%20%20%20%20%20%20%20%20bad_comments%20%3D%20%5Bi%20for%20i%20in%20total_new_data%20if%20i%5B%5C%22%E6%83%85%E6%84%9F%E6%A0%87%E7%AD%BE%5C%22%5D%20%3D%3D%20%5C%22%E5%B7%AE%E8%AF%84%5C%22%5D%5Cn%20%20%20%20%20%20%20%20if%20bad_comments%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E2%9A%A0%EF%B8%8F%20%E6%A3%80%E6%B5%8B%E5%88%B0%E6%96%B0%E5%A2%9E%7Blen(bad_comments)%7D%E6%9D%A1%E5%B7%AE%E8%AF%84%EF%BC%8C%E8%AF%B7%E5%8F%8A%E6%97%B6%E6%9F%A5%E7%9C%8B%EF%BC%81%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20for%20bad%20in%20bad_comments%5B%3A3%5D%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E3%80%90%E5%B7%AE%E8%AF%84%E9%A2%84%E8%AD%A6%E3%80%91%7Bbad%5B&amp;#39;%E8%AF%84%E4%BB%B7%E6%97%B6%E9%97%B4&amp;#39;%5D%7D%20%7C%20%7Bbad%5B&amp;#39;%E8%AF%84%E4%BB%B7%E6%AD%A3%E6%96%87&amp;#39;%5D%5B%3A60%5D%7D%5C%22)%5Cn%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20%23%20%E9%A6%96%E6%AC%A1%E8%BF%90%E8%A1%8C%E7%AB%8B%E5%8D%B3%E6%8A%93%E5%8F%96%E4%B8%80%E6%AC%A1%E5%85%A8%E9%87%8F%E6%95%B0%E6%8D%AE%5Cn%20%20%20%20monitor_task()%5Cn%20%20%20%20%23%20%E5%90%AF%E5%8A%A8%E5%AE%9A%E6%97%B6%E8%B0%83%E5%BA%A6%E5%99%A8%5Cn%20%20%20%20scheduler%20%3D%20BackgroundScheduler()%5Cn%20%20%20%20scheduler.add_job(monitor_task%2C%20%5C%22interval%5C%22%2C%20hours%3DMONITOR_INTERVAL)%5Cn%20%20%20%20scheduler.start()%5Cn%20%20%20%20print(f%5C%22%E8%87%AA%E5%8A%A8%E7%9B%91%E6%8E%A7%E5%B7%B2%E5%90%AF%E5%8A%A8%EF%BC%8C%E6%AF%8F%7BMONITOR_INTERVAL%7D%E5%B0%8F%E6%97%B6%E8%87%AA%E5%8A%A8%E6%8A%93%E5%8F%96%E4%B8%80%E6%AC%A1%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE...%5C%22)%5Cn%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(3600)%5Cn%20%20%20%20except%20KeyboardInterrupt%3A%5Cn%20%20%20%20%20%20%20%20scheduler.shutdown()%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E7%9B%91%E6%8E%A7%E4%BB%BB%E5%8A%A1%E5%B7%B2%E5%81%9C%E6%AD%A2%5C%22)%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;def&amp;nbsp;monitor_task():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;定时执行的监控任务&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_new_data&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;goods_id&amp;nbsp;in&amp;nbsp;MONITOR_ITEM_IDS:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;review_data&amp;nbsp;=&amp;nbsp;crawl_all_reviews(goods_id)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_new_data.extend(review_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;total_new_data:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;save_to_excel(total_new_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;简易预警：检测新增差评，打印提醒
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bad_comments&amp;nbsp;=&amp;nbsp;[i&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;total_new_data&amp;nbsp;if&amp;nbsp;i[&amp;quot;情感标签&amp;quot;]&amp;nbsp;==&amp;nbsp;&amp;quot;差评&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;bad_comments:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;⚠️&amp;nbsp;检测到新增{len(bad_comments)}条差评，请及时查看！&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;bad&amp;nbsp;in&amp;nbsp;bad_comments[:3]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;【差评预警】{bad[&amp;#39;评价时间&amp;#39;]}&amp;nbsp;|&amp;nbsp;{bad[&amp;#39;评价正文&amp;#39;][:60]}&amp;quot;)

if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;首次运行立即抓取一次全量数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor_task()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;启动定时调度器
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scheduler&amp;nbsp;=&amp;nbsp;BackgroundScheduler()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scheduler.add_job(monitor_task,&amp;nbsp;&amp;quot;interval&amp;quot;,&amp;nbsp;hours=MONITOR_INTERVAL)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scheduler.start()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;自动监控已启动，每{MONITOR_INTERVAL}小时自动抓取一次评价数据...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(3600)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;KeyboardInterrupt:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scheduler.shutdown()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;监控任务已停止&amp;quot;)&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;五、代码功能拆解与业务落地说明&lt;/h2&gt;&lt;h3&gt;1. 增量监控与去重机制&lt;/h3&gt;&lt;p&gt;每次抓取完成后，脚本会读取本地历史 Excel 文件，通过&lt;code&gt;评价ID&lt;/code&gt;唯一标识自动剔除重复数据，仅保留最新新增评价，大幅减少重复存储、重复分析的资源消耗。&lt;/p&gt;&lt;h3&gt;2. 差评自动预警逻辑&lt;/h3&gt;&lt;p&gt;每次抓取结束自动筛选新增差评并打印控制台提醒，可二次扩展：接入钉钉 / 企业微信机器人，差评实时推送工作群，实现舆情快速响应。&lt;/p&gt;&lt;h3&gt;3. 多维度数据分析扩展思路&lt;/h3&gt;&lt;p&gt;基于导出的 Excel 结构化数据，可快速完成以下分析工作：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;痛点词统计&lt;/strong&gt;：使用 jieba 分词拆分差评文本，统计 “发货慢”“材质差”“尺寸不符” 等高频负面词汇，指导产品优化；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;竞品口碑对标&lt;/strong&gt;：多商品同时监控，对比同款产品好评率、差评类型，找到自身差异化优势；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;时间趋势分析&lt;/strong&gt;：按日期分组统计每日评价数量、差评占比，判断活动、上新后的口碑波动；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;图文评价专项分析&lt;/strong&gt;：筛选带晒图评价，分析买家实拍反馈，优化商品主图、详情页。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;4. 数据库存储改造（进阶）&lt;/h3&gt;&lt;p&gt;如果需要长期海量存储，可替换&lt;code&gt;save_to_excel&lt;/code&gt;函数，接入 MySQL 存储数据，示例核心写入逻辑：&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;5&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20pymysql%5Cndef%20save_to_mysql(data_list)%3A%5Cn%20%20%20%20conn%20%3D%20pymysql.connect(host%3D%5C%22127.0.0.1%5C%22%2C%20user%3D%5C%22root%5C%22%2C%20password%3D%5C%22%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AF%86%E7%A0%81%5C%22%2C%20database%3D%5C%22taobao_review%5C%22)%5Cn%20%20%20%20cursor%20%3D%20conn.cursor()%5Cn%20%20%20%20insert_sql%20%3D%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20INSERT%20INTO%20goods_review%20(item_id%2C%20review_id%2C%20create_time%2C%20nick%2C%20sku%2C%20content%2C%20rate%2C%20has_pic%2C%20is_add%2C%20sentiment%2C%20score)%5Cn%20%20%20%20VALUES%20(%25s%2C%20%25s%2C%20%25s%2C%20%25s%2C%20%25s%2C%20%25s%2C%20%25s%2C%20%25s%2C%20%25s%2C%20%25s%2C%20%25s)%5Cn%20%20%20%20ON%20DUPLICATE%20KEY%20UPDATE%20content%3DVALUES(content)%5Cn%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20for%20row%20in%20data_list%3A%5Cn%20%20%20%20%20%20%20%20cursor.execute(insert_sql%2C%20(%5Cn%20%20%20%20%20%20%20%20%20%20%20%20row%5B%5C%22%E5%95%86%E5%93%81ID%5C%22%5D%2C%20row%5B%5C%22%E8%AF%84%E4%BB%B7ID%5C%22%5D%2C%20row%5B%5C%22%E8%AF%84%E4%BB%B7%E6%97%B6%E9%97%B4%5C%22%5D%2C%20row%5B%5C%22%E4%B9%B0%E5%AE%B6%E6%98%B5%E7%A7%B0%5C%22%5D%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20row%5B%5C%22%E8%B4%AD%E4%B9%B0%E8%A7%84%E6%A0%BCSKU%5C%22%5D%2C%20row%5B%5C%22%E8%AF%84%E4%BB%B7%E6%AD%A3%E6%96%87%5C%22%5D%2C%20row%5B%5C%22%E6%98%9F%E7%BA%A7%E8%AF%84%E5%88%86%5C%22%5D%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20row%5B%5C%22%E6%98%AF%E5%90%A6%E6%99%92%E5%9B%BE%5C%22%5D%2C%20row%5B%5C%22%E6%98%AF%E5%90%A6%E8%BF%BD%E8%AF%84%5C%22%5D%2C%20row%5B%5C%22%E6%83%85%E6%84%9F%E6%A0%87%E7%AD%BE%5C%22%5D%2C%20row%5B%5C%22%E6%83%85%E6%84%9F%E5%88%86%E6%95%B0%5C%22%5D%5Cn%20%20%20%20%20%20%20%20))%5Cn%20%20%20%20conn.commit()%5Cn%20%20%20%20cursor.close()%5Cn%20%20%20%20conn.close()%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;pymysql
def&amp;nbsp;save_to_mysql(data_list):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn&amp;nbsp;=&amp;nbsp;pymysql.connect(host=&amp;quot;127.0.0.1&amp;quot;,&amp;nbsp;user=&amp;quot;root&amp;quot;,&amp;nbsp;password=&amp;quot;数据库密码&amp;quot;,&amp;nbsp;database=&amp;quot;taobao_review&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor&amp;nbsp;=&amp;nbsp;conn.cursor()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;insert_sql&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INSERT&amp;nbsp;INTO&amp;nbsp;goods_review&amp;nbsp;(item_id,&amp;nbsp;review_id,&amp;nbsp;create_time,&amp;nbsp;nick,&amp;nbsp;sku,&amp;nbsp;content,&amp;nbsp;rate,&amp;nbsp;has_pic,&amp;nbsp;is_add,&amp;nbsp;sentiment,&amp;nbsp;score)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VALUES&amp;nbsp;(%s,&amp;nbsp;%s,&amp;nbsp;%s,&amp;nbsp;%s,&amp;nbsp;%s,&amp;nbsp;%s,&amp;nbsp;%s,&amp;nbsp;%s,&amp;nbsp;%s,&amp;nbsp;%s,&amp;nbsp;%s)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ON&amp;nbsp;DUPLICATE&amp;nbsp;KEY&amp;nbsp;UPDATE&amp;nbsp;content=VALUES(content)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;row&amp;nbsp;in&amp;nbsp;data_list:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor.execute(insert_sql,&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;row[&amp;quot;商品ID&amp;quot;],&amp;nbsp;row[&amp;quot;评价ID&amp;quot;],&amp;nbsp;row[&amp;quot;评价时间&amp;quot;],&amp;nbsp;row[&amp;quot;买家昵称&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;row[&amp;quot;购买规格SKU&amp;quot;],&amp;nbsp;row[&amp;quot;评价正文&amp;quot;],&amp;nbsp;row[&amp;quot;星级评分&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;row[&amp;quot;是否晒图&amp;quot;],&amp;nbsp;row[&amp;quot;是否追评&amp;quot;],&amp;nbsp;row[&amp;quot;情感标签&amp;quot;],&amp;nbsp;row[&amp;quot;情感分数&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.commit()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.close()&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;六、实战避坑指南&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;密钥权限问题&lt;/strong&gt; 密钥仅绑定个人账号，不要泄露，若请求返回权限不足提示，重新登录后台核对密钥，海外注册账号同样支持正常调取数据。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;抓取频率控制&lt;/strong&gt; 代码内置分页 1 秒延迟，定时任务建议最低 1 小时抓取一次，短时间高频请求会触发访问限制，导致数据拉取失败。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;情感分析误差优化&lt;/strong&gt; SnowNLP 基础分词对电商口语、网络梗识别存在少量偏差，高精度需求可替换哈工大 LTP、百度 AI 文本情感接口，提升正负向判断准确率。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;大批量商品监控优化&lt;/strong&gt; 同时监控 10 款以上商品时，可改用异步&lt;code&gt;httpx&lt;/code&gt;并发请求，缩短整体抓取耗时。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;七、总结&lt;/h2&gt;&lt;p&gt;传统自研爬虫做商品评价监控，要解决反爬、代理、数据结构化、定时调度等多重难题，开发和维护成本极高。借助 OpenClaw 标准化数据采集能力，仅用百行 Python 代码即可搭建一套完整口碑监控系统，实现&lt;strong&gt;自动采集 - 清洗 - 分析 - 存储 - 预警&lt;/strong&gt;全流程自动化。&lt;/p&gt;&lt;p&gt;无论是店铺运营实时盯自己商品差评，还是竞品调研批量对标用户反馈，这套方案都能大幅降低人工成本，把零散的评价转化为可量化、可落地的产品优化、运营决策数据，新手复制代码修改配置即可直接投入使用。&lt;/p&gt;&lt;p&gt;&lt;span data-cke-copybin-end=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 28 Jul 2026 17:38:04 +0800</pubDate></item><item><title>低成本搭建电商口碑监控体系：7×24 小时商品评论采集 + 情感分析完整实战（附 Python 源码）</title><link>https://shopapi.com.cn/?id=203</link><description>&lt;p&gt;&lt;span data-cke-copybin-start=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;前言&lt;/h2&gt;&lt;p&gt;做电商运营、产品调研、竞品分析的同学基本都有同一个痛点：想要持续追踪商品真实用户反馈，靠手动复制评论、导出后台表格效率极低；自己写页面抓取脚本又频繁遇到平台拦截、页面改版失效、代理池维护成本高等问题。&lt;/p&gt;&lt;p&gt;传统方案要么受平台后台导出条数限制，要么需要投入大量服务器资源维持稳定采集，中小团队、个人开发者很难落地长效监控。本文分享一套基于 OpenClaw 轻量化数据能力的完整落地方案，不用逆向解析页面、不用搭建代理集群，仅通过简单代码即可实现商品全量评论拉取、增量实时监控、口碑情感统计，从数据同步、清洗存储到痛点挖掘一站式完成，复制代码就能直接运行，适配淘宝 / 天猫全品类商品调研场景。&lt;/p&gt;&lt;h2&gt;一、方案整体能力拆解&lt;/h2&gt;&lt;p&gt;整套流程分为四大核心模块，普通笔记本或低配云服务器就能稳定运行，无复杂分布式部署门槛：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;全维度数据同步&lt;/strong&gt; 输入商品唯一标识即可批量拉取完整评论信息，覆盖用户评分、评价正文、晒图链接、追评内容、购买规格、评价时间、互动点赞数等全维度信息，支持按最新评价分页循环采集，一次性获取商品全部历史反馈。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;增量实时监控&lt;/strong&gt; 依靠评论唯一标识自动完成数据去重，设置定时循环任务后仅抓取新增评价，大幅减少重复请求资源消耗，实现 7×24 小时不间断口碑监测，一旦出现新增差评可快速识别预警。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;标准化数据清洗存储&lt;/strong&gt; 自动过滤空白无效评价、统一时间与图文链接格式，规整尺码 / 颜色规格字段，小型项目可存入 CSV 表格，长期大批量监控可对接 SQLite 本地数据库，方便后续反复调取分析。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;智能口碑分析挖掘&lt;/strong&gt; 通过分词与情感判别区分好评、中评、差评，统计负面高频痛点词汇，输出商品评分分布、口碑变化趋势，快速定位产品品控、包装、使用体验等核心问题，同时对比不同规格商品用户反馈差异。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;二、前期基础配置步骤&lt;/h2&gt;&lt;h3&gt;2.1 平台账号权限开通&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;登录数据服务控制台完成实名认证，创建个人项目获取&lt;span aria-label=&quot;a 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_inline cke_widget_csdnlink cke_widget_wrapper_link-info cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;a&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;4&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;link-info cke_widget_editable cke_widget_element&quot; contenteditable=&quot;true&quot; data-cke-enter-mode=&quot;2&quot; data-cke-widget-data=&quot;%7B%22url%22%3A%22https%3A%2F%2Fo0b.cn%2Ficris%22%2C%22text%22%3A%22%E4%B8%93%E5%B1%9E%E8%AE%BF%E9%97%AE%E5%87%AD%E8%AF%81%22%2C%22desc%22%3A%22%22%2C%22icon%22%3A%22%22%2C%22isCard%22%3Afalse%2C%22hasResquest%22%3Atrue%2C%22iconDefault%22%3A%22https%3A%2F%2Fcsdnimg.cn%2Frelease%2Fblog_editor_html%2Frelease2.4.6%2Fckeditor%2Fplugins%2FCsdnLink%2Ficons%2Ficon-default.png%3Ft%3DQ239%22%2C%22id%22%3A%225Di0YJ-1785052637738%22%2C%22classes%22%3A%7B%22link-info%22%3A1%7D%7D&quot; data-cke-widget-editable=&quot;text&quot; data-cke-widget-keep-attr=&quot;0&quot; data-link-icon=&quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=Q239&quot; data-link-title=&quot;专属访问凭证&quot; data-widget=&quot;csdnlink&quot; href=&quot;https://o0b.cn/icris&quot; title=&quot;专属访问凭证&quot;&gt;&lt;strong&gt;专属访问凭证&lt;/strong&gt;&lt;/a&gt;&lt;/span&gt;两组字符串（密钥标识、安全密钥）；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;在项目权限面板开启商品评价数据读取权限，无需额外申请平台类目权限，全品类商品均可调取；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;本地安装 Python 运行环境，提前安装依赖工具包，执行安装命令：&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;0&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22pip%20install%20requests%20pandas%20jieba%20wordcloud%20matplotlib%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;pip&amp;nbsp;install&amp;nbsp;requests&amp;nbsp;pandas&amp;nbsp;jieba&amp;nbsp;wordcloud&amp;nbsp;matplotlib&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;2.2 核心采集参数说明&lt;/h3&gt;&lt;p&gt;程序运行仅需两类必填信息：目标商品 ID、单次读取条数，同时支持可选配置：读取页码、排序规则（最新评价优先 / 最热评价优先）、是否同步拉取晒图地址。 返回结构化数据包含核心字段：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;基础信息：评价发布时间、脱敏买家昵称、星级评分、评价唯一编号&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;内容信息：主评文字、追评文字、晒图链接数组、对应购买 SKU 规格&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;互动数据：评价点赞数、商家回复内容、是否带图标识&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;三、完整可运行 Python 代码实战&lt;/h2&gt;&lt;h3&gt;3.1 基础评论批量采集代码（分页全量拉取）&lt;/h3&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;1&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20requests%5Cnimport%20pandas%20as%20pd%5Cnimport%20time%5Cn%5Cn%23%20%E6%9B%BF%E6%8D%A2%E4%B8%BA%E8%87%AA%E5%B7%B1%E6%8E%A7%E5%88%B6%E5%8F%B0%E8%8E%B7%E5%8F%96%E7%9A%84%E5%87%AD%E8%AF%81%5CnACCESS_KEY%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E5%AF%86%E9%92%A5%E6%A0%87%E8%AF%86%5C%22%5CnACCESS_SECRET%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E5%AE%89%E5%85%A8%E5%AF%86%E9%92%A5%5C%22%5CnTARGET_ITEM_ID%20%3D%20%5C%22%E7%9B%AE%E6%A0%87%E5%95%86%E5%93%81ID%5C%22%5CnPAGE_SIZE%20%3D%2020%20%20%23%20%E5%8D%95%E9%A1%B5%E8%AF%BB%E5%8F%96%E6%9D%A1%E6%95%B0%5Cn%5Cndef%20get_item_review(page)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E8%8E%B7%E5%8F%96%E5%8D%95%E9%A1%B5%E5%95%86%E5%93%81%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE%5C%22%5C%22%5C%22%5Cn%20%20%20%20params%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22key%5C%22%3A%20ACCESS_KEY%2C%5Cn%20%20%20%20%20%20%20%20%5C%22secret%5C%22%3A%20ACCESS_SECRET%2C%5Cn%20%20%20%20%20%20%20%20%5C%22item_id%5C%22%3A%20TARGET_ITEM_ID%2C%5Cn%20%20%20%20%20%20%20%20%5C%22page%5C%22%3A%20page%2C%5Cn%20%20%20%20%20%20%20%20%5C%22page_size%5C%22%3A%20PAGE_SIZE%2C%5Cn%20%20%20%20%20%20%20%20%5C%22sort%5C%22%3A%20%5C%22new%5C%22%20%20%23%20new%3D%E6%9C%80%E6%96%B0%E8%AF%84%E4%BB%B7%20hot%3D%E7%83%AD%E9%97%A8%E8%AF%84%E4%BB%B7%5Cn%20%20%20%20%7D%5Cn%20%20%20%20%23%20%E7%BB%9F%E4%B8%80%E6%95%B0%E6%8D%AE%E8%AF%B7%E6%B1%82%E9%80%9A%E9%81%93%5Cn%20%20%20%20resp%20%3D%20requests.get(%5C%22https%3A%2F%2Fdata-claw-gateway.com%2Ftmall%2Freview%5C%22%2C%20params%3Dparams)%5Cn%20%20%20%20res_data%20%3D%20resp.json()%5Cn%20%20%20%20return%20res_data%5Cn%5Cndef%20batch_crawl_all_reviews()%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E5%BE%AA%E7%8E%AF%E5%88%86%E9%A1%B5%E9%87%87%E9%9B%86%E5%85%A8%E9%83%A8%E8%AF%84%E4%BB%B7%5C%22%5C%22%5C%22%5Cn%20%20%20%20all_review_list%20%3D%20%5B%5D%5Cn%20%20%20%20page_num%20%3D%201%5Cn%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E6%AD%A3%E5%9C%A8%E9%87%87%E9%9B%86%E7%AC%AC%7Bpage_num%7D%E9%A1%B5%E8%AF%84%E4%BB%B7...%5C%22)%5Cn%20%20%20%20%20%20%20%20result%20%3D%20get_item_review(page_num)%5Cn%20%20%20%20%20%20%20%20%23%20%E5%88%A4%E6%96%AD%E6%95%B0%E6%8D%AE%E6%98%AF%E5%90%A6%E8%BF%94%E5%9B%9E%E6%AD%A3%E5%B8%B8%5Cn%20%20%20%20%20%20%20%20if%20result.get(%5C%22code%5C%22)%20!%3D%200%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(%5C%22%E6%95%B0%E6%8D%AE%E8%AF%BB%E5%8F%96%E5%BC%82%E5%B8%B8%EF%BC%9A%5C%22%2C%20result.get(%5C%22msg%5C%22))%5Cn%20%20%20%20%20%20%20%20%20%20%20%20break%5Cn%20%20%20%20%20%20%20%20page_data%20%3D%20result.get(%5C%22data%5C%22%2C%20%7B%7D)%5Cn%20%20%20%20%20%20%20%20review_items%20%3D%20page_data.get(%5C%22item%5C%22%2C%20%5B%5D)%5Cn%20%20%20%20%20%20%20%20if%20not%20review_items%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(%5C%22%E6%89%80%E6%9C%89%E8%AF%84%E4%BB%B7%E9%87%87%E9%9B%86%E5%AE%8C%E6%88%90%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20break%5Cn%20%20%20%20%20%20%20%20%23%20%E7%BB%93%E6%9E%84%E5%8C%96%E6%8F%90%E5%8F%96%E9%9C%80%E8%A6%81%E7%9A%84%E5%AD%97%E6%AE%B5%5Cn%20%20%20%20%20%20%20%20for%20item%20in%20review_items%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20temp_dict%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E8%AF%84%E4%BB%B7ID%5C%22%3A%20item.get(%5C%22rate_id%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E8%AF%84%E4%BB%B7%E6%97%B6%E9%97%B4%5C%22%3A%20item.get(%5C%22rate_date%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E4%B9%B0%E5%AE%B6%E6%98%B5%E7%A7%B0%5C%22%3A%20item.get(%5C%22display_user_nick%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E5%95%86%E5%93%81%E8%A7%84%E6%A0%BC%5C%22%3A%20item.get(%5C%22auction_sku%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E6%98%9F%E7%BA%A7%E8%AF%84%E5%88%86%5C%22%3A%20item.get(%5C%22user_star%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E4%B8%BB%E8%AF%84%E5%86%85%E5%AE%B9%5C%22%3A%20item.get(%5C%22rate_content%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E8%BF%BD%E8%AF%84%E5%86%85%E5%AE%B9%5C%22%3A%20item.get(%5C%22add_feedback%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E6%99%92%E5%9B%BE%E9%93%BE%E6%8E%A5%5C%22%3A%20item.get(%5C%22pics%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E7%82%B9%E8%B5%9E%E6%95%B0%5C%22%3A%20item.get(%5C%22like_count%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20%20%20%20all_review_list.append(temp_dict)%5Cn%20%20%20%20%20%20%20%20page_num%20%2B%3D%201%5Cn%20%20%20%20%20%20%20%20time.sleep(1.2)%20%20%23%20%E9%97%B4%E9%9A%94%E5%BB%B6%E8%BF%9F%EF%BC%8C%E9%81%BF%E5%85%8D%E9%AB%98%E9%A2%91%E8%AF%B7%E6%B1%82%E9%99%90%E5%88%B6%5Cn%20%20%20%20%23%20%E4%BF%9D%E5%AD%98%E8%87%B3%E6%9C%AC%E5%9C%B0%E8%A1%A8%E6%A0%BC%5Cn%20%20%20%20df%20%3D%20pd.DataFrame(all_review_list)%5Cn%20%20%20%20df.to_csv(f%5C%22%E5%95%86%E5%93%81%E8%AF%84%E4%BB%B7_%7BTARGET_ITEM_ID%7D.csv%5C%22%2C%20index%3DFalse%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20print(f%5C%22%E5%85%B1%E9%87%87%E9%9B%86%7Blen(all_review_list)%7D%E6%9D%A1%E8%AF%84%E4%BB%B7%EF%BC%8C%E6%96%87%E4%BB%B6%E5%B7%B2%E4%BF%9D%E5%AD%98%5C%22)%5Cn%20%20%20%20return%20df%5Cn%5Cn%23%20%E6%89%A7%E8%A1%8C%E5%85%A8%E9%87%8F%E9%87%87%E9%9B%86%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20review_df%20%3D%20batch_crawl_all_reviews()%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;requests
import&amp;nbsp;pandas&amp;nbsp;as&amp;nbsp;pd
import&amp;nbsp;time

#&amp;nbsp;替换为自己控制台获取的凭证
ACCESS_KEY&amp;nbsp;=&amp;nbsp;&amp;quot;你的密钥标识&amp;quot;
ACCESS_SECRET&amp;nbsp;=&amp;nbsp;&amp;quot;你的安全密钥&amp;quot;
TARGET_ITEM_ID&amp;nbsp;=&amp;nbsp;&amp;quot;目标商品ID&amp;quot;
PAGE_SIZE&amp;nbsp;=&amp;nbsp;20&amp;nbsp;&amp;nbsp;#&amp;nbsp;单页读取条数

def&amp;nbsp;get_item_review(page):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;获取单页商品评价数据&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;key&amp;quot;:&amp;nbsp;ACCESS_KEY,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;secret&amp;quot;:&amp;nbsp;ACCESS_SECRET,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;item_id&amp;quot;:&amp;nbsp;TARGET_ITEM_ID,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page_size&amp;quot;:&amp;nbsp;PAGE_SIZE,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sort&amp;quot;:&amp;nbsp;&amp;quot;new&amp;quot;&amp;nbsp;&amp;nbsp;#&amp;nbsp;new=最新评价&amp;nbsp;hot=热门评价
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;统一数据请求通道
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.get(&amp;quot;https://data-claw-gateway.com/tmall/review&amp;quot;,&amp;nbsp;params=params)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res_data&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;res_data

def&amp;nbsp;batch_crawl_all_reviews():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;循环分页采集全部评价&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_review_list&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page_num&amp;nbsp;=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;正在采集第{page_num}页评价...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;get_item_review(page_num)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;判断数据是否返回正常
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;result.get(&amp;quot;code&amp;quot;)&amp;nbsp;!=&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;数据读取异常：&amp;quot;,&amp;nbsp;result.get(&amp;quot;msg&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page_data&amp;nbsp;=&amp;nbsp;result.get(&amp;quot;data&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;review_items&amp;nbsp;=&amp;nbsp;page_data.get(&amp;quot;item&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;review_items:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;所有评价采集完成&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;结构化提取需要的字段
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;review_items:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp_dict&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;评价ID&amp;quot;:&amp;nbsp;item.get(&amp;quot;rate_id&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;评价时间&amp;quot;:&amp;nbsp;item.get(&amp;quot;rate_date&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;买家昵称&amp;quot;:&amp;nbsp;item.get(&amp;quot;display_user_nick&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;商品规格&amp;quot;:&amp;nbsp;item.get(&amp;quot;auction_sku&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;星级评分&amp;quot;:&amp;nbsp;item.get(&amp;quot;user_star&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;主评内容&amp;quot;:&amp;nbsp;item.get(&amp;quot;rate_content&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;追评内容&amp;quot;:&amp;nbsp;item.get(&amp;quot;add_feedback&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;晒图链接&amp;quot;:&amp;nbsp;item.get(&amp;quot;pics&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;点赞数&amp;quot;:&amp;nbsp;item.get(&amp;quot;like_count&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_review_list.append(temp_dict)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page_num&amp;nbsp;+=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(1.2)&amp;nbsp;&amp;nbsp;#&amp;nbsp;间隔延迟，避免高频请求限制
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;保存至本地表格
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;pd.DataFrame(all_review_list)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df.to_csv(f&amp;quot;商品评价_{TARGET_ITEM_ID}.csv&amp;quot;,&amp;nbsp;index=False,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;共采集{len(all_review_list)}条评价，文件已保存&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;df

#&amp;nbsp;执行全量采集
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;review_df&amp;nbsp;=&amp;nbsp;batch_crawl_all_reviews()&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;3.2 增量监控 + 差评预警代码（7×24 小时定时轮询）&lt;/h3&gt;&lt;p&gt;基于已采集历史评价 ID 做去重，仅捕获新增反馈，新增差评自动打印提醒：&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;2&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20requests%5Cnimport%20pandas%20as%20pd%5Cnimport%20time%5Cn%5CnACCESS_KEY%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E5%AF%86%E9%92%A5%E6%A0%87%E8%AF%86%5C%22%5CnACCESS_SECRET%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E5%AE%89%E5%85%A8%E5%AF%86%E9%92%A5%5C%22%5CnTARGET_ITEM_ID%20%3D%20%5C%22%E7%9B%AE%E6%A0%87%E5%95%86%E5%93%81ID%5C%22%5Cn%23%20%E5%AD%98%E5%82%A8%E5%B7%B2%E9%87%87%E9%9B%86%E8%AF%84%E4%BB%B7ID%EF%BC%8C%E7%94%A8%E4%BA%8E%E5%A2%9E%E9%87%8F%E5%88%A4%E6%96%AD%5Cnhistory_id_set%20%3D%20set()%5Cn%5Cndef%20get_new_review()%3A%5Cn%20%20%20%20params%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22key%5C%22%3A%20ACCESS_KEY%2C%5Cn%20%20%20%20%20%20%20%20%5C%22secret%5C%22%3A%20ACCESS_SECRET%2C%5Cn%20%20%20%20%20%20%20%20%5C%22item_id%5C%22%3A%20TARGET_ITEM_ID%2C%5Cn%20%20%20%20%20%20%20%20%5C%22page%5C%22%3A%201%2C%5Cn%20%20%20%20%20%20%20%20%5C%22page_size%5C%22%3A%2050%2C%5Cn%20%20%20%20%20%20%20%20%5C%22sort%5C%22%3A%20%5C%22new%5C%22%5Cn%20%20%20%20%7D%5Cn%20%20%20%20resp%20%3D%20requests.get(%5C%22https%3A%2F%2Fdata-claw-gateway.com%2Ftmall%2Freview%5C%22%2C%20params%3Dparams)%5Cn%20%20%20%20res%20%3D%20resp.json()%5Cn%20%20%20%20if%20res.get(%5C%22code%5C%22)%20!%3D%200%3A%5Cn%20%20%20%20%20%20%20%20return%20%5B%5D%5Cn%20%20%20%20items%20%3D%20res.get(%5C%22data%5C%22%2C%20%7B%7D).get(%5C%22item%5C%22%2C%20%5B%5D)%5Cn%20%20%20%20new_reviews%20%3D%20%5B%5D%5Cn%20%20%20%20for%20item%20in%20items%3A%5Cn%20%20%20%20%20%20%20%20rid%20%3D%20item.get(%5C%22rate_id%5C%22)%5Cn%20%20%20%20%20%20%20%20if%20rid%20not%20in%20history_id_set%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20history_id_set.add(rid)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20new_reviews.append(item)%5Cn%20%20%20%20return%20new_reviews%5Cn%5Cndef%20monitor_loop()%3A%5Cn%20%20%20%20print(%5C%22%E5%90%AF%E5%8A%A8%E5%AE%9E%E6%97%B6%E5%8F%A3%E7%A2%91%E7%9B%91%E6%8E%A7%EF%BC%8C%E6%AF%8F10%E5%88%86%E9%92%9F%E8%BD%AE%E8%AF%A2%E4%B8%80%E6%AC%A1...%5C%22)%5Cn%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20new_data%20%3D%20get_new_review()%5Cn%20%20%20%20%20%20%20%20if%20new_data%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%3D%3D%3D%3D%E6%A3%80%E6%B5%8B%E5%88%B0%7Blen(new_data)%7D%E6%9D%A1%E6%96%B0%E5%A2%9E%E8%AF%84%E4%BB%B7%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20for%20review%20in%20new_data%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20score%20%3D%20review.get(%5C%22user_star%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20content%20%3D%20review.get(%5C%22rate_content%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sku%20%3D%20review.get(%5C%22auction_sku%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E4%BD%8E%E5%88%86%E5%88%A4%E5%AE%9A%E5%B7%AE%E8%AF%84%E9%A2%84%E8%AD%A6%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20int(score)%20%3C%3D%203%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E3%80%90%E5%B7%AE%E8%AF%84%E9%A2%84%E8%AD%A6%E3%80%91%E8%A7%84%E6%A0%BC%EF%BC%9A%7Bsku%7D%20%7C%20%E8%AF%84%E5%88%86%EF%BC%9A%7Bscore%7D%E5%88%86%20%7C%20%E5%86%85%E5%AE%B9%EF%BC%9A%7Bcontent%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%BF%BD%E5%8A%A0%E5%86%99%E5%85%A5%E6%9C%AC%E5%9C%B0%E8%A1%A8%E6%A0%BC%5Cn%20%20%20%20%20%20%20%20%20%20%20%20df_new%20%3D%20pd.DataFrame(%5B%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E8%AF%84%E4%BB%B7ID%5C%22%3A%20i.get(%5C%22rate_id%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E8%AF%84%E4%BB%B7%E6%97%B6%E9%97%B4%5C%22%3A%20i.get(%5C%22rate_date%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E5%95%86%E5%93%81%E8%A7%84%E6%A0%BC%5C%22%3A%20i.get(%5C%22auction_sku%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E6%98%9F%E7%BA%A7%E8%AF%84%E5%88%86%5C%22%3A%20i.get(%5C%22user_star%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E4%B8%BB%E8%AF%84%E5%86%85%E5%AE%B9%5C%22%3A%20i.get(%5C%22rate_content%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E8%BF%BD%E8%AF%84%E5%86%85%E5%AE%B9%5C%22%3A%20i.get(%5C%22add_feedback%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%7D%20for%20i%20in%20new_data%5D)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20df_new.to_csv(f%5C%22%E7%9B%91%E6%8E%A7%E5%A2%9E%E9%87%8F%E8%AF%84%E4%BB%B7_%7BTARGET_ITEM_ID%7D.csv%5C%22%2C%20mode%3D%5C%22a%5C%22%2C%20header%3DFalse%2C%20index%3DFalse%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20%20%20%20%20time.sleep(600)%20%20%23%2010%E5%88%86%E9%92%9F%E8%BD%AE%E8%AF%A2%E9%97%B4%E9%9A%94%5Cn%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20monitor_loop()%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;requests
import&amp;nbsp;pandas&amp;nbsp;as&amp;nbsp;pd
import&amp;nbsp;time

ACCESS_KEY&amp;nbsp;=&amp;nbsp;&amp;quot;你的密钥标识&amp;quot;
ACCESS_SECRET&amp;nbsp;=&amp;nbsp;&amp;quot;你的安全密钥&amp;quot;
TARGET_ITEM_ID&amp;nbsp;=&amp;nbsp;&amp;quot;目标商品ID&amp;quot;
#&amp;nbsp;存储已采集评价ID，用于增量判断
history_id_set&amp;nbsp;=&amp;nbsp;set()

def&amp;nbsp;get_new_review():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;key&amp;quot;:&amp;nbsp;ACCESS_KEY,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;secret&amp;quot;:&amp;nbsp;ACCESS_SECRET,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;item_id&amp;quot;:&amp;nbsp;TARGET_ITEM_ID,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;1,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page_size&amp;quot;:&amp;nbsp;50,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sort&amp;quot;:&amp;nbsp;&amp;quot;new&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.get(&amp;quot;https://data-claw-gateway.com/tmall/review&amp;quot;,&amp;nbsp;params=params)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;res.get(&amp;quot;code&amp;quot;)&amp;nbsp;!=&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;items&amp;nbsp;=&amp;nbsp;res.get(&amp;quot;data&amp;quot;,&amp;nbsp;{}).get(&amp;quot;item&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_reviews&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;items:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rid&amp;nbsp;=&amp;nbsp;item.get(&amp;quot;rate_id&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;rid&amp;nbsp;not&amp;nbsp;in&amp;nbsp;history_id_set:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;history_id_set.add(rid)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_reviews.append(item)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new_reviews

def&amp;nbsp;monitor_loop():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;启动实时口碑监控，每10分钟轮询一次...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_data&amp;nbsp;=&amp;nbsp;get_new_review()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;new_data:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;====检测到{len(new_data)}条新增评价====&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;review&amp;nbsp;in&amp;nbsp;new_data:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;score&amp;nbsp;=&amp;nbsp;review.get(&amp;quot;user_star&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content&amp;nbsp;=&amp;nbsp;review.get(&amp;quot;rate_content&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sku&amp;nbsp;=&amp;nbsp;review.get(&amp;quot;auction_sku&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;低分判定差评预警
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;int(score)&amp;nbsp;&amp;lt;=&amp;nbsp;3:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;【差评预警】规格：{sku}&amp;nbsp;|&amp;nbsp;评分：{score}分&amp;nbsp;|&amp;nbsp;内容：{content}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;追加写入本地表格
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_new&amp;nbsp;=&amp;nbsp;pd.DataFrame([{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;评价ID&amp;quot;:&amp;nbsp;i.get(&amp;quot;rate_id&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;评价时间&amp;quot;:&amp;nbsp;i.get(&amp;quot;rate_date&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;商品规格&amp;quot;:&amp;nbsp;i.get(&amp;quot;auction_sku&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;星级评分&amp;quot;:&amp;nbsp;i.get(&amp;quot;user_star&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;主评内容&amp;quot;:&amp;nbsp;i.get(&amp;quot;rate_content&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;追评内容&amp;quot;:&amp;nbsp;i.get(&amp;quot;add_feedback&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;new_data])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_new.to_csv(f&amp;quot;监控增量评价_{TARGET_ITEM_ID}.csv&amp;quot;,&amp;nbsp;mode=&amp;quot;a&amp;quot;,&amp;nbsp;header=False,&amp;nbsp;index=False,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(600)&amp;nbsp;&amp;nbsp;#&amp;nbsp;10分钟轮询间隔

if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor_loop()&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;3.3 评论情感与关键词分析代码（痛点挖掘）&lt;/h3&gt;&lt;p&gt;对采集后的表格数据做分词、词频统计、评分分布可视化，快速提炼用户核心诉求：&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;3&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20pandas%20as%20pd%5Cnimport%20jieba%5Cnfrom%20collections%20import%20Counter%5Cnimport%20matplotlib.pyplot%20as%20plt%5Cn%5Cnplt.rcParams%5B%5C%22font.sans-serif%5C%22%5D%20%3D%20%5B%5C%22SimHei%5C%22%5D%5Cnplt.rcParams%5B%5C%22axes.unicode_minus%5C%22%5D%20%3D%20False%5Cn%5Cn%23%20%E8%AF%BB%E5%8F%96%E9%87%87%E9%9B%86%E5%A5%BD%E7%9A%84%E8%AF%84%E4%BB%B7%E8%A1%A8%E6%A0%BC%5Cndf%20%3D%20pd.read_csv(f%5C%22%E5%95%86%E5%93%81%E8%AF%84%E4%BB%B7_%7BTARGET_ITEM_ID%7D.csv%5C%22%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%5Cn%23%201.%20%E6%98%9F%E7%BA%A7%E8%AF%84%E5%88%86%E5%88%86%E5%B8%83%E7%BB%9F%E8%AE%A1%5Cnscore_count%20%3D%20df%5B%5C%22%E6%98%9F%E7%BA%A7%E8%AF%84%E5%88%86%5C%22%5D.value_counts().sort_index()%5Cnplt.figure(figsize%3D(8%2C4))%5Cnscore_count.plot(kind%3D%5C%22bar%5C%22%2C%20color%3D%5C%22%23409EFF%5C%22)%5Cnplt.title(%5C%22%E5%95%86%E5%93%81%E6%98%9F%E7%BA%A7%E8%AF%84%E5%88%86%E5%88%86%E5%B8%83%5C%22)%5Cnplt.xlabel(%5C%22%E6%98%9F%E7%BA%A7%5C%22)%5Cnplt.ylabel(%5C%22%E8%AF%84%E4%BB%B7%E6%95%B0%E9%87%8F%5C%22)%5Cnplt.savefig(%5C%22%E8%AF%84%E5%88%86%E5%88%86%E5%B8%83%E5%9B%BE%E8%A1%A8.png%5C%22)%5Cn%5Cn%23%202.%20%E5%B7%AE%E8%AF%84%E9%AB%98%E9%A2%91%E5%85%B3%E9%94%AE%E8%AF%8D%E6%8F%90%E5%8F%96%5Cnbad_comment%20%3D%20df%5Bdf%5B%5C%22%E6%98%9F%E7%BA%A7%E8%AF%84%E5%88%86%5C%22%5D%20%3C%3D%203%5D%5B%5C%22%E4%B8%BB%E8%AF%84%E5%86%85%E5%AE%B9%5C%22%5D.dropna().str.cat(sep%3D%5C%22%20%5C%22)%5Cnstop_words%20%3D%20%7B%5C%22%E7%9A%84%5C%22%2C%20%5C%22%E4%BA%86%5C%22%2C%20%5C%22%E5%BE%88%5C%22%2C%20%5C%22%E6%9C%89%E7%82%B9%5C%22%2C%20%5C%22%E8%BF%98%5C%22%2C%20%5C%22%E4%BD%86%E6%98%AF%5C%22%2C%20%5C%22%E5%B0%B1%E6%98%AF%5C%22%2C%20%5C%22%E6%84%9F%E8%A7%89%5C%22%2C%20%5C%22%E8%BF%99%E4%B8%AA%5C%22%2C%20%5C%22%E4%B9%B0%5C%22%2C%20%5C%22%E6%94%B6%E5%88%B0%5C%22%7D%5Cnwords%20%3D%20jieba.lcut(bad_comment)%5Cnclean_words%20%3D%20%5Bw%20for%20w%20in%20words%20if%20len(w)%3E%3D2%20and%20w%20not%20in%20stop_words%5D%5Cnword_counter%20%3D%20Counter(clean_words)%5Cntop10_word%20%3D%20word_counter.most_common(10)%5Cnprint(%5C%22%E5%B7%AE%E8%AF%84Top10%E9%AB%98%E9%A2%91%E8%AF%8D%E6%B1%87%EF%BC%9A%5C%22)%5Cnfor%20word%2C%20num%20in%20top10_word%3A%5Cn%20%20%20%20print(f%5C%22%7Bword%7D%EF%BC%9A%7Bnum%7D%E6%AC%A1%5C%22)%5Cn%5Cn%23%203.%20%E4%B8%8D%E5%90%8C%E8%A7%84%E6%A0%BC%E5%95%86%E5%93%81%E5%B9%B3%E5%9D%87%E5%88%86%E5%AF%B9%E6%AF%94%5Cnsku_score%20%3D%20df.groupby(%5C%22%E5%95%86%E5%93%81%E8%A7%84%E6%A0%BC%5C%22)%5B%5C%22%E6%98%9F%E7%BA%A7%E8%AF%84%E5%88%86%5C%22%5D.mean().sort_values()%5Cnprint(%5C%22%5C%5Cn%E5%90%84%E8%A7%84%E6%A0%BC%E5%B9%B3%E5%9D%87%E8%AF%84%E5%88%86%EF%BC%9A%5C%22)%5Cnprint(sku_score)%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;pandas&amp;nbsp;as&amp;nbsp;pd
import&amp;nbsp;jieba
from&amp;nbsp;collections&amp;nbsp;import&amp;nbsp;Counter
import&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt

plt.rcParams[&amp;quot;font.sans-serif&amp;quot;]&amp;nbsp;=&amp;nbsp;[&amp;quot;SimHei&amp;quot;]
plt.rcParams[&amp;quot;axes.unicode_minus&amp;quot;]&amp;nbsp;=&amp;nbsp;False

#&amp;nbsp;读取采集好的评价表格
df&amp;nbsp;=&amp;nbsp;pd.read_csv(f&amp;quot;商品评价_{TARGET_ITEM_ID}.csv&amp;quot;,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)

#&amp;nbsp;1.&amp;nbsp;星级评分分布统计
score_count&amp;nbsp;=&amp;nbsp;df[&amp;quot;星级评分&amp;quot;].value_counts().sort_index()
plt.figure(figsize=(8,4))
score_count.plot(kind=&amp;quot;bar&amp;quot;,&amp;nbsp;color=&amp;quot;#409EFF&amp;quot;)
plt.title(&amp;quot;商品星级评分分布&amp;quot;)
plt.xlabel(&amp;quot;星级&amp;quot;)
plt.ylabel(&amp;quot;评价数量&amp;quot;)
plt.savefig(&amp;quot;评分分布图表.png&amp;quot;)

#&amp;nbsp;2.&amp;nbsp;差评高频关键词提取
bad_comment&amp;nbsp;=&amp;nbsp;df[df[&amp;quot;星级评分&amp;quot;]&amp;nbsp;&amp;lt;=&amp;nbsp;3][&amp;quot;主评内容&amp;quot;].dropna().str.cat(sep=&amp;quot;&amp;nbsp;&amp;quot;)
stop_words&amp;nbsp;=&amp;nbsp;{&amp;quot;的&amp;quot;,&amp;nbsp;&amp;quot;了&amp;quot;,&amp;nbsp;&amp;quot;很&amp;quot;,&amp;nbsp;&amp;quot;有点&amp;quot;,&amp;nbsp;&amp;quot;还&amp;quot;,&amp;nbsp;&amp;quot;但是&amp;quot;,&amp;nbsp;&amp;quot;就是&amp;quot;,&amp;nbsp;&amp;quot;感觉&amp;quot;,&amp;nbsp;&amp;quot;这个&amp;quot;,&amp;nbsp;&amp;quot;买&amp;quot;,&amp;nbsp;&amp;quot;收到&amp;quot;}
words&amp;nbsp;=&amp;nbsp;jieba.lcut(bad_comment)
clean_words&amp;nbsp;=&amp;nbsp;[w&amp;nbsp;for&amp;nbsp;w&amp;nbsp;in&amp;nbsp;words&amp;nbsp;if&amp;nbsp;len(w)&amp;gt;=2&amp;nbsp;and&amp;nbsp;w&amp;nbsp;not&amp;nbsp;in&amp;nbsp;stop_words]
word_counter&amp;nbsp;=&amp;nbsp;Counter(clean_words)
top10_word&amp;nbsp;=&amp;nbsp;word_counter.most_common(10)
print(&amp;quot;差评Top10高频词汇：&amp;quot;)
for&amp;nbsp;word,&amp;nbsp;num&amp;nbsp;in&amp;nbsp;top10_word:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;{word}：{num}次&amp;quot;)

#&amp;nbsp;3.&amp;nbsp;不同规格商品平均分对比
sku_score&amp;nbsp;=&amp;nbsp;df.groupby(&amp;quot;商品规格&amp;quot;)[&amp;quot;星级评分&amp;quot;].mean().sort_values()
print(&amp;quot;\n各规格平均评分：&amp;quot;)
print(sku_score)&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;四、落地使用场景与业务价值&lt;/h2&gt;&lt;h3&gt;场景 1：自有店铺口碑长效监控&lt;/h3&gt;&lt;p&gt;搭配定时轮询代码实现全天监测，一旦出现批量差评可第一时间介入售后，降低负面评价扩散对转化的影响；同时按月统计差评高频词汇，针对性优化产品做工、包装、发货速度等短板。&lt;/p&gt;&lt;h3&gt;场景 2：竞品深度调研分析&lt;/h3&gt;&lt;p&gt;批量采集同赛道头部竞品全量评价，通过关键词对比找出竞品差异化优势与固有缺陷，用于新品定位、详情页卖点策划、营销文案打磨。例如竞品大量反馈 “续航不足”，即可在自家产品宣传重点突出续航优势。&lt;/p&gt;&lt;h3&gt;场景 3：产品迭代需求挖掘&lt;/h3&gt;&lt;p&gt;从上万条真实用户反馈中筛选高频需求，比如服饰类 “尺码偏小”“面料起球”、小家电 “噪音大”，直接作为产品改版、品控升级的数据依据，替代传统问卷调研，数据真实度更高。&lt;/p&gt;&lt;h3&gt;场景 4：运营活动效果复盘&lt;/h3&gt;&lt;p&gt;大促前后分别采集评价数据，对比活动期用户反馈变化，判断活动赠品、优惠机制、发货时效是否带来负面口碑，优化后续大促运营策略。&lt;/p&gt;&lt;h2&gt;五、避坑优化小贴士&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;采集间隔控制&lt;/strong&gt;：分页采集代码中设置 1 秒以上延迟，短时间批量读取大量商品时适当拉长休眠时间，避免触发访问限制；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据存储优化&lt;/strong&gt;：单商品评价超 5000 条建议改用 SQLite 存储，CSV 文件打开加载速度会大幅下降；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;关键词优化&lt;/strong&gt;：可自定义停用词列表，剔除无意义虚词，提升痛点词汇提取精准度；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;多商品批量监控&lt;/strong&gt;：将商品 ID 存入列表循环执行监控任务，同时监控多款竞品，统一汇总分析报表；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据脱敏合规&lt;/strong&gt;：输出报表时可隐藏完整买家昵称，仅保留脱敏后缀，符合用户信息使用规范。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;总结&lt;/h2&gt;&lt;p&gt;这套依托 OpenClaw 构建的电商评论监控分析方案，完美解决传统采集方式稳定性差、维护成本高的痛点，无需复杂逆向开发，少量代码即可完成从数据获取、实时监测到智能分析的全链路自动化流程。不管是电商运营、产品经理还是数据从业者，都能快速落地使用，依托真实用户评价数据驱动产品与运营决策，大幅降低数据调研人力成本。&lt;/p&gt;&lt;p&gt;&lt;span data-cke-copybin-end=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sun, 26 Jul 2026 16:14:05 +0800</pubDate></item><item><title>低成本搭建电商商品口碑实时监控系统｜从数据同步到情感分析完整落地（附 Python 可运行代码）</title><link>https://shopapi.com.cn/?id=202</link><description>&lt;p&gt;&lt;span data-cke-copybin-start=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;前言&lt;/h2&gt;&lt;p&gt;做电商运营、产品调研、竞品分析的朋友应该都有同款痛点：想要持续跟踪商品用户真实反馈，手动翻评论、复制整理效率极低；传统页面抓取方式容易被限制、数据残缺，批量分析更是无从下手。&lt;/p&gt;&lt;p&gt;今天分享一套轻量化落地方案，借助 OpenClaw 稳定数据通道，不用复杂部署、不用大量代理，快速搭建&lt;strong&gt;7×24 小时商品评论增量监控 + 自动化数据分析&lt;/strong&gt;体系，普通电脑、轻量云服务器均可稳定运行，完整流程附带可直接复制运行的 Python 代码，适合商家日常口碑巡检、竞品长期追踪、产品迭代痛点挖掘。&lt;/p&gt;&lt;h2&gt;一、整套方案整体逻辑&lt;/h2&gt;&lt;p&gt;整套系统分为四大核心模块，全程规避繁琐逆向、页面解析等高风险操作：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;增量数据同步模块&lt;/strong&gt;：输入商品唯一标识，批量拉取全维度评价内容，包含评价正文、评价时间、买家晒图、购买规格、脱敏用户昵称、卖家回复等完整信息，支持分页分批获取海量历史评价；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;实时监控模块&lt;/strong&gt;：基于评价唯一编号做数据去重，定时循环轮询，仅抓取新增评价，大幅降低资源消耗，实现口碑动态实时捕捉；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据清洗存储模块&lt;/strong&gt;：自动过滤空白评价、重复灌水好评、无效符号，统一结构化后保存至本地表格，长期监控可切换轻量数据库；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;智能分析预警模块&lt;/strong&gt;：文本分词区分好评 / 中评 / 差评，统计负面高频痛点词，新增低分评价自动识别，输出口碑趋势、评分分布统计结果，直接支撑产品优化与客服应急处理。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;二、前期准备工作&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;注册获取专属密钥与&lt;span aria-label=&quot;a 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_inline cke_widget_csdnlink cke_widget_wrapper_link-info cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;a&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;5&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;link-info cke_widget_editable cke_widget_element&quot; contenteditable=&quot;true&quot; data-cke-enter-mode=&quot;2&quot; data-cke-widget-data=&quot;%7B%22url%22%3A%22https%3A%2F%2Fo0b.cn%2Ficris%22%2C%22text%22%3A%22%E8%AE%BF%E9%97%AE%E5%87%AD%E8%AF%81%22%2C%22desc%22%3A%22%22%2C%22icon%22%3A%22%22%2C%22isCard%22%3Afalse%2C%22hasResquest%22%3Atrue%2C%22iconDefault%22%3A%22https%3A%2F%2Fcsdnimg.cn%2Frelease%2Fblog_editor_html%2Frelease2.4.6%2Fckeditor%2Fplugins%2FCsdnLink%2Ficons%2Ficon-default.png%3Ft%3DQ239%22%2C%22id%22%3A%22U5n1kq-1784709195619%22%2C%22classes%22%3A%7B%22link-info%22%3A1%7D%7D&quot; data-cke-widget-editable=&quot;text&quot; data-cke-widget-keep-attr=&quot;0&quot; data-link-icon=&quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=Q239&quot; data-link-title=&quot;访问凭证&quot; data-widget=&quot;csdnlink&quot; href=&quot;https://o0b.cn/icris&quot; title=&quot;访问凭证&quot;&gt;&lt;strong&gt;访问凭证&lt;/strong&gt;&lt;/a&gt;&lt;/span&gt;（工具后台直接复制，无需额外开发资质）；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;提取目标商品 ID：打开商品详情页，链接中&lt;code&gt;id=&lt;/code&gt;后方一串数字即为商品标识；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Python 环境依赖安装，执行下方命令：&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;0&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22pip%20install%20requests%20pandas%20jieba%20wordcloud%20matplotlib%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;pip&amp;nbsp;install&amp;nbsp;requests&amp;nbsp;pandas&amp;nbsp;jieba&amp;nbsp;wordcloud&amp;nbsp;matplotlib&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;三、完整实战代码实现&lt;/h2&gt;&lt;h3&gt;3.1 基础数据拉取工具函数（批量获取商品评价）&lt;/h3&gt;&lt;p&gt;核心逻辑：传入商品标识、页码，工具通道自动返回结构化评价数据，无需手动解析页面，支持批量分页拉取全部历史评价。&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;1&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20requests%5Cnimport%20time%5Cnimport%20pandas%20as%20pd%5Cnimport%20jieba%5Cnfrom%20collections%20import%20Counter%5Cnimport%20matplotlib.pyplot%20as%20plt%5Cn%5Cn%23%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE%E5%8C%BA%EF%BC%88%E8%87%AA%E8%A1%8C%E4%BF%AE%E6%94%B9%EF%BC%89%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5Cn%23%20%E5%B7%A5%E5%85%B7%E5%90%8E%E5%8F%B0%E8%8E%B7%E5%8F%96%E7%9A%84%E5%87%AD%E8%AF%81%5CnACCESS_KEY%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9Ekey%5C%22%5CnACCESS_SECRET%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9E%E5%AF%86%E9%92%A5%5C%22%5Cn%23%20%E7%9B%AE%E6%A0%87%E5%95%86%E5%93%81ID%5CnTARGET_ITEM_ID%20%3D%20%5C%221234567890123%5C%22%5Cn%23%20%E5%8D%95%E6%AC%A1%E6%8B%89%E5%8F%96%E6%9D%A1%E6%95%B0%5CnPAGE_SIZE%20%3D%2020%5Cn%23%20%E7%9B%91%E6%8E%A7%E8%BD%AE%E8%AF%A2%E9%97%B4%E9%9A%94%EF%BC%88%E5%8D%95%E4%BD%8D%EF%BC%9A%E7%A7%92%EF%BC%8C10%E5%88%86%E9%92%9F%3D600%E7%A7%92%EF%BC%89%5CnMONITOR_INTERVAL%20%3D%20600%5Cn%23%20%E5%AD%98%E5%82%A8%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84%5CnSAVE_PATH%20%3D%20%5C%22goods_comments.csv%5C%22%5Cn%23%20%E8%B4%9F%E9%9D%A2%E5%85%B3%E9%94%AE%E8%AF%8D%E5%BA%93%EF%BC%88%E7%94%A8%E4%BA%8E%E5%B7%AE%E8%AF%84%E8%AF%86%E5%88%AB%E9%A2%84%E8%AD%A6%EF%BC%89%5CnNEG_WORDS%20%3D%20%5B%5C%22%E8%B4%A8%E9%87%8F%E5%B7%AE%5C%22%2C%20%5C%22%E7%A0%B4%E6%8D%9F%5C%22%2C%20%5C%22%E6%8E%89%E8%89%B2%5C%22%2C%20%5C%22%E5%8F%91%E8%B4%A7%E6%85%A2%5C%22%2C%20%5C%22%E5%94%AE%E5%90%8E%E5%B7%AE%5C%22%2C%20%5C%22%E5%B0%BA%E5%AF%B8%E4%B8%8D%E7%AC%A6%5C%22%2C%20%5C%22%E5%81%87%E8%B4%A7%5C%22%2C%20%5C%22%E5%BC%82%E5%91%B3%5C%22%5D%5Cn%23%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5Cn%5Cndef%20get_review_batch(item_id%2C%20page%3D1)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%E6%89%B9%E9%87%8F%E8%8E%B7%E5%8F%96%E5%95%86%E5%93%81%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE%5Cn%20%20%20%20%3Aparam%20item_id%3A%20%E5%95%86%E5%93%81%E5%94%AF%E4%B8%80ID%5Cn%20%20%20%20%3Aparam%20page%3A%20%E5%88%86%E9%A1%B5%E9%A1%B5%E7%A0%81%5Cn%20%20%20%20%3Areturn%3A%20%E7%BB%93%E6%9E%84%E5%8C%96%E8%AF%84%E4%BB%B7%E5%88%97%E8%A1%A8%5Cn%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20params%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22key%5C%22%3A%20ACCESS_KEY%2C%5Cn%20%20%20%20%20%20%20%20%5C%22secret%5C%22%3A%20ACCESS_SECRET%2C%5Cn%20%20%20%20%20%20%20%20%5C%22item_id%5C%22%3A%20item_id%2C%5Cn%20%20%20%20%20%20%20%20%5C%22page%5C%22%3A%20page%2C%5Cn%20%20%20%20%20%20%20%20%5C%22page_size%5C%22%3A%20PAGE_SIZE%2C%5Cn%20%20%20%20%20%20%20%20%5C%22result_type%5C%22%3A%20%5C%22json%5C%22%5Cn%20%20%20%20%7D%5Cn%20%20%20%20%23%20%E5%B7%A5%E5%85%B7%E7%BB%9F%E4%B8%80%E8%AE%BF%E9%97%AE%E9%80%9A%E9%81%93%5Cn%20%20%20%20resp%20%3D%20requests.get(%5C%22https%3A%2F%2Fgate.openclaw.cloud%2Fdata%5C%22%2C%20params%3Dparams%2C%20timeout%3D30)%5Cn%20%20%20%20res_json%20%3D%20resp.json()%5Cn%20%20%20%20review_list%20%3D%20%5B%5D%5Cn%20%20%20%20if%20res_json.get(%5C%22data%5C%22)%20and%20res_json%5B%5C%22data%5C%22%5D.get(%5C%22item%5C%22)%3A%5Cn%20%20%20%20%20%20%20%20for%20item%20in%20res_json%5B%5C%22data%5C%22%5D%5B%5C%22item%5C%22%5D%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20review_info%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22review_id%5C%22%3A%20item.get(%5C%22rate_id%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22content%5C%22%3A%20item.get(%5C%22rate_content%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22review_time%5C%22%3A%20item.get(%5C%22rate_date%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22user_name%5C%22%3A%20item.get(%5C%22display_user_nick%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22sku_info%5C%22%3A%20item.get(%5C%22auction_sku%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22img_urls%5C%22%3A%20item.get(%5C%22pics%5C%22%2C%20%5B%5D)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22seller_reply%5C%22%3A%20item.get(%5C%22reply_content%5C%22%2C%20%5C%22%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20%20%20%20review_list.append(review_info)%5Cn%20%20%20%20return%20review_list%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;requests
import&amp;nbsp;time
import&amp;nbsp;pandas&amp;nbsp;as&amp;nbsp;pd
import&amp;nbsp;jieba
from&amp;nbsp;collections&amp;nbsp;import&amp;nbsp;Counter
import&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt

#&amp;nbsp;=====================&amp;nbsp;基础配置区（自行修改）&amp;nbsp;=====================
#&amp;nbsp;工具后台获取的凭证
ACCESS_KEY&amp;nbsp;=&amp;nbsp;&amp;quot;你的专属key&amp;quot;
ACCESS_SECRET&amp;nbsp;=&amp;nbsp;&amp;quot;你的专属密钥&amp;quot;
#&amp;nbsp;目标商品ID
TARGET_ITEM_ID&amp;nbsp;=&amp;nbsp;&amp;quot;1234567890123&amp;quot;
#&amp;nbsp;单次拉取条数
PAGE_SIZE&amp;nbsp;=&amp;nbsp;20
#&amp;nbsp;监控轮询间隔（单位：秒，10分钟=600秒）
MONITOR_INTERVAL&amp;nbsp;=&amp;nbsp;600
#&amp;nbsp;存储文件路径
SAVE_PATH&amp;nbsp;=&amp;nbsp;&amp;quot;goods_comments.csv&amp;quot;
#&amp;nbsp;负面关键词库（用于差评识别预警）
NEG_WORDS&amp;nbsp;=&amp;nbsp;[&amp;quot;质量差&amp;quot;,&amp;nbsp;&amp;quot;破损&amp;quot;,&amp;nbsp;&amp;quot;掉色&amp;quot;,&amp;nbsp;&amp;quot;发货慢&amp;quot;,&amp;nbsp;&amp;quot;售后差&amp;quot;,&amp;nbsp;&amp;quot;尺寸不符&amp;quot;,&amp;nbsp;&amp;quot;假货&amp;quot;,&amp;nbsp;&amp;quot;异味&amp;quot;]
#&amp;nbsp;=================================================================

def&amp;nbsp;get_review_batch(item_id,&amp;nbsp;page=1):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;批量获取商品评价数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;item_id:&amp;nbsp;商品唯一ID
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;page:&amp;nbsp;分页页码
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:return:&amp;nbsp;结构化评价列表
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;key&amp;quot;:&amp;nbsp;ACCESS_KEY,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;secret&amp;quot;:&amp;nbsp;ACCESS_SECRET,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;item_id&amp;quot;:&amp;nbsp;item_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page_size&amp;quot;:&amp;nbsp;PAGE_SIZE,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;result_type&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;工具统一访问通道
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.get(&amp;quot;https://gate.openclaw.cloud/data&amp;quot;,&amp;nbsp;params=params,&amp;nbsp;timeout=30)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res_json&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;review_list&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;res_json.get(&amp;quot;data&amp;quot;)&amp;nbsp;and&amp;nbsp;res_json[&amp;quot;data&amp;quot;].get(&amp;quot;item&amp;quot;):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;res_json[&amp;quot;data&amp;quot;][&amp;quot;item&amp;quot;]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;review_info&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;review_id&amp;quot;:&amp;nbsp;item.get(&amp;quot;rate_id&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;content&amp;quot;:&amp;nbsp;item.get(&amp;quot;rate_content&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;review_time&amp;quot;:&amp;nbsp;item.get(&amp;quot;rate_date&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;user_name&amp;quot;:&amp;nbsp;item.get(&amp;quot;display_user_nick&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sku_info&amp;quot;:&amp;nbsp;item.get(&amp;quot;auction_sku&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;img_urls&amp;quot;:&amp;nbsp;item.get(&amp;quot;pics&amp;quot;,&amp;nbsp;[]),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;seller_reply&amp;quot;:&amp;nbsp;item.get(&amp;quot;reply_content&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;review_list.append(review_info)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;review_list&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;3.2 数据清洗与持久化存储函数&lt;/h3&gt;&lt;p&gt;自动去重、过滤无效空白评价，追加写入本地表格，长期监控数据不会重复堆积。&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;2&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22def%20save_comments_to_csv(new_data)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E6%B8%85%E6%B4%97%E5%B9%B6%E4%BF%9D%E5%AD%98%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE%EF%BC%8C%E8%87%AA%E5%8A%A8%E5%8E%BB%E9%87%8D%5C%22%5C%22%5C%22%5Cn%20%20%20%20if%20len(new_data)%20%3D%3D%200%3A%5Cn%20%20%20%20%20%20%20%20return%20pd.DataFrame(%5B%5D)%5Cn%20%20%20%20df_new%20%3D%20pd.DataFrame(new_data)%5Cn%20%20%20%20%23%20%E8%BF%87%E6%BB%A4%E6%97%A0%E5%86%85%E5%AE%B9%E8%AF%84%E4%BB%B7%5Cn%20%20%20%20df_new%20%3D%20df_new%5Bdf_new%5B%5C%22content%5C%22%5D.str.strip()%20!%3D%20%5C%22%5C%22%5D%5Cn%20%20%20%20%23%20%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6%E5%AD%98%E5%9C%A8%2F%E4%B8%8D%E5%AD%98%E5%9C%A8%E4%B8%A4%E7%A7%8D%E5%9C%BA%E6%99%AF%5Cn%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20df_all%20%3D%20pd.read_csv(SAVE_PATH%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20%20%20%20%20%23%20%E5%8E%BB%E9%87%8D%EF%BC%9A%E6%A0%B9%E6%8D%AE%E8%AF%84%E4%BB%B7%E5%94%AF%E4%B8%80ID%5Cn%20%20%20%20%20%20%20%20df_merge%20%3D%20pd.concat(%5Bdf_all%2C%20df_new%5D).drop_duplicates(subset%3D%5B%5C%22review_id%5C%22%5D%2C%20keep%3D%5C%22last%5C%22)%5Cn%20%20%20%20%20%20%20%20df_merge.to_csv(SAVE_PATH%2C%20index%3DFalse%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E6%9C%AC%E6%AC%A1%E6%96%B0%E5%A2%9E%E6%9C%89%E6%95%88%E8%AF%84%E4%BB%B7%EF%BC%9A%7Blen(df_merge)-len(df_all)%7D%20%E6%9D%A1%EF%BC%8C%E7%B4%AF%E8%AE%A1%E6%95%B0%E6%8D%AE%EF%BC%9A%7Blen(df_merge)%7D%20%E6%9D%A1%5C%22)%5Cn%20%20%20%20%20%20%20%20return%20df_merge%5Cn%20%20%20%20except%20FileNotFoundError%3A%5Cn%20%20%20%20%20%20%20%20df_new.to_csv(SAVE_PATH%2C%20index%3DFalse%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E9%A6%96%E6%AC%A1%E5%88%9B%E5%BB%BA%E6%95%B0%E6%8D%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E5%85%B1%E5%86%99%E5%85%A5%20%7Blen(df_new)%7D%20%E6%9D%A1%E8%AF%84%E4%BB%B7%5C%22)%5Cn%20%20%20%20%20%20%20%20return%20df_new%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;def&amp;nbsp;save_comments_to_csv(new_data):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;清洗并保存评价数据，自动去重&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(new_data)&amp;nbsp;==&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;pd.DataFrame([])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_new&amp;nbsp;=&amp;nbsp;pd.DataFrame(new_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;过滤无内容评价
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_new&amp;nbsp;=&amp;nbsp;df_new[df_new[&amp;quot;content&amp;quot;].str.strip()&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;处理文件存在/不存在两种场景
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_all&amp;nbsp;=&amp;nbsp;pd.read_csv(SAVE_PATH,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;去重：根据评价唯一ID
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_merge&amp;nbsp;=&amp;nbsp;pd.concat([df_all,&amp;nbsp;df_new]).drop_duplicates(subset=[&amp;quot;review_id&amp;quot;],&amp;nbsp;keep=&amp;quot;last&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_merge.to_csv(SAVE_PATH,&amp;nbsp;index=False,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;本次新增有效评价：{len(df_merge)-len(df_all)}&amp;nbsp;条，累计数据：{len(df_merge)}&amp;nbsp;条&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;df_merge
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;FileNotFoundError:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_new.to_csv(SAVE_PATH,&amp;nbsp;index=False,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;首次创建数据文件，共写入&amp;nbsp;{len(df_new)}&amp;nbsp;条评价&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;df_new&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;3.3 口碑情感分析 + 痛点统计函数&lt;/h3&gt;&lt;p&gt;读取本地评价数据，区分正负向评价，提取差评高频关键词，输出统计结果，可直接用于产品迭代分析。&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;3&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22def%20analyze_comment_insight(file_path)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E8%AF%84%E8%AE%BA%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%EF%BC%9A%E6%AD%A3%E8%B4%9F%E5%90%91%E7%BB%9F%E8%AE%A1%E3%80%81%E8%B4%9F%E9%9D%A2%E7%97%9B%E7%82%B9%E8%AF%8D%E6%8F%90%E5%8F%96%5C%22%5C%22%5C%22%5Cn%20%20%20%20df%20%3D%20pd.read_csv(file_path%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20if%20len(df)%20%3D%3D%200%3A%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E6%9A%82%E6%97%A0%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE%EF%BC%8C%E6%97%A0%E6%B3%95%E5%88%86%E6%9E%90%5C%22)%5Cn%20%20%20%20%20%20%20%20return%5Cn%20%20%20%20print(%5C%22%3D%3D%3D%3D%3D%20%E5%95%86%E5%93%81%E5%8F%A3%E7%A2%91%E6%95%B4%E4%BD%93%E5%88%86%E6%9E%90%E6%8A%A5%E5%91%8A%20%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20print(f%5C%22%E6%80%BB%E6%9C%89%E6%95%88%E8%AF%84%E4%BB%B7%E6%95%B0%E9%87%8F%EF%BC%9A%7Blen(df)%7D%5C%22)%5Cn%20%20%20%20%23%20%E6%A0%87%E8%AE%B0%E8%B4%9F%E9%9D%A2%E8%AF%84%E4%BB%B7%5Cn%20%20%20%20df%5B%5C%22is_negative%5C%22%5D%20%3D%20df%5B%5C%22content%5C%22%5D.apply(lambda%20x%3A%201%20if%20any(w%20in%20x%20for%20w%20in%20NEG_WORDS)%20else%200)%5Cn%20%20%20%20neg_count%20%3D%20df%5B%5C%22is_negative%5C%22%5D.sum()%5Cn%20%20%20%20pos_count%20%3D%20len(df)%20-%20neg_count%5Cn%20%20%20%20print(f%5C%22%E6%AD%A3%E5%90%91%E8%AF%84%E4%BB%B7%EF%BC%9A%7Bpos_count%7D%20%E6%9D%A1%EF%BC%8C%E8%B4%9F%E9%9D%A2%E8%AF%84%E4%BB%B7%EF%BC%9A%7Bneg_count%7D%20%E6%9D%A1%5C%22)%5Cn%20%20%20%20print(f%5C%22%E8%B4%9F%E9%9D%A2%E5%8D%A0%E6%AF%94%EF%BC%9A%7Bround(neg_count%2Flen(df)*100%2C2)%7D%25%5C%22)%5Cn%20%20%20%20%23%20%E6%8F%90%E5%8F%96%E5%B7%AE%E8%AF%84%E6%96%87%E6%9C%AC%E5%88%86%E8%AF%8D%E7%BB%9F%E8%AE%A1%E9%AB%98%E9%A2%91%E7%97%9B%E7%82%B9%5Cn%20%20%20%20neg_text%20%3D%20%5C%22%5C%22.join(df%5Bdf%5B%5C%22is_negative%5C%22%5D%20%3D%3D%201%5D%5B%5C%22content%5C%22%5D.tolist())%5Cn%20%20%20%20words%20%3D%20jieba.lcut(neg_text)%5Cn%20%20%20%20%23%20%E8%BF%87%E6%BB%A4%E6%97%A0%E6%84%8F%E4%B9%89%E5%8D%95%E5%AD%97%E3%80%81%E5%8A%A9%E8%AF%8D%5Cn%20%20%20%20filter_words%20%3D%20%5B%5C%22%E7%9A%84%5C%22%2C%20%5C%22%E4%BA%86%5C%22%2C%20%5C%22%E5%BE%88%5C%22%2C%20%5C%22%E6%9C%89%E7%82%B9%5C%22%2C%20%5C%22%E4%B8%80%E7%82%B9%5C%22%2C%20%5C%22%E8%BF%98%E6%98%AF%5C%22%2C%20%5C%22%E4%BD%86%E6%98%AF%5C%22%2C%20%5C%22%E8%A7%89%E5%BE%97%5C%22%5D%5Cn%20%20%20%20word_clean%20%3D%20%5Bw%20for%20w%20in%20words%20if%20len(w)%3E%3D2%20and%20w%20not%20in%20filter_words%5D%5Cn%20%20%20%20word_count%20%3D%20Counter(word_clean)%5Cn%20%20%20%20print(%5C%22%5C%5Cn%E5%B7%AE%E8%AF%84%E9%AB%98%E9%A2%91%E7%97%9B%E7%82%B9TOP15%EF%BC%9A%5C%22)%5Cn%20%20%20%20for%20word%2C%20cnt%20in%20word_count.most_common(15)%3A%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%7Bword%7D%EF%BC%9A%7Bcnt%7D%E6%AC%A1%5C%22)%5Cn%20%20%20%20%23%20%E7%AE%80%E5%8D%95%E7%BB%98%E5%88%B6%E6%AD%A3%E8%B4%9F%E8%AF%84%E4%BB%B7%E5%88%86%E5%B8%83%E9%A5%BC%E5%9B%BE%5Cn%20%20%20%20plt.rcParams%5B%5C%22font.sans-serif%5C%22%5D%20%3D%20%5B%5C%22SimHei%5C%22%5D%5Cn%20%20%20%20plt.rcParams%5B%5C%22axes.unicode_minus%5C%22%5D%20%3D%20False%5Cn%20%20%20%20plt.pie(%5Bpos_count%2C%20neg_count%5D%2C%20labels%3D%5B%5C%22%E5%A5%BD%E8%AF%84%2F%E4%B8%AD%E6%80%A7%5C%22%2C%20%5C%22%E5%B7%AE%E8%AF%84%5C%22%5D%2C%20autopct%3D%5C%22%251.2f%25%25%5C%22%2C%20colors%3D%5B%5C%22%2366cc66%5C%22%2C%20%5C%22%23ff6666%5C%22%5D)%5Cn%20%20%20%20plt.title(%5C%22%E5%95%86%E5%93%81%E8%AF%84%E4%BB%B7%E6%83%85%E6%84%9F%E5%88%86%E5%B8%83%5C%22)%5Cn%20%20%20%20plt.show()%5Cn%20%20%20%20return%20df%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;def&amp;nbsp;analyze_comment_insight(file_path):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;评论数据分析：正负向统计、负面痛点词提取&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;pd.read_csv(file_path,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(df)&amp;nbsp;==&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;暂无评价数据，无法分析&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;=====&amp;nbsp;商品口碑整体分析报告&amp;nbsp;=====&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;总有效评价数量：{len(df)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;标记负面评价
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df[&amp;quot;is_negative&amp;quot;]&amp;nbsp;=&amp;nbsp;df[&amp;quot;content&amp;quot;].apply(lambda&amp;nbsp;x:&amp;nbsp;1&amp;nbsp;if&amp;nbsp;any(w&amp;nbsp;in&amp;nbsp;x&amp;nbsp;for&amp;nbsp;w&amp;nbsp;in&amp;nbsp;NEG_WORDS)&amp;nbsp;else&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;neg_count&amp;nbsp;=&amp;nbsp;df[&amp;quot;is_negative&amp;quot;].sum()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pos_count&amp;nbsp;=&amp;nbsp;len(df)&amp;nbsp;-&amp;nbsp;neg_count
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;正向评价：{pos_count}&amp;nbsp;条，负面评价：{neg_count}&amp;nbsp;条&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;负面占比：{round(neg_count/len(df)*100,2)}%&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;提取差评文本分词统计高频痛点
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;neg_text&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(df[df[&amp;quot;is_negative&amp;quot;]&amp;nbsp;==&amp;nbsp;1][&amp;quot;content&amp;quot;].tolist())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;words&amp;nbsp;=&amp;nbsp;jieba.lcut(neg_text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;过滤无意义单字、助词
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filter_words&amp;nbsp;=&amp;nbsp;[&amp;quot;的&amp;quot;,&amp;nbsp;&amp;quot;了&amp;quot;,&amp;nbsp;&amp;quot;很&amp;quot;,&amp;nbsp;&amp;quot;有点&amp;quot;,&amp;nbsp;&amp;quot;一点&amp;quot;,&amp;nbsp;&amp;quot;还是&amp;quot;,&amp;nbsp;&amp;quot;但是&amp;quot;,&amp;nbsp;&amp;quot;觉得&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;word_clean&amp;nbsp;=&amp;nbsp;[w&amp;nbsp;for&amp;nbsp;w&amp;nbsp;in&amp;nbsp;words&amp;nbsp;if&amp;nbsp;len(w)&amp;gt;=2&amp;nbsp;and&amp;nbsp;w&amp;nbsp;not&amp;nbsp;in&amp;nbsp;filter_words]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;word_count&amp;nbsp;=&amp;nbsp;Counter(word_clean)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;\n差评高频痛点TOP15：&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;word,&amp;nbsp;cnt&amp;nbsp;in&amp;nbsp;word_count.most_common(15):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;{word}：{cnt}次&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;简单绘制正负评价分布饼图
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.rcParams[&amp;quot;font.sans-serif&amp;quot;]&amp;nbsp;=&amp;nbsp;[&amp;quot;SimHei&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.rcParams[&amp;quot;axes.unicode_minus&amp;quot;]&amp;nbsp;=&amp;nbsp;False
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.pie([pos_count,&amp;nbsp;neg_count],&amp;nbsp;labels=[&amp;quot;好评/中性&amp;quot;,&amp;nbsp;&amp;quot;差评&amp;quot;],&amp;nbsp;autopct=&amp;quot;%1.2f%%&amp;quot;,&amp;nbsp;colors=[&amp;quot;#66cc66&amp;quot;,&amp;nbsp;&amp;quot;#ff6666&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.title(&amp;quot;商品评价情感分布&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.show()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;df&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;3.4 7×24 小时增量监控主循环&lt;/h3&gt;&lt;p&gt;定时轮询抓取最新评价，自动识别新增差评并打印预警，实现实时口碑监控。&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;4&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22def%20monitor_goods_review()%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E6%8C%81%E7%BB%AD%E7%9B%91%E6%8E%A7%E5%95%86%E5%93%81%E6%96%B0%E5%A2%9E%E8%AF%84%E4%BB%B7%EF%BC%8C%E5%AE%9A%E6%97%B6%E8%BD%AE%E8%AF%A2%E6%89%A7%E8%A1%8C%5C%22%5C%22%5C%22%5Cn%20%20%20%20print(f%5C%22%E5%B7%B2%E5%90%AF%E5%8A%A8%E5%95%86%E5%93%81%E5%8F%A3%E7%A2%91%E7%9B%91%E6%8E%A7%EF%BC%8C%E5%95%86%E5%93%81ID%EF%BC%9A%7BTARGET_ITEM_ID%7D%EF%BC%8C%E6%AF%8F%7BMONITOR_INTERVAL%2F60%7D%E5%88%86%E9%92%9F%E5%90%8C%E6%AD%A5%E4%B8%80%E6%AC%A1%E6%95%B0%E6%8D%AE%5C%22)%5Cn%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20all_new_reviews%20%3D%20%5B%5D%5Cn%20%20%20%20%20%20%20%20page%20%3D%201%5Cn%20%20%20%20%20%20%20%20%23%20%E5%88%86%E6%89%B9%E6%8B%89%E5%8F%96%E6%9C%80%E6%96%B0%E8%AF%84%E4%BB%B7%EF%BC%88%E4%BB%85%E6%8A%93%E5%8F%96%E7%AC%AC%E4%B8%80%E9%A1%B5%E6%9C%80%E6%96%B0%E6%95%B0%E6%8D%AE%EF%BC%8C%E5%A6%82%E9%9C%80%E5%85%A8%E9%87%8F%E5%90%8C%E6%AD%A5%E5%8F%AF%E6%94%BE%E5%BC%80%E5%BE%AA%E7%8E%AF%EF%BC%89%5Cn%20%20%20%20%20%20%20%20batch%20%3D%20get_review_batch(TARGET_ITEM_ID%2C%20page)%5Cn%20%20%20%20%20%20%20%20all_new_reviews.extend(batch)%5Cn%20%20%20%20%20%20%20%20%23%20%E4%BF%9D%E5%AD%98%E5%B9%B6%E6%B8%85%E6%B4%97%E6%95%B0%E6%8D%AE%5Cn%20%20%20%20%20%20%20%20df_data%20%3D%20save_comments_to_csv(all_new_reviews)%5Cn%20%20%20%20%20%20%20%20%23%20%E5%B7%AE%E8%AF%84%E9%A2%84%E8%AD%A6%E6%8F%90%E7%A4%BA%5Cn%20%20%20%20%20%20%20%20new_neg%20%3D%20df_data%5Bdf_data%5B%5C%22is_negative%5C%22%5D%20%3D%3D%201%5D%20if%20%5C%22is_negative%5C%22%20in%20df_data.columns%20else%20pd.DataFrame(%5B%5D)%5Cn%20%20%20%20%20%20%20%20if%20len(new_neg)%20%3E%200%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(%5C%22%5C%5Cn%E2%9A%A0%EF%B8%8F%20%E6%A3%80%E6%B5%8B%E5%88%B0%E6%96%B0%E5%A2%9E%E5%B7%AE%E8%AF%84%EF%BC%8C%E8%AF%B7%E5%8F%8A%E6%97%B6%E5%A4%84%E7%90%86%EF%BC%9A%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20for%20idx%2C%20row%20in%20new_neg.iterrows()%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E3%80%90%7Brow%5B&amp;#39;review_time&amp;#39;%5D%7D%E3%80%91%E7%94%A8%E6%88%B7%7Brow%5B&amp;#39;user_name&amp;#39;%5D%7D%EF%BC%9A%7Brow%5B&amp;#39;content&amp;#39;%5D%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%5C%5Cn%E7%AD%89%E5%BE%85%7BMONITOR_INTERVAL%2F60%7D%E5%88%86%E9%92%9F%E5%90%8E%E6%89%A7%E8%A1%8C%E4%B8%8B%E4%B8%80%E8%BD%AE%E5%90%8C%E6%AD%A5...%5C%5Cn%5C%22)%5Cn%20%20%20%20%20%20%20%20time.sleep(MONITOR_INTERVAL)%5Cn%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20%23%20%E9%A6%96%E6%AC%A1%E6%89%A7%E8%A1%8C%EF%BC%9A%E6%8B%89%E5%8F%96%E5%85%A8%E9%87%8F%E5%8E%86%E5%8F%B2%E8%AF%84%E4%BB%B7%EF%BC%88%E5%BE%AA%E7%8E%AF%E5%88%86%E9%A1%B5%EF%BC%89%5Cn%20%20%20%20print(%5C%22%E5%BC%80%E5%A7%8B%E5%90%8C%E6%AD%A5%E5%95%86%E5%93%81%E5%85%A8%E9%83%A8%E5%8E%86%E5%8F%B2%E8%AF%84%E4%BB%B7...%5C%22)%5Cn%20%20%20%20full_review_data%20%3D%20%5B%5D%5Cn%20%20%20%20current_page%20%3D%201%5Cn%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20page_data%20%3D%20get_review_batch(TARGET_ITEM_ID%2C%20current_page)%5Cn%20%20%20%20%20%20%20%20if%20len(page_data)%20%3D%3D%200%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20break%5Cn%20%20%20%20%20%20%20%20full_review_data.extend(page_data)%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E5%B7%B2%E5%90%8C%E6%AD%A5%E7%AC%AC%7Bcurrent_page%7D%E9%A1%B5%EF%BC%8C%E5%BD%93%E5%89%8D%E7%B4%AF%E8%AE%A1%7Blen(full_review_data)%7D%E6%9D%A1%5C%22)%5Cn%20%20%20%20%20%20%20%20current_page%20%2B%3D%201%5Cn%20%20%20%20%20%20%20%20time.sleep(2)%5Cn%20%20%20%20save_comments_to_csv(full_review_data)%5Cn%20%20%20%20%23%20%E6%89%A7%E8%A1%8C%E4%B8%80%E6%AC%A1%E5%AE%8C%E6%95%B4%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%5Cn%20%20%20%20analyze_comment_insight(SAVE_PATH)%5Cn%20%20%20%20%23%20%E5%90%AF%E5%8A%A8%E6%8C%81%E7%BB%AD%E5%AE%9E%E6%97%B6%E7%9B%91%E6%8E%A7%5Cn%20%20%20%20monitor_goods_review()%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;def&amp;nbsp;monitor_goods_review():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;持续监控商品新增评价，定时轮询执行&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;已启动商品口碑监控，商品ID：{TARGET_ITEM_ID}，每{MONITOR_INTERVAL/60}分钟同步一次数据&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_new_reviews&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;分批拉取最新评价（仅抓取第一页最新数据，如需全量同步可放开循环）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;batch&amp;nbsp;=&amp;nbsp;get_review_batch(TARGET_ITEM_ID,&amp;nbsp;page)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_new_reviews.extend(batch)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;保存并清洗数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_data&amp;nbsp;=&amp;nbsp;save_comments_to_csv(all_new_reviews)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;差评预警提示
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_neg&amp;nbsp;=&amp;nbsp;df_data[df_data[&amp;quot;is_negative&amp;quot;]&amp;nbsp;==&amp;nbsp;1]&amp;nbsp;if&amp;nbsp;&amp;quot;is_negative&amp;quot;&amp;nbsp;in&amp;nbsp;df_data.columns&amp;nbsp;else&amp;nbsp;pd.DataFrame([])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(new_neg)&amp;nbsp;&amp;gt;&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;\n⚠️&amp;nbsp;检测到新增差评，请及时处理：&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;idx,&amp;nbsp;row&amp;nbsp;in&amp;nbsp;new_neg.iterrows():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;【{row[&amp;#39;review_time&amp;#39;]}】用户{row[&amp;#39;user_name&amp;#39;]}：{row[&amp;#39;content&amp;#39;]}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;\n等待{MONITOR_INTERVAL/60}分钟后执行下一轮同步...\n&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(MONITOR_INTERVAL)

if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;首次执行：拉取全量历史评价（循环分页）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;开始同步商品全部历史评价...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;full_review_data&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;current_page&amp;nbsp;=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page_data&amp;nbsp;=&amp;nbsp;get_review_batch(TARGET_ITEM_ID,&amp;nbsp;current_page)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(page_data)&amp;nbsp;==&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;full_review_data.extend(page_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;已同步第{current_page}页，当前累计{len(full_review_data)}条&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;current_page&amp;nbsp;+=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;save_comments_to_csv(full_review_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;执行一次完整数据分析
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;analyze_comment_insight(SAVE_PATH)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;启动持续实时监控
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor_goods_review()&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;四、代码使用说明与优化方案&lt;/h2&gt;&lt;h3&gt;1. 快速上手步骤&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;修改代码顶部&lt;code&gt;ACCESS_KEY&lt;/code&gt;、&lt;code&gt;ACCESS_SECRET&lt;/code&gt;为工具后台生成的专属凭证；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;替换&lt;code&gt;TARGET_ITEM_ID&lt;/code&gt;为需要监控的商品编号；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;直接运行脚本，程序会先一次性同步全部历史评价，自动生成 CSV 数据表并输出分析报告；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;同步完成后自动进入循环监控模式，每 10 分钟抓取一次最新评价，出现差评即时弹窗打印预警。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;2. 场景化优化拓展&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;多商品批量监控&lt;/strong&gt;：将商品 ID 存入列表，循环遍历执行同步逻辑，同时跟踪多款竞品口碑；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;消息预警推送&lt;/strong&gt;：新增差评识别后，对接企业微信 / 钉钉机器人，自动推送评价详情至运营群；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;长期大数据存储&lt;/strong&gt;：替换 CSV 存储为 SQLite、MySQL 数据库，支持百万级评价长期存储；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;可视化看板&lt;/strong&gt;：基于 Matplotlib 拓展时间趋势折线图，观察不同周期差评数量波动；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;自定义维度分析&lt;/strong&gt;：根据商品规格&lt;code&gt;sku_info&lt;/code&gt;拆分分析不同尺码、颜色款式的用户反馈差异。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;五、这套方案对比传统方式的核心优势&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;稳定无封禁风险&lt;/strong&gt;：依托 OpenClaw 标准化数据通道，无需搭建大量代理池、无需模拟浏览器滑动翻页，不会触发平台访问限制，7×24 小时稳定运行；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据完整结构化&lt;/strong&gt;：一次性获取评价正文、晒图、规格、追评、卖家回复等全维度信息，不用自己写复杂页面解析逻辑；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;轻量化低门槛&lt;/strong&gt;：仅依赖基础 Python 第三方库，无需分布式、服务器集群，个人笔记本即可完成竞品长期监控；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;自动化闭环&lt;/strong&gt;：从数据抓取、清洗存储、情感分析、差评预警全流程自动化，不用人工导出、整理表格，大幅节省运营时间；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;成本可控&lt;/strong&gt;：按需调取数据，增量抓取机制减少重复数据消耗，中小商家、个人调研均可低成本落地。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;六、落地场景总结&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;自有店铺运营&lt;/strong&gt;：实时监控本店商品新增差评，第一时间介入客服安抚，降低负面口碑扩散；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;竞品调研分析&lt;/strong&gt;：长期跟踪同类爆款商品用户痛点，挖掘竞品短板，指导自家产品优化升级；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;产品迭代调研&lt;/strong&gt;：批量提取海量用户真实反馈，统计高频吐槽点，作为产品改版、工艺优化核心依据；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;直播 / 活动复盘&lt;/strong&gt;：活动期间开启高频监控，快速捕捉活动带来的集中负面反馈，及时调整活动策略。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;结尾&lt;/h2&gt;&lt;p&gt;很多做电商、产品的同学还在手动复制评论、用简易页面抓取工具，不仅耗时，还经常出现数据缺失、账号受限问题。这套基于 OpenClaw 搭建的自动化监控分析体系，把数据获取、清洗、分析、预警全部打通，一段代码就能实现长效口碑监测，适合长期复用。&lt;/p&gt;&lt;p&gt;&lt;span data-cke-copybin-end=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 22 Jul 2026 17:30:08 +0800</pubDate></item><item><title>30 分钟搭建电商商品口碑实时监控系统，自动化采集 + 情感分析全流程实战（附完整可运行 Python 代码）</title><link>https://shopapi.com.cn/?id=201</link><description>&lt;p&gt;&lt;span data-cke-copybin-start=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;前言&lt;/h2&gt;&lt;p&gt;做电商运营、产品调研、竞品分析的同学，几乎都有同一个痛点：想要持续掌握商品真实用户反馈，却只能手动刷新页面复制评论，效率极低。 大批量竞品、多店铺商品同时跟踪时，人工统计完全跟不上节奏；想及时捕捉新增差评、用户吐槽痛点，往往滞后几天，错失产品优化、舆情处理最佳时机。&lt;/p&gt;&lt;p&gt;传统页面抓取方案存在大量短板：频繁触发平台访问限制、需要长期维护登录凭证、页面改版后代码直接失效、批量采集稳定性差。今天分享一套轻量化成熟方案，借助 OpenClaw 一站式数据工具，无需逆向页面、不用处理复杂反爬规则，快速搭建&lt;strong&gt;全量评论自动采集、定时增量监控、文本情感挖掘、痛点可视化&lt;/strong&gt;完整体系，新手零基础也能落地。&lt;/p&gt;&lt;p&gt;整套方案覆盖三大核心能力：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;批量拉取商品历史全部评价，包含主评、追评、晒图、买家规格、评分、发布时间等完整信息；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;定时轮询增量抓取新增评论，自动去重，新增差评支持消息告警；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;本地完成文本清洗、情感正负向分类、高频关键词统计，输出可视化口碑报表。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;一、整体搭建流程概述&lt;/h2&gt;&lt;p&gt;整套系统分为 4 个环节，普通电脑 / 轻量云服务器即可稳定运行，无需分布式部署：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;工具后台初始化：创建数据监控项目，生成专属访问凭证，配置采集频次、批量商品清单；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;数据拉取脚本：通过 Python 程序读取商品评价数据，自动清洗无效内容、存储本地文件；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;长效监控定时任务：循环轮询抓取当日新增评价，实时捕捉负面反馈；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;智能数据分析模块：分词、情感打分、词云生成、评分分布统计，输出分析结果。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;二、工具后台基础配置步骤&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;登录管理后台，新建电商数据采集项目，系统自动生成&lt;span aria-label=&quot;a 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_inline cke_widget_csdnlink cke_widget_wrapper_link-info cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;a&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;4&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;link-info cke_widget_editable cke_widget_element&quot; contenteditable=&quot;true&quot; data-cke-enter-mode=&quot;2&quot; data-cke-widget-data=&quot;%7B%22url%22%3A%22https%3A%2F%2Fo0b.cn%2Ficris%22%2C%22text%22%3A%22%E5%94%AF%E4%B8%80%E8%AE%BF%E9%97%AE%E4%BB%A4%E7%89%8C%22%2C%22desc%22%3A%22%22%2C%22icon%22%3A%22%22%2C%22isCard%22%3Afalse%2C%22hasResquest%22%3Atrue%2C%22iconDefault%22%3A%22https%3A%2F%2Fcsdnimg.cn%2Frelease%2Fblog_editor_html%2Frelease2.4.6%2Fckeditor%2Fplugins%2FCsdnLink%2Ficons%2Ficon-default.png%3Ft%3DQ239%22%2C%22id%22%3A%22RCGPyf-1784605795851%22%2C%22classes%22%3A%7B%22link-info%22%3A1%7D%7D&quot; data-cke-widget-editable=&quot;text&quot; data-cke-widget-keep-attr=&quot;0&quot; data-link-icon=&quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=Q239&quot; data-link-title=&quot;唯一访问令牌&quot; data-widget=&quot;csdnlink&quot; href=&quot;https://o0b.cn/icris&quot; title=&quot;唯一访问令牌&quot;&gt;&lt;strong&gt;唯一访问令牌&lt;/strong&gt;&lt;/a&gt;&lt;/span&gt;与项目标识；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;批量录入需要监控的商品 ID（自有店铺 + 竞品商品分开分组管理，方便后续分类统计）；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;自定义采集规则：设置单次最大抓取条数、轮询间隔时长，内置平台访问限流策略，无需手动调整延时；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;开启增量同步模式：系统自动记录已抓取评论唯一标识，后续仅同步新增评价，大幅减少重复数据与资源消耗。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;配置完成后，后台会生成专属数据访问地址，下文代码中仅需替换凭证参数即可直接运行，不用额外调试页面解析逻辑。&lt;/p&gt;&lt;h2&gt;三、完整 Python 实操代码（分三大模块）&lt;/h2&gt;&lt;h3&gt;模块 1：商品评论批量采集与数据存储脚本&lt;/h3&gt;&lt;p&gt;实现一次性拉取商品全量历史评价，过滤系统默认无意义好评，自动去重保存至本地 CSV 文件。&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;0&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20requests%5Cnimport%20pandas%20as%20pd%5Cnimport%20time%5Cnimport%20re%5Cn%5Cn%23%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE%E5%8C%BA%EF%BC%88%E6%9B%BF%E6%8D%A2%E4%B8%BA%E8%87%AA%E5%B7%B1%E5%90%8E%E5%8F%B0%E7%94%9F%E6%88%90%E7%9A%84%E5%87%AD%E8%AF%81%EF%BC%89%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5CnTOKEN%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9E%E8%AE%BF%E9%97%AE%E4%BB%A4%E7%89%8C%5C%22%5CnPROJECT_ID%20%3D%20%5C%22%E9%A1%B9%E7%9B%AE%E7%BC%96%E5%8F%B7%5C%22%5CnTARGET_GOODS_ID%20%3D%20%5C%22%E5%BE%85%E7%9B%91%E6%8E%A7%E5%95%86%E5%93%81ID%5C%22%5CnSAVE_FILE%20%3D%20%5C%22goods_comment_data.csv%5C%22%5Cn%23%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5Cn%5Cndef%20get_all_comments(goods_id%2C%20page%3D1)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E6%8B%89%E5%8F%96%E5%8D%95%E9%A1%B5%E5%95%86%E5%93%81%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE%5C%22%5C%22%5C%22%5Cn%20%20%20%20params%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22token%5C%22%3A%20TOKEN%2C%5Cn%20%20%20%20%20%20%20%20%5C%22project%5C%22%3A%20PROJECT_ID%2C%5Cn%20%20%20%20%20%20%20%20%5C%22goods_id%5C%22%3A%20goods_id%2C%5Cn%20%20%20%20%20%20%20%20%5C%22page%5C%22%3A%20page%2C%5Cn%20%20%20%20%20%20%20%20%5C%22sort%5C%22%3A%201%20%20%23%201%3D%E6%8C%89%E6%9C%80%E6%96%B0%E8%AF%84%E4%BB%B7%E6%8E%92%E5%BA%8F%EF%BC%8C0%3D%E7%BB%BC%E5%90%88%E6%8E%92%E5%BA%8F%5Cn%20%20%20%20%7D%5Cn%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20resp%20%3D%20requests.get(%5C%22https%3A%2F%2Ftask-data.clawopen.com%2Fquery%5C%22%2C%20params%3Dparams%2C%20timeout%3D20)%5Cn%20%20%20%20%20%20%20%20result%20%3D%20resp.json()%5Cn%20%20%20%20%20%20%20%20if%20result.get(%5C%22code%5C%22)%20!%3D%20200%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E6%95%B0%E6%8D%AE%E8%AF%B7%E6%B1%82%E5%BC%82%E5%B8%B8%EF%BC%9A%7Bresult.get(&amp;#39;msg&amp;#39;)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20None%5Cn%20%20%20%20%20%20%20%20return%20result.get(%5C%22data%5C%22%2C%20%7B%7D)%5Cn%20%20%20%20except%20Exception%20as%20e%3A%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E9%A1%B5%E9%9D%A2%7Bpage%7D%E9%87%87%E9%9B%86%E5%A4%B1%E8%B4%A5%EF%BC%8C%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF%EF%BC%9A%7Bstr(e)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20time.sleep(3)%5Cn%20%20%20%20%20%20%20%20return%20None%5Cn%5Cndef%20parse_comment_data(raw_data)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E7%BB%93%E6%9E%84%E5%8C%96%E8%A7%A3%E6%9E%90%E5%8E%9F%E5%A7%8B%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE%EF%BC%8C%E6%8F%90%E5%8F%96%E6%A0%B8%E5%BF%83%E5%AD%97%E6%AE%B5%5C%22%5C%22%5C%22%5Cn%20%20%20%20comment_list%20%3D%20%5B%5D%5Cn%20%20%20%20item_arr%20%3D%20raw_data.get(%5C%22item%5C%22%2C%20%5B%5D)%5Cn%20%20%20%20for%20item%20in%20item_arr%3A%5Cn%20%20%20%20%20%20%20%20%23%20%E5%90%88%E5%B9%B6%E4%B8%BB%E8%AF%84%2B%E8%BF%BD%E8%AF%84%E5%AE%8C%E6%95%B4%E6%96%87%E6%9C%AC%5Cn%20%20%20%20%20%20%20%20main_text%20%3D%20item.get(%5C%22rate_content%5C%22%2C%20%5C%22%5C%22)%5Cn%20%20%20%20%20%20%20%20append_text%20%3D%20item.get(%5C%22add_feedback%5C%22%2C%20%5C%22%5C%22)%5Cn%20%20%20%20%20%20%20%20full_content%20%3D%20f%5C%22%7Bmain_text%7D%20%7Bappend_text%7D%5C%22.strip()%5Cn%20%20%20%20%20%20%20%20%23%20%E8%BF%87%E6%BB%A4%E6%97%A0%E5%86%85%E5%AE%B9%E8%AF%84%E4%BB%B7%5Cn%20%20%20%20%20%20%20%20if%20len(full_content)%20%3C%202%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20continue%5Cn%20%20%20%20%20%20%20%20info%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22comment_id%5C%22%3A%20item.get(%5C%22rate_id%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22goods_id%5C%22%3A%20TARGET_GOODS_ID%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22user_name%5C%22%3A%20item.get(%5C%22display_user_nick%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22comment_text%5C%22%3A%20full_content%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22spec%5C%22%3A%20item.get(%5C%22auction_sku%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22publish_time%5C%22%3A%20item.get(%5C%22rate_date%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22has_img%5C%22%3A%201%20if%20item.get(%5C%22pics%5C%22)%20else%200%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22has_video%5C%22%3A%201%20if%20item.get(%5C%22video%5C%22)%20else%200%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22useful_num%5C%22%3A%20item.get(%5C%22useful_count%5C%22%2C%200)%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20comment_list.append(info)%5Cn%20%20%20%20return%20comment_list%2C%20raw_data.get(%5C%22total_results%5C%22%2C%200)%5Cn%5Cndef%20batch_fetch_all_comments()%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E5%88%86%E9%A1%B5%E5%BE%AA%E7%8E%AF%E6%8A%93%E5%8F%96%E5%85%A8%E9%83%A8%E5%8E%86%E5%8F%B2%E8%AF%84%E4%BB%B7%5C%22%5C%22%5C%22%5Cn%20%20%20%20all_data%20%3D%20%5B%5D%5Cn%20%20%20%20page%20%3D%201%5Cn%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20raw%20%3D%20get_all_comments(TARGET_GOODS_ID%2C%20page)%5Cn%20%20%20%20%20%20%20%20if%20not%20raw%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20break%5Cn%20%20%20%20%20%20%20%20page_data%2C%20total%20%3D%20parse_comment_data(raw)%5Cn%20%20%20%20%20%20%20%20if%20not%20page_data%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20break%5Cn%20%20%20%20%20%20%20%20all_data.extend(page_data)%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E5%B7%B2%E6%8A%93%E5%8F%96%E7%AC%AC%7Bpage%7D%E9%A1%B5%EF%BC%8C%E5%BD%93%E5%89%8D%E7%B4%AF%E8%AE%A1%7Blen(all_data)%7D%E6%9D%A1%E8%AF%84%E4%BB%B7%EF%BC%8C%E5%95%86%E5%93%81%E6%80%BB%E8%AF%84%E4%BB%B7%E6%95%B0%EF%BC%9A%7Btotal%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%23%20%E5%88%B0%E8%BE%BE%E6%9C%80%E5%90%8E%E4%B8%80%E9%A1%B5%E7%BB%88%E6%AD%A2%E5%BE%AA%E7%8E%AF%5Cn%20%20%20%20%20%20%20%20if%20len(all_data)%20%3E%3D%20int(total)%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20break%5Cn%20%20%20%20%20%20%20%20page%20%2B%3D%201%5Cn%20%20%20%20%20%20%20%20time.sleep(2)%5Cn%20%20%20%20%23%20%E6%95%B0%E6%8D%AE%E5%8E%BB%E9%87%8D%EF%BC%8C%E5%9F%BA%E4%BA%8E%E8%AF%84%E8%AE%BA%E5%94%AF%E4%B8%80ID%E8%BF%87%E6%BB%A4%E9%87%8D%E5%A4%8D%E5%86%85%E5%AE%B9%5Cn%20%20%20%20df%20%3D%20pd.DataFrame(all_data)%5Cn%20%20%20%20df.drop_duplicates(subset%3D%5B%5C%22comment_id%5C%22%5D%2C%20keep%3D%5C%22first%5C%22%2C%20inplace%3DTrue)%5Cn%20%20%20%20%23%20%E5%86%99%E5%85%A5%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6%EF%BC%8C%E4%B8%8D%E5%AD%98%E5%9C%A8%E5%88%99%E6%96%B0%E5%BB%BA%EF%BC%8C%E5%AD%98%E5%9C%A8%E5%88%99%E8%BF%BD%E5%8A%A0%5Cn%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20old_df%20%3D%20pd.read_csv(SAVE_FILE%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20%20%20%20%20df%20%3D%20pd.concat(%5Bold_df%2C%20df%5D%2C%20ignore_index%3DTrue)%5Cn%20%20%20%20%20%20%20%20df.drop_duplicates(subset%3D%5B%5C%22comment_id%5C%22%5D%2C%20keep%3D%5C%22first%5C%22%2C%20inplace%3DTrue)%5Cn%20%20%20%20except%20FileNotFoundError%3A%5Cn%20%20%20%20%20%20%20%20pass%5Cn%20%20%20%20df.to_csv(SAVE_FILE%2C%20index%3DFalse%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20print(f%5C%22%E5%85%A8%E9%87%8F%E9%87%87%E9%9B%86%E5%AE%8C%E6%88%90%EF%BC%8C%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6%E5%85%B1%E5%AD%98%E5%82%A8%7Blen(df)%7D%E6%9D%A1%E6%9C%89%E6%95%88%E8%AF%84%E4%BB%B7%5C%22)%5Cn%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20batch_fetch_all_comments()%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;requests
import&amp;nbsp;pandas&amp;nbsp;as&amp;nbsp;pd
import&amp;nbsp;time
import&amp;nbsp;re

#&amp;nbsp;=====================&amp;nbsp;基础配置区（替换为自己后台生成的凭证）&amp;nbsp;=====================
TOKEN&amp;nbsp;=&amp;nbsp;&amp;quot;你的专属访问令牌&amp;quot;
PROJECT_ID&amp;nbsp;=&amp;nbsp;&amp;quot;项目编号&amp;quot;
TARGET_GOODS_ID&amp;nbsp;=&amp;nbsp;&amp;quot;待监控商品ID&amp;quot;
SAVE_FILE&amp;nbsp;=&amp;nbsp;&amp;quot;goods_comment_data.csv&amp;quot;
#&amp;nbsp;==============================================================================

def&amp;nbsp;get_all_comments(goods_id,&amp;nbsp;page=1):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;拉取单页商品评价数据&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;token&amp;quot;:&amp;nbsp;TOKEN,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;project&amp;quot;:&amp;nbsp;PROJECT_ID,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;goods_id&amp;quot;:&amp;nbsp;goods_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sort&amp;quot;:&amp;nbsp;1&amp;nbsp;&amp;nbsp;#&amp;nbsp;1=按最新评价排序，0=综合排序
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.get(&amp;quot;https://task-data.clawopen.com/query&amp;quot;,&amp;nbsp;params=params,&amp;nbsp;timeout=20)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;resp.json()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;result.get(&amp;quot;code&amp;quot;)&amp;nbsp;!=&amp;nbsp;200:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;数据请求异常：{result.get(&amp;#39;msg&amp;#39;)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;result.get(&amp;quot;data&amp;quot;,&amp;nbsp;{})
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;页面{page}采集失败，错误信息：{str(e)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(3)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None

def&amp;nbsp;parse_comment_data(raw_data):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;结构化解析原始评价数据，提取核心字段&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment_list&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item_arr&amp;nbsp;=&amp;nbsp;raw_data.get(&amp;quot;item&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;item_arr:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;合并主评+追评完整文本
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;main_text&amp;nbsp;=&amp;nbsp;item.get(&amp;quot;rate_content&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;append_text&amp;nbsp;=&amp;nbsp;item.get(&amp;quot;add_feedback&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;full_content&amp;nbsp;=&amp;nbsp;f&amp;quot;{main_text}&amp;nbsp;{append_text}&amp;quot;.strip()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;过滤无内容评价
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(full_content)&amp;nbsp;&amp;lt;&amp;nbsp;2:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;comment_id&amp;quot;:&amp;nbsp;item.get(&amp;quot;rate_id&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;goods_id&amp;quot;:&amp;nbsp;TARGET_GOODS_ID,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;user_name&amp;quot;:&amp;nbsp;item.get(&amp;quot;display_user_nick&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;comment_text&amp;quot;:&amp;nbsp;full_content,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;spec&amp;quot;:&amp;nbsp;item.get(&amp;quot;auction_sku&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;publish_time&amp;quot;:&amp;nbsp;item.get(&amp;quot;rate_date&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;has_img&amp;quot;:&amp;nbsp;1&amp;nbsp;if&amp;nbsp;item.get(&amp;quot;pics&amp;quot;)&amp;nbsp;else&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;has_video&amp;quot;:&amp;nbsp;1&amp;nbsp;if&amp;nbsp;item.get(&amp;quot;video&amp;quot;)&amp;nbsp;else&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;useful_num&amp;quot;:&amp;nbsp;item.get(&amp;quot;useful_count&amp;quot;,&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment_list.append(info)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;comment_list,&amp;nbsp;raw_data.get(&amp;quot;total_results&amp;quot;,&amp;nbsp;0)

def&amp;nbsp;batch_fetch_all_comments():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;分页循环抓取全部历史评价&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_data&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;get_all_comments(TARGET_GOODS_ID,&amp;nbsp;page)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;raw:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page_data,&amp;nbsp;total&amp;nbsp;=&amp;nbsp;parse_comment_data(raw)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;page_data:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_data.extend(page_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;已抓取第{page}页，当前累计{len(all_data)}条评价，商品总评价数：{total}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;到达最后一页终止循环
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(all_data)&amp;nbsp;&amp;gt;=&amp;nbsp;int(total):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page&amp;nbsp;+=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;数据去重，基于评论唯一ID过滤重复内容
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;pd.DataFrame(all_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df.drop_duplicates(subset=[&amp;quot;comment_id&amp;quot;],&amp;nbsp;keep=&amp;quot;first&amp;quot;,&amp;nbsp;inplace=True)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;写入本地文件，不存在则新建，存在则追加
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;old_df&amp;nbsp;=&amp;nbsp;pd.read_csv(SAVE_FILE,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;pd.concat([old_df,&amp;nbsp;df],&amp;nbsp;ignore_index=True)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df.drop_duplicates(subset=[&amp;quot;comment_id&amp;quot;],&amp;nbsp;keep=&amp;quot;first&amp;quot;,&amp;nbsp;inplace=True)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;FileNotFoundError:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pass
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df.to_csv(SAVE_FILE,&amp;nbsp;index=False,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;全量采集完成，本地文件共存储{len(df)}条有效评价&amp;quot;)

if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;batch_fetch_all_comments()&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;模块 2：定时增量监控脚本（实时捕捉新增差评）&lt;/h3&gt;&lt;p&gt;程序后台常驻运行，每小时自动抓取当日新增评价，识别负面内容后打印告警，可自行扩展企业微信 / 邮件推送功能。&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;1&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20time%5Cnimport%20datetime%5Cnimport%20pandas%20as%20pd%5Cn%5Cn%23%20%E5%A4%8D%E7%94%A8%E6%A8%A1%E5%9D%971%E9%85%8D%E7%BD%AE%5CnTOKEN%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9E%E8%AE%BF%E9%97%AE%E4%BB%A4%E7%89%8C%5C%22%5CnPROJECT_ID%20%3D%20%5C%22%E9%A1%B9%E7%9B%AE%E7%BC%96%E5%8F%B7%5C%22%5CnTARGET_GOODS_ID%20%3D%20%5C%22%E5%BE%85%E7%9B%91%E6%8E%A7%E5%95%86%E5%93%81ID%5C%22%5CnSAVE_FILE%20%3D%20%5C%22goods_comment_data.csv%5C%22%5CnMONITOR_INTERVAL%20%3D%203600%20%20%23%20%E7%9B%91%E6%8E%A7%E8%BD%AE%E8%AF%A2%E9%97%B4%E9%9A%94%EF%BC%8C%E5%8D%95%E4%BD%8D%E7%A7%92%EF%BC%8C%E6%AD%A4%E5%A4%841%E5%B0%8F%E6%97%B6%5Cn%5Cndef%20check_new_comments()%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E5%8D%95%E6%AC%A1%E5%A2%9E%E9%87%8F%E6%8A%93%E5%8F%96%E6%96%B0%E5%A2%9E%E8%AF%84%E4%BB%B7%E5%B9%B6%E6%A3%80%E6%B5%8B%E8%B4%9F%E9%9D%A2%E5%86%85%E5%AE%B9%5C%22%5C%22%5C%22%5Cn%20%20%20%20from%20module1%20import%20get_all_comments%2C%20parse_comment_data%5Cn%20%20%20%20raw%20%3D%20get_all_comments(TARGET_GOODS_ID%2C%20page%3D1)%5Cn%20%20%20%20if%20not%20raw%3A%5Cn%20%20%20%20%20%20%20%20return%5Cn%20%20%20%20new_data%2C%20_%20%3D%20parse_comment_data(raw)%5Cn%20%20%20%20if%20not%20new_data%3A%5Cn%20%20%20%20%20%20%20%20return%5Cn%20%20%20%20%23%20%E8%AF%BB%E5%8F%96%E5%8E%86%E5%8F%B2%E6%95%B0%E6%8D%AE%EF%BC%8C%E5%AF%B9%E6%AF%94%E7%AD%9B%E9%80%89%E5%85%A8%E6%96%B0%E8%AF%84%E4%BB%B7%5Cn%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20history_df%20%3D%20pd.read_csv(SAVE_FILE%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20%20%20%20%20history_ids%20%3D%20set(history_df%5B%5C%22comment_id%5C%22%5D.tolist())%5Cn%20%20%20%20except%20FileNotFoundError%3A%5Cn%20%20%20%20%20%20%20%20history_ids%20%3D%20set()%5Cn%20%20%20%20new_valid%20%3D%20%5Brow%20for%20row%20in%20new_data%20if%20row%5B%5C%22comment_id%5C%22%5D%20not%20in%20history_ids%5D%5Cn%20%20%20%20if%20len(new_valid)%20%3D%3D%200%3A%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%7Bdatetime.datetime.now().strftime(&amp;#39;%25Y-%25m-%25d%20%25H%3A%25M%3A%25S&amp;#39;)%7D%20%E6%9A%82%E6%97%A0%E6%96%B0%E5%A2%9E%E8%AF%84%E4%BB%B7%5C%22)%5Cn%20%20%20%20%20%20%20%20return%5Cn%20%20%20%20%23%20%E6%96%B0%E5%A2%9E%E8%AF%84%E4%BB%B7%E5%85%A5%E5%BA%93%5Cn%20%20%20%20new_df%20%3D%20pd.DataFrame(new_valid)%5Cn%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20old_df%20%3D%20pd.read_csv(SAVE_FILE%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20%20%20%20%20total_df%20%3D%20pd.concat(%5Bold_df%2C%20new_df%5D%2C%20ignore_index%3DTrue)%5Cn%20%20%20%20except%20FileNotFoundError%3A%5Cn%20%20%20%20%20%20%20%20total_df%20%3D%20new_df%5Cn%20%20%20%20total_df.to_csv(SAVE_FILE%2C%20index%3DFalse%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20print(f%5C%22%E6%A3%80%E6%B5%8B%E5%88%B0%7Blen(new_valid)%7D%E6%9D%A1%E6%96%B0%E5%A2%9E%E8%AF%84%E4%BB%B7%EF%BC%8C%E5%B7%B2%E6%9B%B4%E6%96%B0%E6%9C%AC%E5%9C%B0%E6%95%B0%E6%8D%AE%5C%22)%5Cn%20%20%20%20%23%20%E7%AE%80%E6%98%93%E8%B4%9F%E9%9D%A2%E5%85%B3%E9%94%AE%E8%AF%8D%E9%A2%84%E8%AD%A6%EF%BC%88%E5%8F%AF%E8%87%AA%E8%A1%8C%E6%89%A9%E5%85%85%E8%AF%8D%E5%BA%93%EF%BC%89%5Cn%20%20%20%20negative_words%20%3D%20%7B%5C%22%E5%B7%AE%5C%22%2C%20%5C%22%E4%B8%8D%E5%A5%BD%5C%22%2C%20%5C%22%E7%91%95%E7%96%B5%5C%22%2C%20%5C%22%E6%8E%89%E8%89%B2%5C%22%2C%20%5C%22%E7%A0%B4%E6%8D%9F%5C%22%2C%20%5C%22%E5%8D%A1%E9%A1%BF%5C%22%2C%20%5C%22%E5%BC%82%E5%91%B3%5C%22%2C%20%5C%22%E4%B8%8D%E5%80%BC%5C%22%2C%20%5C%22%E6%BC%8F%E6%B0%B4%5C%22%2C%20%5C%22%E5%8F%98%E5%BD%A2%5C%22%7D%5Cn%20%20%20%20for%20item%20in%20new_valid%3A%5Cn%20%20%20%20%20%20%20%20text%20%3D%20item%5B%5C%22comment_text%5C%22%5D%5Cn%20%20%20%20%20%20%20%20if%20any(word%20in%20text%20for%20word%20in%20negative_words)%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(%5C%22%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%20%E8%B4%9F%E9%9D%A2%E8%AF%84%E4%BB%B7%E5%91%8A%E8%AD%A6%20%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E8%AF%84%E4%BB%B7%E6%97%B6%E9%97%B4%EF%BC%9A%7Bitem%5B&amp;#39;publishing_time&amp;#39;%5D%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E4%B9%B0%E5%AE%B6%E8%A7%84%E6%A0%BC%EF%BC%9A%7Bitem%5B&amp;#39;spec&amp;#39;%5D%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E8%AF%84%E4%BB%B7%E5%86%85%E5%AE%B9%EF%BC%9A%7Btext%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(%5C%22%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5C%22)%5Cn%5Cndef%20start_long_term_monitor()%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E5%90%AF%E5%8A%A8%E9%95%BF%E6%95%88%E5%90%8E%E5%8F%B0%E7%9B%91%E6%8E%A7%E5%BE%AA%E7%8E%AF%5C%22%5C%22%5C%22%5Cn%20%20%20%20print(%5C%22%E5%95%86%E5%93%81%E5%8F%A3%E7%A2%91%E5%AE%9E%E6%97%B6%E7%9B%91%E6%8E%A7%E7%A8%8B%E5%BA%8F%E5%B7%B2%E5%90%AF%E5%8A%A8%EF%BC%8C%E6%AF%8F%E5%B0%8F%E6%97%B6%E8%87%AA%E5%8A%A8%E6%A3%80%E6%B5%8B%E6%96%B0%E5%A2%9E%E8%AF%84%E4%BB%B7%5C%22)%5Cn%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20check_new_comments()%5Cn%20%20%20%20%20%20%20%20time.sleep(MONITOR_INTERVAL)%5Cn%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20start_long_term_monitor()%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;time
import&amp;nbsp;datetime
import&amp;nbsp;pandas&amp;nbsp;as&amp;nbsp;pd

#&amp;nbsp;复用模块1配置
TOKEN&amp;nbsp;=&amp;nbsp;&amp;quot;你的专属访问令牌&amp;quot;
PROJECT_ID&amp;nbsp;=&amp;nbsp;&amp;quot;项目编号&amp;quot;
TARGET_GOODS_ID&amp;nbsp;=&amp;nbsp;&amp;quot;待监控商品ID&amp;quot;
SAVE_FILE&amp;nbsp;=&amp;nbsp;&amp;quot;goods_comment_data.csv&amp;quot;
MONITOR_INTERVAL&amp;nbsp;=&amp;nbsp;3600&amp;nbsp;&amp;nbsp;#&amp;nbsp;监控轮询间隔，单位秒，此处1小时

def&amp;nbsp;check_new_comments():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;单次增量抓取新增评价并检测负面内容&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from&amp;nbsp;module1&amp;nbsp;import&amp;nbsp;get_all_comments,&amp;nbsp;parse_comment_data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;get_all_comments(TARGET_GOODS_ID,&amp;nbsp;page=1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;raw:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_data,&amp;nbsp;_&amp;nbsp;=&amp;nbsp;parse_comment_data(raw)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;new_data:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;读取历史数据，对比筛选全新评价
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;history_df&amp;nbsp;=&amp;nbsp;pd.read_csv(SAVE_FILE,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;history_ids&amp;nbsp;=&amp;nbsp;set(history_df[&amp;quot;comment_id&amp;quot;].tolist())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;FileNotFoundError:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;history_ids&amp;nbsp;=&amp;nbsp;set()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_valid&amp;nbsp;=&amp;nbsp;[row&amp;nbsp;for&amp;nbsp;row&amp;nbsp;in&amp;nbsp;new_data&amp;nbsp;if&amp;nbsp;row[&amp;quot;comment_id&amp;quot;]&amp;nbsp;not&amp;nbsp;in&amp;nbsp;history_ids]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(new_valid)&amp;nbsp;==&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;{datetime.datetime.now().strftime(&amp;#39;%Y-%m-%d&amp;nbsp;%H:%M:%S&amp;#39;)}&amp;nbsp;暂无新增评价&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;新增评价入库
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_df&amp;nbsp;=&amp;nbsp;pd.DataFrame(new_valid)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;old_df&amp;nbsp;=&amp;nbsp;pd.read_csv(SAVE_FILE,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_df&amp;nbsp;=&amp;nbsp;pd.concat([old_df,&amp;nbsp;new_df],&amp;nbsp;ignore_index=True)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;FileNotFoundError:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_df&amp;nbsp;=&amp;nbsp;new_df
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_df.to_csv(SAVE_FILE,&amp;nbsp;index=False,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;检测到{len(new_valid)}条新增评价，已更新本地数据&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;简易负面关键词预警（可自行扩充词库）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;negative_words&amp;nbsp;=&amp;nbsp;{&amp;quot;差&amp;quot;,&amp;nbsp;&amp;quot;不好&amp;quot;,&amp;nbsp;&amp;quot;瑕疵&amp;quot;,&amp;nbsp;&amp;quot;掉色&amp;quot;,&amp;nbsp;&amp;quot;破损&amp;quot;,&amp;nbsp;&amp;quot;卡顿&amp;quot;,&amp;nbsp;&amp;quot;异味&amp;quot;,&amp;nbsp;&amp;quot;不值&amp;quot;,&amp;nbsp;&amp;quot;漏水&amp;quot;,&amp;nbsp;&amp;quot;变形&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;new_valid:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text&amp;nbsp;=&amp;nbsp;item[&amp;quot;comment_text&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;any(word&amp;nbsp;in&amp;nbsp;text&amp;nbsp;for&amp;nbsp;word&amp;nbsp;in&amp;nbsp;negative_words):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;====================&amp;nbsp;负面评价告警&amp;nbsp;====================&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;评价时间：{item[&amp;#39;publishing_time&amp;#39;]}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;买家规格：{item[&amp;#39;spec&amp;#39;]}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;评价内容：{text}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;======================================================&amp;quot;)

def&amp;nbsp;start_long_term_monitor():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;启动长效后台监控循环&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;商品口碑实时监控程序已启动，每小时自动检测新增评价&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;check_new_comments()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(MONITOR_INTERVAL)

if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;start_long_term_monitor()&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;模块 3：评论情感分析 + 可视化报表生成&lt;/h3&gt;&lt;p&gt;基于分词与情感模型自动区分好评 / 中评 / 差评，提取高频痛点词汇，生成词云与评分分布图表，快速输出产品优化方向。&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;2&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20pandas%20as%20pd%5Cnimport%20jieba%5Cnfrom%20snownlp%20import%20SnowNLP%5Cnimport%20matplotlib.pyplot%20as%20plt%5Cnfrom%20wordcloud%20import%20WordCloud%5Cnfrom%20collections%20import%20Counter%5Cn%5Cn%23%20%E5%9B%BE%E8%A1%A8%E4%B8%AD%E6%96%87%E6%98%BE%E7%A4%BA%E9%85%8D%E7%BD%AE%5Cnplt.rcParams%5B%5C%22font.sans-serif%5C%22%5D%20%3D%20%5B%5C%22SimHei%5C%22%5D%5Cnplt.rcParams%5B%5C%22axes.unicode_minus%5C%22%5D%20%3D%20False%5CnSAVE_FILE%20%3D%20%5C%22goods_comment_data.csv%5C%22%5Cn%23%20%E6%97%A0%E6%84%8F%E4%B9%89%E5%81%9C%E7%94%A8%E8%AF%8D%E8%BF%87%E6%BB%A4%E5%BA%93%5CnSTOP_WORDS%20%3D%20%7B%5C%22%E7%9A%84%5C%22%2C%20%5C%22%E4%BA%86%5C%22%2C%20%5C%22%E5%BE%88%5C%22%2C%20%5C%22%E6%AF%94%E8%BE%83%5C%22%2C%20%5C%22%E5%B0%B1%E6%98%AF%5C%22%2C%20%5C%22%E8%BF%98%5C%22%2C%20%5C%22%E6%9C%89%E7%82%B9%5C%22%2C%20%5C%22%E4%BD%86%E6%98%AF%5C%22%2C%20%5C%22%E9%9D%9E%E5%B8%B8%5C%22%2C%20%5C%22%E6%84%9F%E8%A7%89%5C%22%2C%20%5C%22%E4%B8%80%E8%88%AC%5C%22%2C%20%5C%22%E8%BF%99%E4%B8%AA%5C%22%2C%20%5C%22%E4%B8%9C%E8%A5%BF%5C%22%2C%20%5C%22%E4%B9%B0%E6%9D%A5%5C%22%7D%5Cn%5Cndef%20sentiment_classify()%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E6%83%85%E6%84%9F%E6%89%93%E5%88%86%EF%BC%8C%E5%88%92%E5%88%86%E5%A5%BD%E8%AF%84%E3%80%81%E4%B8%AD%E8%AF%84%E3%80%81%E5%B7%AE%E8%AF%84%5C%22%5C%22%5C%22%5Cn%20%20%20%20df%20%3D%20pd.read_csv(SAVE_FILE%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20sentiment_res%20%3D%20%5B%5D%5Cn%20%20%20%20all_words%20%3D%20%5B%5D%5Cn%20%20%20%20negative_words_pool%20%3D%20%5B%5D%5Cn%20%20%20%20for%20_%2C%20row%20in%20df.iterrows()%3A%5Cn%20%20%20%20%20%20%20%20text%20%3D%20row%5B%5C%22comment_text%5C%22%5D%5Cn%20%20%20%20%20%20%20%20s%20%3D%20SnowNLP(text)%5Cn%20%20%20%20%20%20%20%20score%20%3D%20s.sentiments%5Cn%20%20%20%20%20%20%20%20%23%20%E6%83%85%E6%84%9F%E9%98%88%E5%80%BC%E5%88%92%E5%88%86%5Cn%20%20%20%20%20%20%20%20if%20score%20%3E%3D%200.6%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20label%20%3D%20%5C%22%E5%A5%BD%E8%AF%84%5C%22%5Cn%20%20%20%20%20%20%20%20elif%20score%20%3E%3D%200.3%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20label%20%3D%20%5C%22%E4%B8%AD%E8%AF%84%5C%22%5Cn%20%20%20%20%20%20%20%20else%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20label%20%3D%20%5C%22%E5%B7%AE%E8%AF%84%5C%22%5Cn%20%20%20%20%20%20%20%20sentiment_res.append(label)%5Cn%20%20%20%20%20%20%20%20%23%20%E5%88%86%E8%AF%8D%E5%A4%84%E7%90%86%5Cn%20%20%20%20%20%20%20%20cut_words%20%3D%20jieba.lcut(text)%5Cn%20%20%20%20%20%20%20%20valid_words%20%3D%20%5Bw%20for%20w%20in%20cut_words%20if%20w%20not%20in%20STOP_WORDS%20and%20len(w)%20%3E%201%5D%5Cn%20%20%20%20%20%20%20%20all_words.extend(valid_words)%5Cn%20%20%20%20%20%20%20%20if%20label%20%3D%3D%20%5C%22%E5%B7%AE%E8%AF%84%5C%22%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20negative_words_pool.extend(valid_words)%5Cn%20%20%20%20df%5B%5C%22sentiment_label%5C%22%5D%20%3D%20sentiment_res%5Cn%20%20%20%20%23%20%E4%BF%9D%E5%AD%98%E5%B8%A6%E6%83%85%E6%84%9F%E6%A0%87%E7%AD%BE%E7%9A%84%E5%AE%8C%E6%95%B4%E6%95%B0%E6%8D%AE%5Cn%20%20%20%20df.to_csv(%5C%22comment_with_sentiment.csv%5C%22%2C%20index%3DFalse%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20return%20df%2C%20all_words%2C%20negative_words_pool%5Cn%5Cndef%20draw_analysis_chart(df%2C%20all_words%2C%20negative_words)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E7%BB%98%E5%88%B6%E8%AF%84%E5%88%86%E5%88%86%E5%B8%83%E5%9B%BE%E8%A1%A8%E3%80%81%E5%85%A8%E9%87%8F%E8%AF%84%E4%BB%B7%E8%AF%8D%E4%BA%91%E3%80%81%E5%B7%AE%E8%AF%84%E7%97%9B%E7%82%B9%E8%AF%8D%E4%BA%91%5C%22%5C%22%5C%22%5Cn%20%20%20%20%23%201.%20%E6%83%85%E6%84%9F%E5%88%86%E5%B8%83%E6%9F%B1%E7%8A%B6%E5%9B%BE%5Cn%20%20%20%20sentiment_count%20%3D%20df%5B%5C%22sentiment_label%5C%22%5D.value_counts()%5Cn%20%20%20%20fig%2C%20axes%20%3D%20plt.subplots(1%2C%203%2C%20figsize%3D(18%2C%206))%5Cn%20%20%20%20axes%5B0%5D.bar(sentiment_count.index%2C%20sentiment_count.values%2C%20color%3D%5B%5C%22%2366cc66%5C%22%2C%20%5C%22%23ffcc66%5C%22%2C%20%5C%22%23ff6666%5C%22%5D)%5Cn%20%20%20%20axes%5B0%5D.set_title(%5C%22%E5%95%86%E5%93%81%E8%AF%84%E4%BB%B7%E6%83%85%E6%84%9F%E5%88%86%E5%B8%83%E7%BB%9F%E8%AE%A1%5C%22%2C%20fontsize%3D14)%5Cn%20%20%20%20axes%5B0%5D.set_ylabel(%5C%22%E8%AF%84%E4%BB%B7%E6%95%B0%E9%87%8F%5C%22)%5Cn%5Cn%20%20%20%20%23%202.%20%E5%85%A8%E9%87%8F%E8%AF%84%E4%BB%B7%E8%AF%8D%E4%BA%91%5Cn%20%20%20%20full_text%20%3D%20%5C%22%20%5C%22.join(all_words)%5Cn%20%20%20%20wc1%20%3D%20WordCloud(width%3D600%2C%20height%3D400%2C%20background_color%3D%5C%22white%5C%22%2C%20font_path%3D%5C%22simhei.ttf%5C%22).generate(full_text)%5Cn%20%20%20%20axes%5B1%5D.imshow(wc1)%5Cn%20%20%20%20axes%5B1%5D.axis(%5C%22off%5C%22)%5Cn%20%20%20%20axes%5B1%5D.set_title(%5C%22%E5%85%A8%E9%83%A8%E8%AF%84%E4%BB%B7%E9%AB%98%E9%A2%91%E8%AF%8D%E4%BA%91%5C%22%2C%20fontsize%3D14)%5Cn%5Cn%20%20%20%20%23%203.%20%E5%B7%AE%E8%AF%84%E7%97%9B%E7%82%B9%E8%AF%8D%E4%BA%91%5Cn%20%20%20%20neg_text%20%3D%20%5C%22%20%5C%22.join(negative_words)%5Cn%20%20%20%20wc2%20%3D%20WordCloud(width%3D600%2C%20height%3D400%2C%20background_color%3D%5C%22white%5C%22%2C%20font_path%3D%5C%22simhei.ttf%5C%22).generate(neg_text)%5Cn%20%20%20%20axes%5B2%5D.imshow(wc2)%5Cn%20%20%20%20axes%5B2%5D.axis(%5C%22off%5C%22)%5Cn%20%20%20%20axes%5B2%5D.set_title(%5C%22%E5%B7%AE%E8%AF%84%E7%97%9B%E7%82%B9%E5%85%B3%E9%94%AE%E8%AF%8D%E4%BA%91%5C%22%2C%20fontsize%3D14)%5Cn%5Cn%20%20%20%20plt.tight_layout()%5Cn%20%20%20%20plt.savefig(%5C%22comment_analysis_report.png%5C%22%2C%20dpi%3D300)%5Cn%20%20%20%20plt.show()%5Cn%5Cndef%20stat_hot_keywords(word_list%2C%20top_num%3D15)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E7%BB%9F%E8%AE%A1TOP%E9%AB%98%E9%A2%91%E5%85%B3%E9%94%AE%E8%AF%8D%5C%22%5C%22%5C%22%5Cn%20%20%20%20count%20%3D%20Counter(word_list)%5Cn%20%20%20%20top_words%20%3D%20count.most_common(top_num)%5Cn%20%20%20%20print(f%5C%22%5C%5CnTOP%7Btop_num%7D%E9%AB%98%E9%A2%91%E7%94%A8%E6%88%B7%E8%AF%8D%E6%B1%87%EF%BC%9A%5C%22)%5Cn%20%20%20%20for%20word%2C%20num%20in%20top_words%3A%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%7Bword%7D%EF%BC%9A%7Bnum%7D%E6%AC%A1%5C%22)%5Cn%20%20%20%20return%20top_words%5Cn%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20data_df%2C%20all_word_list%2C%20neg_word_list%20%3D%20sentiment_classify()%5Cn%20%20%20%20draw_analysis_chart(data_df%2C%20all_word_list%2C%20neg_word_list)%5Cn%20%20%20%20stat_hot_keywords(all_word_list%2C%2015)%5Cn%20%20%20%20print(%5C%22%5C%5Cn%E5%B7%AE%E8%AF%84%E9%AB%98%E9%A2%91%E7%97%9B%E7%82%B9%E8%AF%8D%E6%B1%87%EF%BC%9A%5C%22)%5Cn%20%20%20%20stat_hot_keywords(neg_word_list%2C%2010)%5Cn%20%20%20%20print(%5C%22%E5%88%86%E6%9E%90%E6%8A%A5%E8%A1%A8%E5%B7%B2%E7%94%9F%E6%88%90%EF%BC%9Acomment_with_sentiment.csv%E3%80%81comment_analysis_report.png%5C%22)%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;pandas&amp;nbsp;as&amp;nbsp;pd
import&amp;nbsp;jieba
from&amp;nbsp;snownlp&amp;nbsp;import&amp;nbsp;SnowNLP
import&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt
from&amp;nbsp;wordcloud&amp;nbsp;import&amp;nbsp;WordCloud
from&amp;nbsp;collections&amp;nbsp;import&amp;nbsp;Counter

#&amp;nbsp;图表中文显示配置
plt.rcParams[&amp;quot;font.sans-serif&amp;quot;]&amp;nbsp;=&amp;nbsp;[&amp;quot;SimHei&amp;quot;]
plt.rcParams[&amp;quot;axes.unicode_minus&amp;quot;]&amp;nbsp;=&amp;nbsp;False
SAVE_FILE&amp;nbsp;=&amp;nbsp;&amp;quot;goods_comment_data.csv&amp;quot;
#&amp;nbsp;无意义停用词过滤库
STOP_WORDS&amp;nbsp;=&amp;nbsp;{&amp;quot;的&amp;quot;,&amp;nbsp;&amp;quot;了&amp;quot;,&amp;nbsp;&amp;quot;很&amp;quot;,&amp;nbsp;&amp;quot;比较&amp;quot;,&amp;nbsp;&amp;quot;就是&amp;quot;,&amp;nbsp;&amp;quot;还&amp;quot;,&amp;nbsp;&amp;quot;有点&amp;quot;,&amp;nbsp;&amp;quot;但是&amp;quot;,&amp;nbsp;&amp;quot;非常&amp;quot;,&amp;nbsp;&amp;quot;感觉&amp;quot;,&amp;nbsp;&amp;quot;一般&amp;quot;,&amp;nbsp;&amp;quot;这个&amp;quot;,&amp;nbsp;&amp;quot;东西&amp;quot;,&amp;nbsp;&amp;quot;买来&amp;quot;}

def&amp;nbsp;sentiment_classify():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;情感打分，划分好评、中评、差评&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;pd.read_csv(SAVE_FILE,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sentiment_res&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_words&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;negative_words_pool&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;_,&amp;nbsp;row&amp;nbsp;in&amp;nbsp;df.iterrows():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text&amp;nbsp;=&amp;nbsp;row[&amp;quot;comment_text&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s&amp;nbsp;=&amp;nbsp;SnowNLP(text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;score&amp;nbsp;=&amp;nbsp;s.sentiments
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;情感阈值划分
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;score&amp;nbsp;&amp;gt;=&amp;nbsp;0.6:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;label&amp;nbsp;=&amp;nbsp;&amp;quot;好评&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;score&amp;nbsp;&amp;gt;=&amp;nbsp;0.3:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;label&amp;nbsp;=&amp;nbsp;&amp;quot;中评&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;label&amp;nbsp;=&amp;nbsp;&amp;quot;差评&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sentiment_res.append(label)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;分词处理
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cut_words&amp;nbsp;=&amp;nbsp;jieba.lcut(text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;valid_words&amp;nbsp;=&amp;nbsp;[w&amp;nbsp;for&amp;nbsp;w&amp;nbsp;in&amp;nbsp;cut_words&amp;nbsp;if&amp;nbsp;w&amp;nbsp;not&amp;nbsp;in&amp;nbsp;STOP_WORDS&amp;nbsp;and&amp;nbsp;len(w)&amp;nbsp;&amp;gt;&amp;nbsp;1]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_words.extend(valid_words)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;label&amp;nbsp;==&amp;nbsp;&amp;quot;差评&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;negative_words_pool.extend(valid_words)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df[&amp;quot;sentiment_label&amp;quot;]&amp;nbsp;=&amp;nbsp;sentiment_res
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;保存带情感标签的完整数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df.to_csv(&amp;quot;comment_with_sentiment.csv&amp;quot;,&amp;nbsp;index=False,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;df,&amp;nbsp;all_words,&amp;nbsp;negative_words_pool

def&amp;nbsp;draw_analysis_chart(df,&amp;nbsp;all_words,&amp;nbsp;negative_words):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;绘制评分分布图表、全量评价词云、差评痛点词云&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;1.&amp;nbsp;情感分布柱状图
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sentiment_count&amp;nbsp;=&amp;nbsp;df[&amp;quot;sentiment_label&amp;quot;].value_counts()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fig,&amp;nbsp;axes&amp;nbsp;=&amp;nbsp;plt.subplots(1,&amp;nbsp;3,&amp;nbsp;figsize=(18,&amp;nbsp;6))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;axes[0].bar(sentiment_count.index,&amp;nbsp;sentiment_count.values,&amp;nbsp;color=[&amp;quot;#66cc66&amp;quot;,&amp;nbsp;&amp;quot;#ffcc66&amp;quot;,&amp;nbsp;&amp;quot;#ff6666&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;axes[0].set_title(&amp;quot;商品评价情感分布统计&amp;quot;,&amp;nbsp;fontsize=14)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;axes[0].set_ylabel(&amp;quot;评价数量&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;2.&amp;nbsp;全量评价词云
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;full_text&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;nbsp;&amp;quot;.join(all_words)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wc1&amp;nbsp;=&amp;nbsp;WordCloud(width=600,&amp;nbsp;height=400,&amp;nbsp;background_color=&amp;quot;white&amp;quot;,&amp;nbsp;font_path=&amp;quot;simhei.ttf&amp;quot;).generate(full_text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;axes[1].imshow(wc1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;axes[1].axis(&amp;quot;off&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;axes[1].set_title(&amp;quot;全部评价高频词云&amp;quot;,&amp;nbsp;fontsize=14)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;3.&amp;nbsp;差评痛点词云
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;neg_text&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;nbsp;&amp;quot;.join(negative_words)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wc2&amp;nbsp;=&amp;nbsp;WordCloud(width=600,&amp;nbsp;height=400,&amp;nbsp;background_color=&amp;quot;white&amp;quot;,&amp;nbsp;font_path=&amp;quot;simhei.ttf&amp;quot;).generate(neg_text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;axes[2].imshow(wc2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;axes[2].axis(&amp;quot;off&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;axes[2].set_title(&amp;quot;差评痛点关键词云&amp;quot;,&amp;nbsp;fontsize=14)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.tight_layout()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.savefig(&amp;quot;comment_analysis_report.png&amp;quot;,&amp;nbsp;dpi=300)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.show()

def&amp;nbsp;stat_hot_keywords(word_list,&amp;nbsp;top_num=15):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;统计TOP高频关键词&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count&amp;nbsp;=&amp;nbsp;Counter(word_list)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;top_words&amp;nbsp;=&amp;nbsp;count.most_common(top_num)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;\nTOP{top_num}高频用户词汇：&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;word,&amp;nbsp;num&amp;nbsp;in&amp;nbsp;top_words:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;{word}：{num}次&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;top_words

if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data_df,&amp;nbsp;all_word_list,&amp;nbsp;neg_word_list&amp;nbsp;=&amp;nbsp;sentiment_classify()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;draw_analysis_chart(data_df,&amp;nbsp;all_word_list,&amp;nbsp;neg_word_list)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stat_hot_keywords(all_word_list,&amp;nbsp;15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;\n差评高频痛点词汇：&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stat_hot_keywords(neg_word_list,&amp;nbsp;10)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;分析报表已生成：comment_with_sentiment.csv、comment_analysis_report.png&amp;quot;)&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;四、落地使用实操指南&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;环境依赖安装&lt;/strong&gt; 新建 Python 虚拟环境，执行以下命令安装所需第三方库：&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;3&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22pip%20install%20requests%20pandas%20jieba%20snownlp%20matplotlib%20wordcloud%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;pip&amp;nbsp;install&amp;nbsp;requests&amp;nbsp;pandas&amp;nbsp;jieba&amp;nbsp;snownlp&amp;nbsp;matplotlib&amp;nbsp;wordcloud&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;参数替换&lt;/strong&gt; 将代码中&lt;code&gt;TOKEN&lt;/code&gt;、&lt;code&gt;PROJECT_ID&lt;/code&gt;、&lt;code&gt;TARGET_GOODS_ID&lt;/code&gt;全部替换为 OpenClaw 后台生成的专属信息，多商品监控可封装循环批量处理。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;分步执行流程&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;第一步：运行模块 1，一次性抓取商品全部历史评价，建立本地基础数据库；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;第二步：后台启动模块 2 监控脚本，长期实时跟踪新增评价，负面反馈即时预警；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;第三步：每日 / 每周运行模块 3，生成完整情感分析报表，提炼产品优化痛点。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;拓展优化方向&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;消息推送：对接企业微信机器人、邮件接口，新增差评自动推送运营人员；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;数据库存储：将 CSV 替换为 MySQL/SQLite，支持上万条商品长期数据存储；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;关键词自定义：扩充负面词库，区分物流、材质、售后、尺寸等多维度痛点；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;多商品批量监控：循环遍历商品 ID 列表，同时跟踪数十款竞品口碑变化。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;五、方案优势对比（对比传统爬虫）&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;稳定性更强&lt;/strong&gt;：底层已适配平台访问规则，无需手动维护 Cookie、UA、延时策略，不会频繁被限制访问；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;开发成本极低&lt;/strong&gt;：不用分析页面动态渲染逻辑，无需反复调试页面改版适配，开箱即用；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;功能覆盖完整&lt;/strong&gt;：原生支持分页、增量同步、晒图 / 视频 / 追评全字段获取，省去大量解析代码；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;轻量化部署&lt;/strong&gt;：单台普通电脑即可运行，无需服务器集群，中小商家、个人调研完全够用；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;长期监控省心&lt;/strong&gt;：自动去重、增量抓取，避免重复采集浪费资源，负面舆情实时预警。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;六、合规与使用提醒&lt;/h2&gt;&lt;p&gt;本套方案仅适用于个人学习、自有店铺运营优化、竞品市场调研等非大规模商用场景；采集数据仅用于内部产品分析，禁止未经授权批量分发、售卖采集到的用户评价信息，遵守电商平台用户协议与网络数据相关法律法规。&lt;/p&gt;&lt;h2&gt;总结&lt;/h2&gt;&lt;p&gt;借助 OpenClaw 数据工具搭配 Python 轻量脚本，仅需 30 分钟就能搭建一套完整的电商商品口碑监控分析体系，告别手动复制整理评论的低效工作。从历史评价批量采集、长效实时监控，到文本情感挖掘、可视化痛点报表，全链路自动化落地，不管是产品经理挖掘用户需求、运营实时处理差评舆情，还是竞品调研分析市场反馈，都能大幅提升工作效率。&lt;/p&gt;&lt;p&gt;整套代码可直接复制运行，仅替换后台凭证即可快速投入使用，后续可根据自身业务需求扩展消息推送、数据库存储、多维度关键词分类等进阶功能。&lt;/p&gt;&lt;p&gt;&lt;span data-cke-copybin-end=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 21 Jul 2026 11:52:27 +0800</pubDate></item><item><title>电商竞品口碑自动化监控与深度数据分析实战（完整可运行 Python 源码）</title><link>https://shopapi.com.cn/?id=200</link><description>&lt;p&gt;&lt;span data-cke-copybin-start=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;前言&lt;/h2&gt;&lt;p&gt;做电商运营、产品调研、竞品分析的朋友，几乎都有同一个痛点：想要持续追踪商品用户评价，手动翻页复制效率极低，批量对比多款竞品口碑、挖掘差评痛点、统计好评卖点更是耗时耗力。&lt;/p&gt;&lt;p&gt;很多人尝试页面批量抓取，又频繁遇到限制、页面结构变动失效、数据不全（晒图、追评、购买规格丢失）等问题。今天给大家分享一套基于 OpenClaw 稳定数据通道搭建的&lt;strong&gt;全自动评论监控分析方案&lt;/strong&gt;，无需复杂环境部署，普通电脑即可 7×24 小时增量监控商品评价，自动完成数据清洗、情感分类、词频统计，输出可视化报表，新手半小时就能完整跑通整套流程。&lt;/p&gt;&lt;p&gt;本文全程无晦涩底层配置，附带完整可运行代码，适配淘宝 / 天猫全品类商品，支持全量历史评论采集 + 实时新增评论增量监控，适合商家做自有店铺口碑预警、运营做竞品用户需求挖掘、数据分析从业者做电商文本挖掘实验。&lt;/p&gt;&lt;h2&gt;一、整体方案架构说明&lt;/h2&gt;&lt;p&gt;整套工具分为四大核心模块，轻量化无分布式成本：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据同步采集模块&lt;/strong&gt; 输入商品唯一标识，即可拉取完整评价数据集，包含评价正文、评价时间、晒图素材、买家购买规格、追评内容、卖家回复等全部字段；支持两种排序模式：默认综合排序、最新评价优先排序，自动分页循环拉取，无需手动处理分页逻辑。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;增量实时监控模块&lt;/strong&gt; 内置数据去重逻辑，定时循环轮询目标商品，仅抓取新增评价，大幅降低资源消耗；可配置差评自动提醒，出现负面评价即时输出预警信息，实现全天候口碑监控。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据清洗存储模块&lt;/strong&gt; 自动过滤空白无效评价、脱敏冗余文本，统一规整时间、规格、图文链接字段；小规模使用直接保存 CSV 表格，长期大批量监控可无缝切换 SQLite 本地数据库存储。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;智能文本分析模块&lt;/strong&gt; 结合中文分词区分好评 / 中评 / 差评，统计负面高频痛点词汇、好评核心卖点；自动生成评分分布统计图、评价时间趋势图，直观展示商品口碑变化。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;二、前期准备工作&lt;/h2&gt;&lt;h3&gt;2.1 工具权限配置&lt;/h3&gt;&lt;p&gt;登录控制台，创建数据项目，获取两组凭证：&lt;span aria-label=&quot;a 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_inline cke_widget_csdnlink cke_widget_wrapper_link-info cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;a&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;5&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;link-info cke_widget_editable cke_widget_element&quot; contenteditable=&quot;true&quot; data-cke-enter-mode=&quot;2&quot; data-cke-widget-data=&quot;%7B%22url%22%3A%22https%3A%2F%2Fo0b.cn%2Ficris%22%2C%22text%22%3A%22%E8%AE%BF%E9%97%AE%E5%AF%86%E9%92%A5%22%2C%22desc%22%3A%22%22%2C%22icon%22%3A%22%22%2C%22isCard%22%3Afalse%2C%22hasResquest%22%3Atrue%2C%22iconDefault%22%3A%22https%3A%2F%2Fcsdnimg.cn%2Frelease%2Fblog_editor_html%2Frelease2.4.6%2Fckeditor%2Fplugins%2FCsdnLink%2Ficons%2Ficon-default.png%3Ft%3DQ239%22%2C%22id%22%3A%22iQyWHe-1784598297889%22%2C%22classes%22%3A%7B%22link-info%22%3A1%7D%7D&quot; data-cke-widget-editable=&quot;text&quot; data-cke-widget-keep-attr=&quot;0&quot; data-link-icon=&quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=Q239&quot; data-link-title=&quot;访问密钥&quot; data-widget=&quot;csdnlink&quot; href=&quot;https://o0b.cn/icris&quot; title=&quot;访问密钥&quot;&gt;&lt;strong&gt;访问密钥&lt;/strong&gt;&lt;/a&gt;&lt;/span&gt;、安全密钥，用于稳定数据通道鉴权，所有数据请求均通过加密校验，合规稳定。&lt;/p&gt;&lt;h3&gt;2.2 提取商品唯一标识&lt;/h3&gt;&lt;p&gt;打开目标商品详情页，从商品链接中提取数字 ID（链接&lt;code&gt;id=xxxx&lt;/code&gt;后的数字串），后续代码仅需填入该数字即可绑定对应商品。&lt;/p&gt;&lt;h3&gt;2.3 Python 环境依赖安装&lt;/h3&gt;&lt;p&gt;打开终端执行命令，安装项目所需第三方库：&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;0&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22pip%20install%20requests%20pandas%20jieba%20wordcloud%20matplotlib%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;pip&amp;nbsp;install&amp;nbsp;requests&amp;nbsp;pandas&amp;nbsp;jieba&amp;nbsp;wordcloud&amp;nbsp;matplotlib&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;三、完整实战代码（分模块讲解）&lt;/h2&gt;&lt;h3&gt;3.1 核心数据采集工具类（获取商品全量评价）&lt;/h3&gt;&lt;p&gt;封装数据拉取、分页循环、数据解析逻辑，自动处理缓存、返回格式、语言适配，支持自定义采集页数、排序规则。&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;1&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20requests%5Cnimport%20json%5Cnimport%20time%5Cnimport%20pandas%20as%20pd%5Cnimport%20jieba%5Cnfrom%20collections%20import%20Counter%5Cnimport%20matplotlib.pyplot%20as%20plt%5Cnfrom%20wordcloud%20import%20WordCloud%5Cn%5Cn%23%20%E5%85%A8%E5%B1%80%E9%85%8D%E7%BD%AE%EF%BC%88%E6%9B%BF%E6%8D%A2%E4%B8%BA%E8%87%AA%E5%B7%B1%E6%8E%A7%E5%88%B6%E5%8F%B0%E8%8E%B7%E5%8F%96%E7%9A%84%E5%87%AD%E8%AF%81%EF%BC%89%5CnACCESS_KEY%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E8%AE%BF%E9%97%AE%E5%AF%86%E9%92%A5%5C%22%5CnSEC_KEY%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E5%AE%89%E5%85%A8%E5%AF%86%E9%92%A5%5C%22%5Cn%23%20%E5%85%A8%E5%B1%80%E5%AD%98%E5%82%A8%E8%AF%84%E8%AE%BA%E5%88%97%E8%A1%A8%5Cnall_comment_data%20%3D%20%5B%5D%5Cn%5Cnclass%20CommentCollector%3A%5Cn%20%20%20%20def%20__init__(self)%3A%5Cn%20%20%20%20%20%20%20%20self.base_url%20%3D%20%5C%22%E7%A8%B3%E5%AE%9A%E6%95%B0%E6%8D%AE%E9%80%9A%E9%81%93%E5%9C%B0%E5%9D%80%5C%22%5Cn%20%20%20%20%20%20%20%20self.cache_switch%20%3D%20%5C%22yes%5C%22%20%20%23%20%E5%BC%80%E5%90%AF%E7%BC%93%E5%AD%98%E6%8F%90%E5%8D%87%E8%AE%BF%E9%97%AE%E9%80%9F%E5%BA%A6%5Cn%20%20%20%20%20%20%20%20self.data_format%20%3D%20%5C%22json%5C%22%20%23%20%E8%BF%94%E5%9B%9E%E7%BB%93%E6%9E%84%E5%8C%96json%E6%95%B0%E6%8D%AE%5Cn%5Cn%20%20%20%20def%20get_single_page_comment(self%2C%20item_id%2C%20page%3D1%2C%20sort_type%3D0)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20%E5%8D%95%E9%A1%B5%E8%AF%84%E4%BB%B7%E9%87%87%E9%9B%86%5Cn%20%20%20%20%20%20%20%20%3Aparam%20item_id%3A%20%E5%95%86%E5%93%81%E6%95%B0%E5%AD%97ID%5Cn%20%20%20%20%20%20%20%20%3Aparam%20page%3A%20%E5%88%86%E9%A1%B5%E9%A1%B5%E7%A0%81%5Cn%20%20%20%20%20%20%20%20%3Aparam%20sort_type%3A%200%E7%BB%BC%E5%90%88%E6%8E%92%E5%BA%8F%20%2F%201%E6%9C%80%E6%96%B0%E8%AF%84%E4%BB%B7%E6%8E%92%E5%BA%8F%5Cn%20%20%20%20%20%20%20%20%3Areturn%3A%20%E5%8D%95%E9%A1%B5%E7%BB%93%E6%9E%84%E5%8C%96%E8%AF%84%E4%BB%B7%E5%88%97%E8%A1%A8%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20%23%20%E7%BB%84%E8%A3%85%E8%AF%B7%E6%B1%82%E5%8F%82%E6%95%B0%5Cn%20%20%20%20%20%20%20%20params%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22key%5C%22%3A%20ACCESS_KEY%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22secret%5C%22%3A%20SEC_KEY%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22cache%5C%22%3A%20self.cache_switch%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22result_type%5C%22%3A%20self.data_format%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22num_iid%5C%22%3A%20item_id%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22page%5C%22%3A%20page%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22sort%5C%22%3A%20sort_type%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20resp%20%3D%20requests.get(url%3Dself.base_url%2C%20params%3Dparams%2C%20timeout%3D12)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20result%20%3D%20json.loads(resp.text)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%88%A4%E6%96%AD%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20%5C%22rateList%5C%22%20not%20in%20result.get(%5C%22result%5C%22%2C%20%7B%7D)%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%5B%5D%5Cn%20%20%20%20%20%20%20%20%20%20%20%20rate_list%20%3D%20result%5B%5C%22result%5C%22%5D%5B%5C%22rateList%5C%22%5D%5Cn%20%20%20%20%20%20%20%20%20%20%20%20parse_res%20%3D%20%5B%5D%5Cn%20%20%20%20%20%20%20%20%20%20%20%20for%20item%20in%20rate_list%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20info%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E8%AF%84%E4%BB%B7%E6%97%B6%E9%97%B4%5C%22%3A%20item.get(%5C%22rate_date%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E8%AF%84%E4%BB%B7%E5%86%85%E5%AE%B9%5C%22%3A%20item.get(%5C%22rate_content%5C%22%2C%20%5C%22%5C%22).strip()%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E8%B4%AD%E4%B9%B0%E8%A7%84%E6%A0%BC%5C%22%3A%20item.get(%5C%22sku_properties_name%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E6%98%AF%E5%90%A6%E6%99%92%E5%9B%BE%5C%22%3A%201%20if%20item.get(%5C%22pics%5C%22)%20else%200%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E8%BF%BD%E8%AF%84%E5%86%85%E5%AE%B9%5C%22%3A%20item.get(%5C%22append_comment%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E5%8D%96%E5%AE%B6%E5%9B%9E%E5%A4%8D%5C%22%3A%20item.get(%5C%22reply_content%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E6%98%9F%E7%BA%A7%5C%22%3A%20item.get(%5C%22star%5C%22%2C%20%5C%22%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20parse_res.append(info)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20parse_res%5Cn%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E7%AC%AC%7Bpage%7D%E9%A1%B5%E9%87%87%E9%9B%86%E5%BC%82%E5%B8%B8%EF%BC%9A%7Bstr(e)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20%5B%5D%5Cn%5Cn%20%20%20%20def%20batch_collect_comments(self%2C%20item_id%2C%20max_page%3D10%2C%20sort_type%3D0)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%E6%89%B9%E9%87%8F%E5%88%86%E9%A1%B5%E5%85%A8%E9%87%8F%E9%87%87%E9%9B%86%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20global%20all_comment_data%5Cn%20%20%20%20%20%20%20%20for%20page_num%20in%20range(1%2C%20max_page%20%2B%201)%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E6%AD%A3%E5%9C%A8%E9%87%87%E9%9B%86%E7%AC%AC%7Bpage_num%7D%E9%A1%B5%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE...%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20page_data%20%3D%20self.get_single_page_comment(item_id%2C%20page_num%2C%20sort_type)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20page_data%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%5C%22%E6%97%A0%E6%9B%B4%E5%A4%9A%E8%AF%84%E4%BB%B7%EF%BC%8C%E9%87%87%E9%9B%86%E7%BB%88%E6%AD%A2%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%5Cn%20%20%20%20%20%20%20%20%20%20%20%20all_comment_data.extend(page_data)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(1)%20%23%20%E9%97%B4%E9%9A%94%E9%98%B2%E9%99%90%E6%B5%81%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E5%85%A8%E9%87%8F%E9%87%87%E9%9B%86%E5%AE%8C%E6%88%90%EF%BC%8C%E5%85%B1%E8%8E%B7%E5%8F%96%7Blen(all_comment_data)%7D%E6%9D%A1%E7%94%A8%E6%88%B7%E8%AF%84%E4%BB%B7%5C%22)%5Cn%20%20%20%20%20%20%20%20return%20all_comment_data%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;requests
import&amp;nbsp;json
import&amp;nbsp;time
import&amp;nbsp;pandas&amp;nbsp;as&amp;nbsp;pd
import&amp;nbsp;jieba
from&amp;nbsp;collections&amp;nbsp;import&amp;nbsp;Counter
import&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt
from&amp;nbsp;wordcloud&amp;nbsp;import&amp;nbsp;WordCloud

#&amp;nbsp;全局配置（替换为自己控制台获取的凭证）
ACCESS_KEY&amp;nbsp;=&amp;nbsp;&amp;quot;你的访问密钥&amp;quot;
SEC_KEY&amp;nbsp;=&amp;nbsp;&amp;quot;你的安全密钥&amp;quot;
#&amp;nbsp;全局存储评论列表
all_comment_data&amp;nbsp;=&amp;nbsp;[]

class&amp;nbsp;CommentCollector:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.base_url&amp;nbsp;=&amp;nbsp;&amp;quot;稳定数据通道地址&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.cache_switch&amp;nbsp;=&amp;nbsp;&amp;quot;yes&amp;quot;&amp;nbsp;&amp;nbsp;#&amp;nbsp;开启缓存提升访问速度
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.data_format&amp;nbsp;=&amp;nbsp;&amp;quot;json&amp;quot;&amp;nbsp;#&amp;nbsp;返回结构化json数据

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_single_page_comment(self,&amp;nbsp;item_id,&amp;nbsp;page=1,&amp;nbsp;sort_type=0):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;单页评价采集
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;item_id:&amp;nbsp;商品数字ID
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;page:&amp;nbsp;分页页码
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:param&amp;nbsp;sort_type:&amp;nbsp;0综合排序&amp;nbsp;/&amp;nbsp;1最新评价排序
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:return:&amp;nbsp;单页结构化评价列表
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;组装请求参数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;key&amp;quot;:&amp;nbsp;ACCESS_KEY,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;secret&amp;quot;:&amp;nbsp;SEC_KEY,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;cache&amp;quot;:&amp;nbsp;self.cache_switch,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;result_type&amp;quot;:&amp;nbsp;self.data_format,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;num_iid&amp;quot;:&amp;nbsp;item_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sort&amp;quot;:&amp;nbsp;sort_type
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.get(url=self.base_url,&amp;nbsp;params=params,&amp;nbsp;timeout=12)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;json.loads(resp.text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;判断是否存在评价数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;&amp;quot;rateList&amp;quot;&amp;nbsp;not&amp;nbsp;in&amp;nbsp;result.get(&amp;quot;result&amp;quot;,&amp;nbsp;{}):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rate_list&amp;nbsp;=&amp;nbsp;result[&amp;quot;result&amp;quot;][&amp;quot;rateList&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parse_res&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;rate_list:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;评价时间&amp;quot;:&amp;nbsp;item.get(&amp;quot;rate_date&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;评价内容&amp;quot;:&amp;nbsp;item.get(&amp;quot;rate_content&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;).strip(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;购买规格&amp;quot;:&amp;nbsp;item.get(&amp;quot;sku_properties_name&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;是否晒图&amp;quot;:&amp;nbsp;1&amp;nbsp;if&amp;nbsp;item.get(&amp;quot;pics&amp;quot;)&amp;nbsp;else&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;追评内容&amp;quot;:&amp;nbsp;item.get(&amp;quot;append_comment&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;卖家回复&amp;quot;:&amp;nbsp;item.get(&amp;quot;reply_content&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;星级&amp;quot;:&amp;nbsp;item.get(&amp;quot;star&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parse_res.append(info)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;parse_res
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;第{page}页采集异常：{str(e)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;[]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;batch_collect_comments(self,&amp;nbsp;item_id,&amp;nbsp;max_page=10,&amp;nbsp;sort_type=0):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;批量分页全量采集&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;global&amp;nbsp;all_comment_data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;page_num&amp;nbsp;in&amp;nbsp;range(1,&amp;nbsp;max_page&amp;nbsp;+&amp;nbsp;1):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;正在采集第{page_num}页评价数据...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page_data&amp;nbsp;=&amp;nbsp;self.get_single_page_comment(item_id,&amp;nbsp;page_num,&amp;nbsp;sort_type)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;page_data:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;无更多评价，采集终止&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_comment_data.extend(page_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(1)&amp;nbsp;#&amp;nbsp;间隔防限流
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;全量采集完成，共获取{len(all_comment_data)}条用户评价&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;all_comment_data&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;3.2 增量监控模块（7×24 小时实时监测新增评价）&lt;/h3&gt;&lt;p&gt;基于历史评价文本做去重校验，定时轮询，新增差评自动打印预警，实现长效口碑监控。&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;2&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22class%20CommentMonitor%3A%5Cn%20%20%20%20def%20__init__(self%2C%20collector%3A%20CommentCollector%2C%20item_id%2C%20interval%3D300)%3A%5Cn%20%20%20%20%20%20%20%20self.collector%20%3D%20collector%5Cn%20%20%20%20%20%20%20%20self.item_id%20%3D%20item_id%5Cn%20%20%20%20%20%20%20%20self.check_interval%20%3D%20interval%20%23%20%E7%9B%91%E6%8E%A7%E8%BD%AE%E8%AF%A2%E9%97%B4%E9%9A%94%EF%BC%8C%E5%8D%95%E4%BD%8D%E7%A7%92%5Cn%20%20%20%20%20%20%20%20self.history_text_set%20%3D%20set()%5Cn%20%20%20%20%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8E%86%E5%8F%B2%E8%AF%84%E4%BB%B7%E6%96%87%E6%9C%AC%E5%BA%93%5Cn%20%20%20%20%20%20%20%20self.init_history()%5Cn%5Cn%20%20%20%20def%20init_history(self)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%E9%A6%96%E6%AC%A1%E8%BF%90%E8%A1%8C%E5%8A%A0%E8%BD%BD%E5%85%A8%E9%83%A8%E5%8E%86%E5%8F%B2%E8%AF%84%E4%BB%B7%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20history%20%3D%20self.collector.batch_collect_comments(self.item_id%2C%20max_page%3D5)%5Cn%20%20%20%20%20%20%20%20for%20item%20in%20history%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20self.history_text_set.add(item%5B%5C%22%E8%AF%84%E4%BB%B7%E5%86%85%E5%AE%B9%5C%22%5D)%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E5%8E%86%E5%8F%B2%E8%AF%84%E4%BB%B7%E5%88%9D%E5%A7%8B%E5%8C%96%E5%AE%8C%E6%88%90%EF%BC%8C%E5%BC%80%E5%A7%8B%E5%AE%9E%E6%97%B6%E7%9B%91%E6%8E%A7%E6%96%B0%E5%A2%9E%E8%AF%84%E4%BB%B7%5C%22)%5Cn%5Cn%20%20%20%20def%20monitor_loop(self)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%E5%BE%AA%E7%8E%AF%E7%9B%91%E6%8E%A7%E4%B8%BB%E9%80%BB%E8%BE%91%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%AF%8F%E6%AC%A1%E4%BB%85%E6%8B%89%E5%8F%96%E6%9C%80%E6%96%B0%E4%B8%80%E9%A1%B5%E8%AF%84%E4%BB%B7%EF%BC%8C%E5%87%8F%E5%B0%91%E8%AF%B7%E6%B1%82%E9%87%8F%5Cn%20%20%20%20%20%20%20%20%20%20%20%20new_page%20%3D%20self.collector.get_single_page_comment(self.item_id%2C%20page%3D1%2C%20sort_type%3D1)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20for%20comment%20in%20new_page%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20text%20%3D%20comment%5B%5C%22%E8%AF%84%E4%BB%B7%E5%86%85%E5%AE%B9%5C%22%5D%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20star%20%3D%20comment%5B%5C%22%E6%98%9F%E7%BA%A7%5C%22%5D%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20text%20not%20in%20self.history_text_set%20and%20text%20!%3D%20%5C%22%5C%22%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%5C%22%3D%3D%3D%3D%3D%20%E6%8D%95%E8%8E%B7%E6%96%B0%E5%A2%9E%E8%AF%84%E4%BB%B7%20%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E6%97%B6%E9%97%B4%EF%BC%9A%7Bcomment%5B&amp;#39;%E8%AF%84%E4%BB%B7%E6%97%B6%E9%97%B4&amp;#39;%5D%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E6%98%9F%E7%BA%A7%EF%BC%9A%7Bstar%7D%E6%98%9F%20%7C%20%E5%86%85%E5%AE%B9%EF%BC%9A%7Btext%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%B7%AE%E8%AF%84%E9%A2%84%E8%AD%A6%E9%80%BB%E8%BE%91%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20int(star)%20%3C%3D%202%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%5C%22%E3%80%90%E9%87%8D%E8%A6%81%E9%A2%84%E8%AD%A6%E3%80%91%E6%A3%80%E6%B5%8B%E5%88%B0%E6%96%B0%E5%A2%9E%E5%B7%AE%E8%AF%84%EF%BC%8C%E8%AF%B7%E5%8F%8A%E6%97%B6%E8%B7%9F%E8%BF%9B%E5%A4%84%E7%90%86%EF%BC%81%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.history_text_set.add(text)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E7%AD%89%E5%BE%85%7Bself.check_interval%2F60%7D%E5%88%86%E9%92%9F%E5%90%8E%E5%86%8D%E6%AC%A1%E6%A3%80%E6%B5%8B...%5C%5Cn%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(self.check_interval)%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;class&amp;nbsp;CommentMonitor:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;collector:&amp;nbsp;CommentCollector,&amp;nbsp;item_id,&amp;nbsp;interval=300):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.collector&amp;nbsp;=&amp;nbsp;collector
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.item_id&amp;nbsp;=&amp;nbsp;item_id
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.check_interval&amp;nbsp;=&amp;nbsp;interval&amp;nbsp;#&amp;nbsp;监控轮询间隔，单位秒
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.history_text_set&amp;nbsp;=&amp;nbsp;set()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;初始化历史评价文本库
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.init_history()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;init_history(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;首次运行加载全部历史评价&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;history&amp;nbsp;=&amp;nbsp;self.collector.batch_collect_comments(self.item_id,&amp;nbsp;max_page=5)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;history:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.history_text_set.add(item[&amp;quot;评价内容&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;历史评价初始化完成，开始实时监控新增评价&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;monitor_loop(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;循环监控主逻辑&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;每次仅拉取最新一页评价，减少请求量
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_page&amp;nbsp;=&amp;nbsp;self.collector.get_single_page_comment(self.item_id,&amp;nbsp;page=1,&amp;nbsp;sort_type=1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;comment&amp;nbsp;in&amp;nbsp;new_page:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text&amp;nbsp;=&amp;nbsp;comment[&amp;quot;评价内容&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;star&amp;nbsp;=&amp;nbsp;comment[&amp;quot;星级&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;text&amp;nbsp;not&amp;nbsp;in&amp;nbsp;self.history_text_set&amp;nbsp;and&amp;nbsp;text&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;=====&amp;nbsp;捕获新增评价&amp;nbsp;=====&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;时间：{comment[&amp;#39;评价时间&amp;#39;]}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;星级：{star}星&amp;nbsp;|&amp;nbsp;内容：{text}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;差评预警逻辑
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;int(star)&amp;nbsp;&amp;lt;=&amp;nbsp;2:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;【重要预警】检测到新增差评，请及时跟进处理！&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.history_text_set.add(text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;等待{self.check_interval/60}分钟后再次检测...\n&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(self.check_interval)&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;3.3 数据分析与可视化模块（情感统计 + 词云生成）&lt;/h3&gt;&lt;p&gt;对采集完成的评价数据集做清洗、星级分布统计、高频词提取，自动生成图表与词云文件。&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;3&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22class%20CommentAnalyzer%3A%5Cn%20%20%20%20def%20__init__(self%2C%20data_list)%3A%5Cn%20%20%20%20%20%20%20%20self.df%20%3D%20pd.DataFrame(data_list)%5Cn%20%20%20%20%20%20%20%20%23%20%E8%BF%87%E6%BB%A4%E7%A9%BA%E7%99%BD%E8%AF%84%E4%BB%B7%5Cn%20%20%20%20%20%20%20%20self.df%20%3D%20self.df%5Bself.df%5B%5C%22%E8%AF%84%E4%BB%B7%E5%86%85%E5%AE%B9%5C%22%5D%20!%3D%20%5C%22%5C%22%5D%5Cn%20%20%20%20%20%20%20%20self.stop_words%20%3D%20%7B%5C%22%E7%9A%84%5C%22%2C%20%5C%22%E4%BA%86%5C%22%2C%20%5C%22%E5%BE%88%5C%22%2C%20%5C%22%E8%BF%98%5C%22%2C%20%5C%22%E6%AF%94%E8%BE%83%5C%22%2C%20%5C%22%E6%84%9F%E8%A7%89%5C%22%2C%20%5C%22%E5%B0%B1%E6%98%AF%5C%22%2C%20%5C%22%E8%BF%99%E4%B8%AA%5C%22%2C%20%5C%22%E6%8C%BA%5C%22%2C%20%5C%22%E4%B8%80%E8%88%AC%5C%22%7D%5Cn%5Cn%20%20%20%20def%20star_distribution_stat(self)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%E6%98%9F%E7%BA%A7%E5%88%86%E5%B8%83%E7%BB%9F%E8%AE%A1%2B%E7%BB%98%E5%9B%BE%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20star_count%20%3D%20self.df%5B%5C%22%E6%98%9F%E7%BA%A7%5C%22%5D.value_counts().sort_index()%5Cn%20%20%20%20%20%20%20%20print(%5C%22%3D%3D%3D%3D%3D%20%E5%95%86%E5%93%81%E6%98%9F%E7%BA%A7%E5%88%86%E5%B8%83%E7%BB%9F%E8%AE%A1%20%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20%20%20%20%20print(star_count)%5Cn%20%20%20%20%20%20%20%20plt.rcParams%5B%5C%22font.sans-serif%5C%22%5D%20%3D%20%5B%5C%22SimHei%5C%22%5D%5Cn%20%20%20%20%20%20%20%20plt.rcParams%5B%5C%22axes.unicode_minus%5C%22%5D%20%3D%20False%5Cn%20%20%20%20%20%20%20%20star_count.plot(kind%3D%5C%22bar%5C%22%2C%20color%3D%5B%5C%22%23ff4444%5C%22%2C%20%5C%22%23ffbb33%5C%22%2C%20%5C%22%23ffff33%5C%22%2C%20%5C%22%23bbee33%5C%22%2C%20%5C%22%2333bb33%5C%22%5D)%5Cn%20%20%20%20%20%20%20%20plt.title(%5C%22%E5%95%86%E5%93%81%E8%AF%84%E4%BB%B7%E6%98%9F%E7%BA%A7%E5%88%86%E5%B8%83%5C%22)%5Cn%20%20%20%20%20%20%20%20plt.xlabel(%5C%22%E6%98%9F%E7%BA%A7%5C%22)%5Cn%20%20%20%20%20%20%20%20plt.ylabel(%5C%22%E8%AF%84%E4%BB%B7%E6%95%B0%E9%87%8F%5C%22)%5Cn%20%20%20%20%20%20%20%20plt.savefig(%5C%22%E6%98%9F%E7%BA%A7%E5%88%86%E5%B8%83%E7%BB%9F%E8%AE%A1%E5%9B%BE.png%5C%22%2C%20dpi%3D300)%5Cn%20%20%20%20%20%20%20%20plt.show()%5Cn%20%20%20%20%20%20%20%20return%20star_count%5Cn%5Cn%20%20%20%20def%20extract_high_freq_words(self)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%E6%8F%90%E5%8F%96%E8%AF%84%E4%BB%B7%E9%AB%98%E9%A2%91%E5%85%B3%E9%94%AE%E8%AF%8D%EF%BC%8C%E5%8C%BA%E5%88%86%E5%A5%BD%E8%AF%84%2F%E5%B7%AE%E8%AF%84%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20good_text%20%3D%20%5C%22%5C%22.join(self.df%5Bself.df%5B%5C%22%E6%98%9F%E7%BA%A7%5C%22%5D%20%3E%3D%204%5D%5B%5C%22%E8%AF%84%E4%BB%B7%E5%86%85%E5%AE%B9%5C%22%5D.tolist())%5Cn%20%20%20%20%20%20%20%20bad_text%20%3D%20%5C%22%5C%22.join(self.df%5Bself.df%5B%5C%22%E6%98%9F%E7%BA%A7%5C%22%5D%20%3C%3D%202%5D%5B%5C%22%E8%AF%84%E4%BB%B7%E5%86%85%E5%AE%B9%5C%22%5D.tolist())%5Cn%20%20%20%20%20%20%20%20%23%20%E5%88%86%E8%AF%8D%E8%BF%87%E6%BB%A4%E5%81%9C%E7%94%A8%E8%AF%8D%5Cn%20%20%20%20%20%20%20%20def%20cut_words(text)%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20words%20%3D%20jieba.lcut(text)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20clean%20%3D%20%5Bw%20for%20w%20in%20words%20if%20len(w)%20%3E%201%20and%20w%20not%20in%20self.stop_words%5D%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20Counter(clean).most_common(20)%5Cn%20%20%20%20%20%20%20%20good_words%20%3D%20cut_words(good_text)%5Cn%20%20%20%20%20%20%20%20bad_words%20%3D%20cut_words(bad_text)%5Cn%20%20%20%20%20%20%20%20print(%5C%22%5C%5Cn%3D%3D%3D%3D%3D%20%E5%A5%BD%E8%AF%84%E9%AB%98%E9%A2%91%E5%85%B3%E9%94%AE%E8%AF%8DTOP20%20%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20%20%20%20%20for%20w%2C%20num%20in%20good_words%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%7Bw%7D%EF%BC%9A%7Bnum%7D%E6%AC%A1%5C%22)%5Cn%20%20%20%20%20%20%20%20print(%5C%22%5C%5Cn%3D%3D%3D%3D%3D%20%E5%B7%AE%E8%AF%84%E7%97%9B%E7%82%B9%E5%85%B3%E9%94%AE%E8%AF%8DTOP20%20%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20%20%20%20%20for%20w%2C%20num%20in%20bad_words%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%7Bw%7D%EF%BC%9A%7Bnum%7D%E6%AC%A1%5C%22)%5Cn%20%20%20%20%20%20%20%20%23%20%E7%94%9F%E6%88%90%E5%B7%AE%E8%AF%84%E8%AF%8D%E4%BA%91%5Cn%20%20%20%20%20%20%20%20wc%20%3D%20WordCloud(%5Cn%20%20%20%20%20%20%20%20%20%20%20%20background_color%3D%5C%22white%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20font_path%3D%5C%22simhei.ttf%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20width%3D1000%2C%20height%3D600%5Cn%20%20%20%20%20%20%20%20).generate(bad_text)%5Cn%20%20%20%20%20%20%20%20wc.to_file(%5C%22%E5%B7%AE%E8%AF%84%E7%97%9B%E7%82%B9%E8%AF%8D%E4%BA%91.png%5C%22)%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E5%B7%AE%E8%AF%84%E8%AF%8D%E4%BA%91%E5%9B%BE%E7%89%87%E5%B7%B2%E7%94%9F%E6%88%90%5C%22)%5Cn%20%20%20%20%20%20%20%20return%20good_words%2C%20bad_words%5Cn%5Cn%20%20%20%20def%20export_csv(self)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%E5%AF%BC%E5%87%BA%E5%AE%8C%E6%95%B4%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE%E8%A1%A8%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20self.df.to_csv(%5C%22%E5%95%86%E5%93%81%E5%AE%8C%E6%95%B4%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE.csv%5C%22%2C%20encoding%3D%5C%22utf-8-sig%5C%22%2C%20index%3DFalse)%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE%E8%A1%A8%E5%B7%B2%E5%AF%BC%E5%87%BA%E4%B8%BAcsv%E6%96%87%E4%BB%B6%EF%BC%8C%E5%8F%AF%E7%9B%B4%E6%8E%A5%E7%94%A8Excel%E6%89%93%E5%BC%80%5C%22)%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;class&amp;nbsp;CommentAnalyzer:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;data_list):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.df&amp;nbsp;=&amp;nbsp;pd.DataFrame(data_list)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;过滤空白评价
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.df&amp;nbsp;=&amp;nbsp;self.df[self.df[&amp;quot;评价内容&amp;quot;]&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.stop_words&amp;nbsp;=&amp;nbsp;{&amp;quot;的&amp;quot;,&amp;nbsp;&amp;quot;了&amp;quot;,&amp;nbsp;&amp;quot;很&amp;quot;,&amp;nbsp;&amp;quot;还&amp;quot;,&amp;nbsp;&amp;quot;比较&amp;quot;,&amp;nbsp;&amp;quot;感觉&amp;quot;,&amp;nbsp;&amp;quot;就是&amp;quot;,&amp;nbsp;&amp;quot;这个&amp;quot;,&amp;nbsp;&amp;quot;挺&amp;quot;,&amp;nbsp;&amp;quot;一般&amp;quot;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;star_distribution_stat(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;星级分布统计+绘图&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;star_count&amp;nbsp;=&amp;nbsp;self.df[&amp;quot;星级&amp;quot;].value_counts().sort_index()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;=====&amp;nbsp;商品星级分布统计&amp;nbsp;=====&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(star_count)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.rcParams[&amp;quot;font.sans-serif&amp;quot;]&amp;nbsp;=&amp;nbsp;[&amp;quot;SimHei&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.rcParams[&amp;quot;axes.unicode_minus&amp;quot;]&amp;nbsp;=&amp;nbsp;False
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;star_count.plot(kind=&amp;quot;bar&amp;quot;,&amp;nbsp;color=[&amp;quot;#ff4444&amp;quot;,&amp;nbsp;&amp;quot;#ffbb33&amp;quot;,&amp;nbsp;&amp;quot;#ffff33&amp;quot;,&amp;nbsp;&amp;quot;#bbee33&amp;quot;,&amp;nbsp;&amp;quot;#33bb33&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.title(&amp;quot;商品评价星级分布&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.xlabel(&amp;quot;星级&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.ylabel(&amp;quot;评价数量&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.savefig(&amp;quot;星级分布统计图.png&amp;quot;,&amp;nbsp;dpi=300)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.show()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;star_count

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;extract_high_freq_words(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;提取评价高频关键词，区分好评/差评&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;good_text&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(self.df[self.df[&amp;quot;星级&amp;quot;]&amp;nbsp;&amp;gt;=&amp;nbsp;4][&amp;quot;评价内容&amp;quot;].tolist())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bad_text&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(self.df[self.df[&amp;quot;星级&amp;quot;]&amp;nbsp;&amp;lt;=&amp;nbsp;2][&amp;quot;评价内容&amp;quot;].tolist())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;分词过滤停用词
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;cut_words(text):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;words&amp;nbsp;=&amp;nbsp;jieba.lcut(text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clean&amp;nbsp;=&amp;nbsp;[w&amp;nbsp;for&amp;nbsp;w&amp;nbsp;in&amp;nbsp;words&amp;nbsp;if&amp;nbsp;len(w)&amp;nbsp;&amp;gt;&amp;nbsp;1&amp;nbsp;and&amp;nbsp;w&amp;nbsp;not&amp;nbsp;in&amp;nbsp;self.stop_words]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;Counter(clean).most_common(20)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;good_words&amp;nbsp;=&amp;nbsp;cut_words(good_text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bad_words&amp;nbsp;=&amp;nbsp;cut_words(bad_text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;\n=====&amp;nbsp;好评高频关键词TOP20&amp;nbsp;=====&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;w,&amp;nbsp;num&amp;nbsp;in&amp;nbsp;good_words:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;{w}：{num}次&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;\n=====&amp;nbsp;差评痛点关键词TOP20&amp;nbsp;=====&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;w,&amp;nbsp;num&amp;nbsp;in&amp;nbsp;bad_words:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;{w}：{num}次&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;生成差评词云
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wc&amp;nbsp;=&amp;nbsp;WordCloud(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;background_color=&amp;quot;white&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;font_path=&amp;quot;simhei.ttf&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;width=1000,&amp;nbsp;height=600
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;).generate(bad_text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wc.to_file(&amp;quot;差评痛点词云.png&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;差评词云图片已生成&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;good_words,&amp;nbsp;bad_words

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;export_csv(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;导出完整评价数据表&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.df.to_csv(&amp;quot;商品完整评价数据.csv&amp;quot;,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;,&amp;nbsp;index=False)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;评价数据表已导出为csv文件，可直接用Excel打开&amp;quot;)&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h3&gt;3.4 程序主运行入口&lt;/h3&gt;&lt;p&gt;整合采集、监控、分析全流程，按需切换&lt;strong&gt;一次性全量采集分析&lt;/strong&gt;或&lt;strong&gt;长效实时监控&lt;/strong&gt;两种模式。&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;4&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22if%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20%23%20%E9%85%8D%E7%BD%AE%E7%9B%AE%E6%A0%87%E5%95%86%E5%93%81ID%EF%BC%8C%E6%9B%BF%E6%8D%A2%E4%B8%BA%E8%87%AA%E5%B7%B1%E8%B0%83%E7%A0%94%E5%95%86%E5%93%81%E6%95%B0%E5%AD%97ID%5Cn%20%20%20%20TARGET_ITEM_ID%20%3D%20%5C%22600530677643%5C%22%5Cn%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E9%87%87%E9%9B%86%E5%B7%A5%E5%85%B7%5Cn%20%20%20%20collector%20%3D%20CommentCollector()%5Cn%20%20%20%20%23%20%E6%A8%A1%E5%BC%8F1%EF%BC%9A%E4%B8%80%E6%AC%A1%E6%80%A7%E5%85%A8%E9%87%8F%E9%87%87%E9%9B%86%2B%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%EF%BC%88%E8%B0%83%E7%A0%94%E7%AB%9E%E5%93%81%E4%BD%BF%E7%94%A8%EF%BC%89%5Cn%20%20%20%20print(%5C%22%3D%3D%3D%3D%3D%20%E6%A8%A1%E5%BC%8F1%EF%BC%9A%E5%85%A8%E9%87%8F%E9%87%87%E9%9B%86%E5%B9%B6%E5%88%86%E6%9E%90%E5%95%86%E5%93%81%E8%AF%84%E4%BB%B7%20%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20comment_data%20%3D%20collector.batch_collect_comments(TARGET_ITEM_ID%2C%20max_page%3D15%2C%20sort_type%3D0)%5Cn%20%20%20%20if%20comment_data%3A%5Cn%20%20%20%20%20%20%20%20analyzer%20%3D%20CommentAnalyzer(comment_data)%5Cn%20%20%20%20%20%20%20%20analyzer.star_distribution_stat()%5Cn%20%20%20%20%20%20%20%20analyzer.extract_high_freq_words()%5Cn%20%20%20%20%20%20%20%20analyzer.export_csv()%5Cn%5Cn%20%20%20%20%23%20%E6%A8%A1%E5%BC%8F2%EF%BC%9A%E5%BC%80%E5%90%AF7%C3%9724%E5%B0%8F%E6%97%B6%E5%A2%9E%E9%87%8F%E7%9B%91%E6%8E%A7%EF%BC%88%E5%95%86%E5%AE%B6%E5%AE%9E%E6%97%B6%E5%8F%A3%E7%A2%91%E9%A2%84%E8%AD%A6%EF%BC%8C%E5%8F%96%E6%B6%88%E6%B3%A8%E9%87%8A%E5%8D%B3%E5%8F%AF%E8%BF%90%E8%A1%8C%EF%BC%89%5Cn%20%20%20%20%23%20monitor%20%3D%20CommentMonitor(collector%2C%20TARGET_ITEM_ID%2C%20interval%3D300)%5Cn%20%20%20%20%23%20monitor.monitor_loop()%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;配置目标商品ID，替换为自己调研商品数字ID
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TARGET_ITEM_ID&amp;nbsp;=&amp;nbsp;&amp;quot;600530677643&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;初始化采集工具
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;collector&amp;nbsp;=&amp;nbsp;CommentCollector()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;模式1：一次性全量采集+数据分析（调研竞品使用）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;=====&amp;nbsp;模式1：全量采集并分析商品评价&amp;nbsp;=====&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment_data&amp;nbsp;=&amp;nbsp;collector.batch_collect_comments(TARGET_ITEM_ID,&amp;nbsp;max_page=15,&amp;nbsp;sort_type=0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;comment_data:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;analyzer&amp;nbsp;=&amp;nbsp;CommentAnalyzer(comment_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;analyzer.star_distribution_stat()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;analyzer.extract_high_freq_words()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;analyzer.export_csv()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;模式2：开启7×24小时增量监控（商家实时口碑预警，取消注释即可运行）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;monitor&amp;nbsp;=&amp;nbsp;CommentMonitor(collector,&amp;nbsp;TARGET_ITEM_ID,&amp;nbsp;interval=300)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;monitor.monitor_loop()&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;四、代码使用说明与场景落地&lt;/h2&gt;&lt;h3&gt;4.1 快速上手步骤&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;替换代码顶部&lt;code&gt;ACCESS_KEY&lt;/code&gt;、&lt;code&gt;SEC_KEY&lt;/code&gt;为控制台生成的专属凭证；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;修改&lt;code&gt;TARGET_ITEM_ID&lt;/code&gt;为目标商品 ID；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;直接运行脚本，默认执行&lt;strong&gt;全量采集 + 数据分析&lt;/strong&gt;流程，自动输出统计表格、统计图、差评词云；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;需要长期监控时，注释模式 1 代码，取消模式 2 监控代码注释，脚本后台持续运行即可。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;4.2 核心实用场景&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;自有店铺口碑监控&lt;/strong&gt; 开启增量监控模式，新增差评实时预警，快速响应买家负面反馈，降低售后风险；定期导出评价数据，迭代产品优化方向。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;竞品深度调研分析&lt;/strong&gt; 批量采集多款竞品全量评价，通过词云提取竞品核心痛点，找到自身产品差异化优势；统计竞品好评高频卖点，优化商品详情页宣传话术。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;电商文本挖掘学习&lt;/strong&gt; 完整结构化评价数据集包含文本、时间、规格、晒图标识，可用于 NLP 情感分类、用户画像、销量关联分析等实验。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;4.3 避坑优化小技巧&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;采集页数&lt;code&gt;max_page&lt;/code&gt;建议控制在 20 页以内，如需大批量数据可拆分多次运行，避免单次请求过多；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;监控轮询间隔&lt;code&gt;interval&lt;/code&gt;建议设置 300 秒（5 分钟）以上，减少通道请求频次；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;词云生成如提示字体缺失，将系统黑体字体文件路径填入&lt;code&gt;font_path&lt;/code&gt;参数；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;数据存储量巨大时，可扩展代码将 CSV 存储替换为 SQLite 数据库，方便长期数据检索。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;五、方案优势总结&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据完整稳定&lt;/strong&gt; 依托成熟稳定数据通道，无需处理页面渲染、签名校验、反爬限制，一次配置永久可用，完整抓取晒图、追评、卖家回复等普通页面抓取无法获取的字段。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;轻量化低成本&lt;/strong&gt; 不需要服务器集群、复杂中间件，本地电脑、轻量云主机均可部署，单人即可完成整套数据监控分析流程，大幅降低电商数据调研人力成本。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;自动化闭环流程&lt;/strong&gt; 从数据拉取、去重存储、情感分析到可视化报表全程自动化，无需人工复制整理评价，每天节省数小时手工统计时间。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;灵活拓展性强&lt;/strong&gt; 代码模块化拆分，可快速拓展功能：对接企业微信 / 钉钉消息推送差评预警、批量循环采集多款竞品、训练情感分类模型做精细化用户分层。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;结语&lt;/h2&gt;&lt;p&gt;电商行业竞争愈发激烈，用户真实评价是产品迭代、运营策略调整最核心的一手数据。这套基于 OpenClaw 搭建的自动化评价监控分析工具，解决了传统手动统计、页面抓取不稳定两大核心痛点，不管是商家、运营还是数据分析从业者，都能快速落地使用。&lt;/p&gt;&lt;p&gt;&lt;span data-cke-copybin-end=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 21 Jul 2026 10:07:56 +0800</pubDate></item><item><title>低成本搭建电商商品口碑监控系统｜从实时数据采集到情感分析完整实战（附可运行 Python 代码）</title><link>https://shopapi.com.cn/?id=199</link><description>&lt;p&gt;&lt;span data-cke-copybin-start=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;前言&lt;/h2&gt;&lt;p&gt;做电商运营、产品、竞品分析的同学，几乎都绕不开&lt;strong&gt;用户评价数据&lt;/strong&gt;。商品好评、差评、晒图、规格反馈、追评里藏着最真实的用户痛点：面料差、尺寸不准、物流慢、包装破损，或是产品爆火的核心卖点。&lt;/p&gt;&lt;p&gt;传统人工统计方式痛点极多：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;手动翻页复制评论，单品上千条数据至少耗费半天；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;无法实时监控新增差评，售后反馈滞后；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;数据零散，很难批量统计负面关键词、评分分布；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;自研网页抓取容易遭遇平台限制、频繁失效，维护成本高。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;本文给大家分享一套成熟稳定的落地方案，依托 OpenClaw 数据通道，无需复杂逆向、不用处理页面加密，一行配置即可批量拉取全量评价，搭配 Python 实现&lt;strong&gt;7×24 小时增量监控、数据清洗、情感分析、可视化报表&lt;/strong&gt;，小卖家、数据分析实习生、竞品调研团队都能直接上手。&lt;/p&gt;&lt;h2&gt;一、方案整体架构&lt;/h2&gt;&lt;p&gt;整套系统仅依赖轻量 Python 环境，普通笔记本 / 低配云服务器就能稳定运行，分为四大核心模块：&lt;/p&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;全量数据同步模块&lt;/strong&gt;：输入商品唯一标识，批量拉取评价全字段，包含评论文本、星级、晒图链接、购买规格、评价时间、脱敏买家昵称、追评内容；支持分页循环采集，自动适配海量评论商品。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;增量实时监控模块&lt;/strong&gt;：基于评价唯一标识做本地去重，定时轮询拉取最新评价，仅新增未记录数据，大幅降低请求频次，实现差评实时预警。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据清洗存储模块&lt;/strong&gt;：过滤空白评价、无效系统默认话术，统一时间格式，结构化存入 CSV 文件（小体量项目）或 SQLite 本地数据库（长期监控多商品）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;智能分析可视化模块&lt;/strong&gt;：中文分词 + 情感判断区分好评 / 中评 / 差评，统计负面高频痛点词汇，输出评分占比饼图、每日评价量趋势折线图，直观呈现口碑变化。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;二、前期准备工作&lt;/h2&gt;&lt;h3&gt;2.1 环境依赖安装&lt;/h3&gt;&lt;p&gt;新建 Python 项目，执行命令安装全部依赖库：&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;0&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22pip%20install%20requests%20pandas%20jieba%20snownlp%20matplotlib%20sqlite3%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;pip&amp;nbsp;install&amp;nbsp;requests&amp;nbsp;pandas&amp;nbsp;jieba&amp;nbsp;snownlp&amp;nbsp;matplotlib&amp;nbsp;sqlite3&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;各库作用说明：&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;requests：发起网络请求拉取商品评价数据&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;pandas：批量数据清洗、表格存储&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;jieba：中文评论分词，提取关键词&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;snownlp：轻量中文情感打分，区分正负向评价&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;matplotlib：生成口碑可视化图表&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;sqlite3：本地轻量数据库，长期存储多商品历史评价&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;2.2 工具基础配置&lt;/h3&gt;&lt;p&gt;登录创建项目获取两组身份凭证（&lt;span aria-label=&quot;a 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_inline cke_widget_csdnlink cke_widget_wrapper_link-info cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;a&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;4&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;link-info cke_widget_editable cke_widget_element&quot; contenteditable=&quot;true&quot; data-cke-enter-mode=&quot;2&quot; data-cke-widget-data=&quot;%7B%22url%22%3A%22https%3A%2F%2Fo0b.cn%2Ficris%22%2C%22text%22%3A%22%E5%AF%86%E9%92%A5%E4%B8%B2%22%2C%22desc%22%3A%22%22%2C%22icon%22%3A%22%22%2C%22isCard%22%3Afalse%2C%22hasResquest%22%3Atrue%2C%22iconDefault%22%3A%22https%3A%2F%2Fcsdnimg.cn%2Frelease%2Fblog_editor_html%2Frelease2.4.6%2Fckeditor%2Fplugins%2FCsdnLink%2Ficons%2Ficon-default.png%3Ft%3DQ239%22%2C%22id%22%3A%22EMdNWW-1784535185834%22%2C%22classes%22%3A%7B%22link-info%22%3A1%7D%7D&quot; data-cke-widget-editable=&quot;text&quot; data-cke-widget-keep-attr=&quot;0&quot; data-link-icon=&quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=Q239&quot; data-link-title=&quot;密钥串&quot; data-widget=&quot;csdnlink&quot; href=&quot;https://o0b.cn/icris&quot; title=&quot;密钥串&quot;&gt;密钥串&lt;/a&gt;&lt;/span&gt;），用于数据通道鉴权；复制商品 ID（商品链接中&lt;code&gt;id=&lt;/code&gt;后的数字串）作为采集目标，无需解析复杂页面链接。&lt;/p&gt;&lt;h2&gt;三、完整可运行代码实现&lt;/h2&gt;&lt;h3&gt;3.1 基础数据拉取工具类（核心采集逻辑）&lt;/h3&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;1&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22import%20requests%5Cnimport%20json%5Cnimport%20time%5Cnimport%20random%5Cnimport%20pandas%20as%20pd%5Cnimport%20sqlite3%5Cnfrom%20snownlp%20import%20SnowNLP%5Cnimport%20jieba%5Cnimport%20matplotlib.pyplot%20as%20plt%5Cn%5Cn%23%201.%20%E5%9F%BA%E7%A1%80%E9%89%B4%E6%9D%83%E9%85%8D%E7%BD%AE%EF%BC%88%E6%9B%BF%E6%8D%A2%E4%B8%BA%E8%87%AA%E5%B7%B1%E5%90%8E%E5%8F%B0%E5%87%AD%E8%AF%81%EF%BC%89%5CnACCESS_KEY%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E5%AF%86%E9%92%A51%5C%22%5CnSECRET_KEY%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E5%AF%86%E9%92%A52%5C%22%5CnGATEWAY_URL%20%3D%20%5C%22%E7%A8%B3%E5%AE%9A%E6%95%B0%E6%8D%AE%E9%80%9A%E9%81%93%E5%9C%B0%E5%9D%80%5C%22%5Cn%5Cnclass%20GoodsCommentCollector%3A%5Cn%20%20%20%20def%20__init__(self%2C%20item_id)%3A%5Cn%20%20%20%20%20%20%20%20self.item_id%20%3D%20item_id%5Cn%20%20%20%20%20%20%20%20self.all_comment_list%20%3D%20%5B%5D%5Cn%20%20%20%20%20%20%20%20self.db_conn%20%3D%20sqlite3.connect(%5C%22goods_comment.db%5C%22)%5Cn%20%20%20%20%20%20%20%20self.init_db()%5Cn%5Cn%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E6%9C%AC%E5%9C%B0%E6%95%B0%E6%8D%AE%E5%BA%93%EF%BC%8C%E5%AD%98%E5%82%A8%E5%8E%86%E5%8F%B2%E8%AF%84%E4%BB%B7%E7%94%A8%E4%BA%8E%E5%A2%9E%E9%87%8F%E7%9B%91%E6%8E%A7%5Cn%20%20%20%20def%20init_db(self)%3A%5Cn%20%20%20%20%20%20%20%20create_sql%20%3D%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20CREATE%20TABLE%20IF%20NOT%20EXISTS%20comment_data%20(%5Cn%20%20%20%20%20%20%20%20%20%20%20%20comment_id%20TEXT%20PRIMARY%20KEY%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20nick%20TEXT%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20star%20INTEGER%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20content%20TEXT%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20sku%20TEXT%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20rate_date%20TEXT%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20has_pic%20INTEGER%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20add_feedback%20TEXT%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20emotion_score%20REAL%5Cn%20%20%20%20%20%20%20%20)%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20self.db_conn.execute(create_sql)%5Cn%20%20%20%20%20%20%20%20self.db_conn.commit()%5Cn%5Cn%20%20%20%20%23%20%E5%8D%95%E9%A1%B5%E6%8B%89%E5%8F%96%E8%AF%84%E4%BB%B7%E5%8E%9F%E5%A7%8B%E6%95%B0%E6%8D%AE%5Cn%20%20%20%20def%20fetch_single_page(self%2C%20page_num%3D1%2C%20page_size%3D20)%3A%5Cn%20%20%20%20%20%20%20%20params%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22key%5C%22%3A%20ACCESS_KEY%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22secret%5C%22%3A%20SECRET_KEY%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22item_id%5C%22%3A%20self.item_id%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22page%5C%22%3A%20page_num%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22page_size%5C%22%3A%20page_size%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22result_type%5C%22%3A%20%5C%22json%5C%22%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20resp%20%3D%20requests.get(GATEWAY_URL%2C%20params%3Dparams%2C%20timeout%3D15)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20resp_data%20%3D%20json.loads(resp.text)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20resp_data%5Cn%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E7%AC%AC%7Bpage_num%7D%E9%A1%B5%E9%87%87%E9%9B%86%E5%BC%82%E5%B8%B8%EF%BC%9A%7Bstr(e)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20None%5Cn%5Cn%20%20%20%20%23%20%E8%A7%A3%E6%9E%90%E5%8E%9F%E5%A7%8B%E6%95%B0%E6%8D%AE%EF%BC%8C%E6%B8%85%E6%B4%97%E7%BB%93%E6%9E%84%E5%8C%96%E5%AD%97%E6%AE%B5%5Cn%20%20%20%20def%20parse_raw_data(self%2C%20raw_json)%3A%5Cn%20%20%20%20%20%20%20%20if%20not%20raw_json%20or%20%5C%22items%5C%22%20not%20in%20raw_json%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20False%5Cn%20%20%20%20%20%20%20%20comment_items%20%3D%20raw_json%5B%5C%22items%5C%22%5D.get(%5C%22item%5C%22%2C%20%5B%5D)%5Cn%20%20%20%20%20%20%20%20if%20len(comment_items)%20%3D%3D%200%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20False%5Cn%20%20%20%20%20%20%20%20for%20item%20in%20comment_items%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20comment_info%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22comment_id%5C%22%3A%20item.get(%5C%22rate_id%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22nick%5C%22%3A%20item.get(%5C%22display_user_nick%5C%22%2C%20%5C%22%E5%8C%BF%E5%90%8D%E7%94%A8%E6%88%B7%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22star%5C%22%3A%20int(item.get(%5C%22user_star%5C%22%2C%205))%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22content%5C%22%3A%20item.get(%5C%22rate_content%5C%22%2C%20%5C%22%5C%22).strip()%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22sku%5C%22%3A%20item.get(%5C%22auction_sku%5C%22%2C%20%5C%22%E6%97%A0%E8%A7%84%E6%A0%BC%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22rate_date%5C%22%3A%20item.get(%5C%22rate_date%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22has_pic%5C%22%3A%201%20if%20item.get(%5C%22pics%5C%22%2C%20%5B%5D)%20else%200%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5C%22add_feedback%5C%22%3A%20item.get(%5C%22add_feedback%5C%22%2C%20%5C%22%E6%97%A0%E8%BF%BD%E8%AF%84%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%BF%87%E6%BB%A4%E7%A9%BA%E7%99%BD%E6%97%A0%E6%84%8F%E4%B9%89%E8%AF%84%E4%BB%B7%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20comment_info%5B%5C%22content%5C%22%5D%20in%20%5B%5C%22%E6%AD%A4%E7%94%A8%E6%88%B7%E6%B2%A1%E6%9C%89%E5%A1%AB%E5%86%99%E8%AF%84%E4%BB%B7%E3%80%82%5C%22%2C%20%5C%22%5C%22%5D%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%5Cn%20%20%20%20%20%20%20%20%20%20%20%20self.all_comment_list.append(comment_info)%5Cn%20%20%20%20%20%20%20%20return%20True%5Cn%5Cn%20%20%20%20%23%20%E6%89%B9%E9%87%8F%E5%85%A8%E9%87%8F%E9%87%87%E9%9B%86%EF%BC%8C%E8%87%AA%E5%8A%A8%E5%88%86%E9%A1%B5%E5%BE%AA%E7%8E%AF%5Cn%20%20%20%20def%20batch_crawl_all(self%2C%20max_page%3D50)%3A%5Cn%20%20%20%20%20%20%20%20for%20page%20in%20range(1%2C%20max_page%20%2B%201)%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E6%AD%A3%E5%9C%A8%E9%87%87%E9%9B%86%E7%AC%AC%7Bpage%7D%E9%A1%B5%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE...%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20raw_data%20%3D%20self.fetch_single_page(page_num%3Dpage)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20parse_result%20%3D%20self.parse_raw_data(raw_data)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20parse_result%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%5C%22%E6%97%A0%E6%9B%B4%E5%A4%9A%E8%AF%84%E4%BB%B7%EF%BC%8C%E5%85%A8%E9%87%8F%E9%87%87%E9%9B%86%E5%AE%8C%E6%88%90%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E9%9A%8F%E6%9C%BA%E4%BC%91%E7%9C%A0%EF%BC%8C%E5%B9%B3%E7%A8%B3%E8%AF%B7%E6%B1%82%E9%A2%91%E7%8E%87%5Cn%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(random.uniform(1.2%2C%203.0))%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E6%9C%AC%E6%AC%A1%E5%85%B1%E9%87%87%E9%9B%86%E6%9C%89%E6%95%88%E8%AF%84%E4%BB%B7%7Blen(self.all_comment_list)%7D%E6%9D%A1%5C%22)%5Cn%5Cn%20%20%20%20%23%20%E5%A2%9E%E9%87%8F%E5%85%A5%E5%BA%93%EF%BC%9A%E4%BB%85%E5%86%99%E5%85%A5%E6%9C%AC%E5%9C%B0%E4%B8%8D%E5%AD%98%E5%9C%A8%E7%9A%84%E6%96%B0%E8%AF%84%E4%BB%B7%5Cn%20%20%20%20def%20save_to_local_db(self)%3A%5Cn%20%20%20%20%20%20%20%20insert_sql%20%3D%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20INSERT%20OR%20IGNORE%20INTO%20comment_data%5Cn%20%20%20%20%20%20%20%20(comment_id%2C%20nick%2C%20star%2C%20content%2C%20sku%2C%20rate_date%2C%20has_pic%2C%20add_feedback%2C%20emotion_score)%5Cn%20%20%20%20%20%20%20%20VALUES%20(%3F%2C%20%3F%2C%20%3F%2C%20%3F%2C%20%3F%2C%20%3F%2C%20%3F%2C%20%3F%2C%20%3F)%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20for%20comment%20in%20self.all_comment_list%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%83%85%E6%84%9F%E6%89%93%E5%88%860-1%EF%BC%8C%E5%A4%A7%E4%BA%8E0.5%E6%AD%A3%E5%90%91%EF%BC%8C%E5%B0%8F%E4%BA%8E0.3%E8%B4%9F%E5%90%91%5Cn%20%20%20%20%20%20%20%20%20%20%20%20s%20%3D%20SnowNLP(comment%5B%5C%22content%5C%22%5D)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20score%20%3D%20s.sentiments%5Cn%20%20%20%20%20%20%20%20%20%20%20%20self.db_conn.execute(insert_sql%2C%20(%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20comment%5B%5C%22comment_id%5C%22%5D%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20comment%5B%5C%22nick%5C%22%5D%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20comment%5B%5C%22star%5C%22%5D%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20comment%5B%5C%22content%5C%22%5D%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20comment%5B%5C%22sku%5C%22%5D%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20comment%5B%5C%22rate_date%5C%22%5D%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20comment%5B%5C%22has_pic%5C%22%5D%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20comment%5B%5C%22add_feedback%5C%22%5D%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20score%5Cn%20%20%20%20%20%20%20%20%20%20%20%20))%5Cn%20%20%20%20%20%20%20%20self.db_conn.commit()%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E6%96%B0%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE%E5%B7%B2%E5%AD%98%E5%85%A5%E6%9C%AC%E5%9C%B0%E6%95%B0%E6%8D%AE%E5%BA%93%5C%22)%5Cn%5Cn%20%20%20%20%23%20%E5%AF%BC%E5%87%BA%E5%85%A8%E9%83%A8%E6%95%B0%E6%8D%AE%E5%88%B0Excel%E8%A1%A8%E6%A0%BC%5Cn%20%20%20%20def%20export_to_csv(self)%3A%5Cn%20%20%20%20%20%20%20%20df%20%3D%20pd.DataFrame(self.all_comment_list)%5Cn%20%20%20%20%20%20%20%20df.to_csv(f%5C%22%E5%95%86%E5%93%81%7Bself.item_id%7D_%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE.csv%5C%22%2C%20index%3DFalse%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E8%AF%84%E4%BB%B7%E8%A1%A8%E6%A0%BC%E5%AF%BC%E5%87%BA%E5%AE%8C%E6%88%90%5C%22)%5Cn%5Cn%20%20%20%20%23%207%C3%9724%E5%B0%8F%E6%97%B6%E5%AE%9A%E6%97%B6%E7%9B%91%E6%8E%A7%E5%85%A5%E5%8F%A3%EF%BC%8C%E6%AF%8F30%E5%88%86%E9%92%9F%E8%BD%AE%E8%AF%A2%E4%B8%80%E6%AC%A1%5Cn%20%20%20%20def%20start_real_time_monitor(self%2C%20interval%3D1800)%3A%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E5%90%AF%E5%8A%A8%E5%AE%9E%E6%97%B6%E5%8F%A3%E7%A2%91%E7%9B%91%E6%8E%A7%EF%BC%8C%E6%AF%8F30%E5%88%86%E9%92%9F%E8%87%AA%E5%8A%A8%E6%8A%93%E5%8F%96%E6%96%B0%E5%A2%9E%E8%AF%84%E4%BB%B7...%5C%22)%5Cn%20%20%20%20%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20self.batch_crawl_all(max_page%3D2)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20self.save_to_local_db()%5Cn%20%20%20%20%20%20%20%20%20%20%20%20self.all_comment_list.clear()%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E7%AD%89%E5%BE%85%7Binterval%2F60%7D%E5%88%86%E9%92%9F%E5%90%8E%E6%89%A7%E8%A1%8C%E4%B8%8B%E4%B8%80%E8%BD%AE%E9%87%87%E9%9B%86%5C%5Cn%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(interval)%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;requests
import&amp;nbsp;json
import&amp;nbsp;time
import&amp;nbsp;random
import&amp;nbsp;pandas&amp;nbsp;as&amp;nbsp;pd
import&amp;nbsp;sqlite3
from&amp;nbsp;snownlp&amp;nbsp;import&amp;nbsp;SnowNLP
import&amp;nbsp;jieba
import&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt

#&amp;nbsp;1.&amp;nbsp;基础鉴权配置（替换为自己后台凭证）
ACCESS_KEY&amp;nbsp;=&amp;nbsp;&amp;quot;你的密钥1&amp;quot;
SECRET_KEY&amp;nbsp;=&amp;nbsp;&amp;quot;你的密钥2&amp;quot;
GATEWAY_URL&amp;nbsp;=&amp;nbsp;&amp;quot;稳定数据通道地址&amp;quot;

class&amp;nbsp;GoodsCommentCollector:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;item_id):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.item_id&amp;nbsp;=&amp;nbsp;item_id
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.all_comment_list&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.db_conn&amp;nbsp;=&amp;nbsp;sqlite3.connect(&amp;quot;goods_comment.db&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.init_db()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;初始化本地数据库，存储历史评价用于增量监控
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;init_db(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;create_sql&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CREATE&amp;nbsp;TABLE&amp;nbsp;IF&amp;nbsp;NOT&amp;nbsp;EXISTS&amp;nbsp;comment_data&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment_id&amp;nbsp;TEXT&amp;nbsp;PRIMARY&amp;nbsp;KEY,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nick&amp;nbsp;TEXT,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;star&amp;nbsp;INTEGER,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content&amp;nbsp;TEXT,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sku&amp;nbsp;TEXT,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rate_date&amp;nbsp;TEXT,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;has_pic&amp;nbsp;INTEGER,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_feedback&amp;nbsp;TEXT,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;emotion_score&amp;nbsp;REAL
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.db_conn.execute(create_sql)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.db_conn.commit()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;单页拉取评价原始数据
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;fetch_single_page(self,&amp;nbsp;page_num=1,&amp;nbsp;page_size=20):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;params&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;key&amp;quot;:&amp;nbsp;ACCESS_KEY,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;secret&amp;quot;:&amp;nbsp;SECRET_KEY,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;item_id&amp;quot;:&amp;nbsp;self.item_id,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page&amp;quot;:&amp;nbsp;page_num,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;page_size&amp;quot;:&amp;nbsp;page_size,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;result_type&amp;quot;:&amp;nbsp;&amp;quot;json&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.get(GATEWAY_URL,&amp;nbsp;params=params,&amp;nbsp;timeout=15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp_data&amp;nbsp;=&amp;nbsp;json.loads(resp.text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;resp_data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except&amp;nbsp;Exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;第{page_num}页采集异常：{str(e)}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;None

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;解析原始数据，清洗结构化字段
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;parse_raw_data(self,&amp;nbsp;raw_json):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;raw_json&amp;nbsp;or&amp;nbsp;&amp;quot;items&amp;quot;&amp;nbsp;not&amp;nbsp;in&amp;nbsp;raw_json:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;False
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment_items&amp;nbsp;=&amp;nbsp;raw_json[&amp;quot;items&amp;quot;].get(&amp;quot;item&amp;quot;,&amp;nbsp;[])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(comment_items)&amp;nbsp;==&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;False
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;comment_items:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment_info&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;comment_id&amp;quot;:&amp;nbsp;item.get(&amp;quot;rate_id&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;nick&amp;quot;:&amp;nbsp;item.get(&amp;quot;display_user_nick&amp;quot;,&amp;nbsp;&amp;quot;匿名用户&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;star&amp;quot;:&amp;nbsp;int(item.get(&amp;quot;user_star&amp;quot;,&amp;nbsp;5)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;content&amp;quot;:&amp;nbsp;item.get(&amp;quot;rate_content&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;).strip(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sku&amp;quot;:&amp;nbsp;item.get(&amp;quot;auction_sku&amp;quot;,&amp;nbsp;&amp;quot;无规格&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;rate_date&amp;quot;:&amp;nbsp;item.get(&amp;quot;rate_date&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;has_pic&amp;quot;:&amp;nbsp;1&amp;nbsp;if&amp;nbsp;item.get(&amp;quot;pics&amp;quot;,&amp;nbsp;[])&amp;nbsp;else&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;add_feedback&amp;quot;:&amp;nbsp;item.get(&amp;quot;add_feedback&amp;quot;,&amp;nbsp;&amp;quot;无追评&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;过滤空白无意义评价
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;comment_info[&amp;quot;content&amp;quot;]&amp;nbsp;in&amp;nbsp;[&amp;quot;此用户没有填写评价。&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.all_comment_list.append(comment_info)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;True

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;批量全量采集，自动分页循环
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;batch_crawl_all(self,&amp;nbsp;max_page=50):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;page&amp;nbsp;in&amp;nbsp;range(1,&amp;nbsp;max_page&amp;nbsp;+&amp;nbsp;1):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;正在采集第{page}页评价数据...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw_data&amp;nbsp;=&amp;nbsp;self.fetch_single_page(page_num=page)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parse_result&amp;nbsp;=&amp;nbsp;self.parse_raw_data(raw_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;parse_result:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;无更多评价，全量采集完成&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;随机休眠，平稳请求频率
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(random.uniform(1.2,&amp;nbsp;3.0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;本次共采集有效评价{len(self.all_comment_list)}条&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;增量入库：仅写入本地不存在的新评价
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;save_to_local_db(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;insert_sql&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INSERT&amp;nbsp;OR&amp;nbsp;IGNORE&amp;nbsp;INTO&amp;nbsp;comment_data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(comment_id,&amp;nbsp;nick,&amp;nbsp;star,&amp;nbsp;content,&amp;nbsp;sku,&amp;nbsp;rate_date,&amp;nbsp;has_pic,&amp;nbsp;add_feedback,&amp;nbsp;emotion_score)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VALUES&amp;nbsp;(?,&amp;nbsp;?,&amp;nbsp;?,&amp;nbsp;?,&amp;nbsp;?,&amp;nbsp;?,&amp;nbsp;?,&amp;nbsp;?,&amp;nbsp;?)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;comment&amp;nbsp;in&amp;nbsp;self.all_comment_list:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;情感打分0-1，大于0.5正向，小于0.3负向
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s&amp;nbsp;=&amp;nbsp;SnowNLP(comment[&amp;quot;content&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;score&amp;nbsp;=&amp;nbsp;s.sentiments
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.db_conn.execute(insert_sql,&amp;nbsp;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment[&amp;quot;comment_id&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment[&amp;quot;nick&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment[&amp;quot;star&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment[&amp;quot;content&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment[&amp;quot;sku&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment[&amp;quot;rate_date&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment[&amp;quot;has_pic&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment[&amp;quot;add_feedback&amp;quot;],
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;score
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.db_conn.commit()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;新评价数据已存入本地数据库&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;导出全部数据到Excel表格
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;export_to_csv(self):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;pd.DataFrame(self.all_comment_list)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df.to_csv(f&amp;quot;商品{self.item_id}_评价数据.csv&amp;quot;,&amp;nbsp;index=False,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;评价表格导出完成&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;7×24小时定时监控入口，每30分钟轮询一次
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;start_real_time_monitor(self,&amp;nbsp;interval=1800):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;启动实时口碑监控，每30分钟自动抓取新增评价...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.batch_crawl_all(max_page=2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.save_to_local_db()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.all_comment_list.clear()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;等待{interval/60}分钟后执行下一轮采集\n&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(interval)&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;3.2 评论情感分析 + 可视化代码&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;2&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22def%20draw_emotion_chart(item_id)%3A%5Cn%20%20%20%20conn%20%3D%20sqlite3.connect(%5C%22goods_comment.db%5C%22)%5Cn%20%20%20%20df%20%3D%20pd.read_sql(f%5C%22SELECT%20emotion_score%20FROM%20comment_data%5C%22%2C%20conn)%5Cn%20%20%20%20conn.close()%5Cn%5Cn%20%20%20%20%23%20%E5%88%92%E5%88%86%E6%83%85%E6%84%9F%E6%A0%87%E7%AD%BE%5Cn%20%20%20%20def%20label_emotion(score)%3A%5Cn%20%20%20%20%20%20%20%20if%20score%20%3E%3D%200.5%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20%5C%22%E5%A5%BD%E8%AF%84%5C%22%5Cn%20%20%20%20%20%20%20%20elif%20score%20%3E%3D%200.3%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20%5C%22%E4%B8%AD%E8%AF%84%5C%22%5Cn%20%20%20%20%20%20%20%20else%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20%5C%22%E5%B7%AE%E8%AF%84%5C%22%5Cn%20%20%20%20df%5B%5C%22emotion_type%5C%22%5D%20%3D%20df%5B%5C%22emotion_score%5C%22%5D.apply(label_emotion)%5Cn%20%20%20%20emo_count%20%3D%20df%5B%5C%22emotion_type%5C%22%5D.value_counts()%5Cn%5Cn%20%20%20%20%23%20%E7%BB%98%E5%88%B6%E9%A5%BC%E5%9B%BE%5Cn%20%20%20%20plt.rcParams%5B%5C%22font.sans-serif%5C%22%5D%20%3D%20%5B%5C%22SimHei%5C%22%5D%5Cn%20%20%20%20plt.figure(figsize%3D(8%2C%206))%5Cn%20%20%20%20plt.pie(emo_count.values%2C%20labels%3Demo_count.index%2C%20autopct%3D%5C%22%251.2f%25%25%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20colors%3D%5B%5C%22%2346b946%5C%22%2C%20%5C%22%23ffcc5c%5C%22%2C%20%5C%22%23ff5959%5C%22%5D)%5Cn%20%20%20%20plt.title(f%5C%22%E5%95%86%E5%93%81%7Bitem_id%7D%E8%AF%84%E4%BB%B7%E6%83%85%E6%84%9F%E5%88%86%E5%B8%83%5C%22)%5Cn%20%20%20%20plt.savefig(f%5C%22%E5%95%86%E5%93%81%7Bitem_id%7D_%E5%8F%A3%E7%A2%91%E5%88%86%E5%B8%83%E5%9B%BE.png%5C%22%2C%20dpi%3D300)%5Cn%20%20%20%20plt.show()%5Cn%5Cn%23%20%E6%8F%90%E5%8F%96%E5%B7%AE%E8%AF%84%E9%AB%98%E9%A2%91%E5%85%B3%E9%94%AE%E8%AF%8D%5Cndef%20get_negative_keywords()%3A%5Cn%20%20%20%20conn%20%3D%20sqlite3.connect(%5C%22goods_comment.db%5C%22)%5Cn%20%20%20%20bad_df%20%3D%20pd.read_sql(%5C%22SELECT%20content%20FROM%20comment_data%20WHERE%20emotion_score%20%3C%200.3%5C%22%2C%20conn)%5Cn%20%20%20%20conn.close()%5Cn%20%20%20%20all_words%20%3D%20%5B%5D%5Cn%20%20%20%20stop_words%20%3D%20%7B%5C%22%E7%9A%84%5C%22%2C%20%5C%22%E4%BA%86%5C%22%2C%20%5C%22%E5%BE%88%5C%22%2C%20%5C%22%E5%A4%AA%5C%22%2C%20%5C%22%E5%B0%B1%5C%22%2C%20%5C%22%E8%BF%98%5C%22%2C%20%5C%22%E6%9C%89%E7%82%B9%5C%22%2C%20%5C%22%E4%BD%86%E6%98%AF%5C%22%2C%20%5C%22%E6%84%9F%E8%A7%89%5C%22%7D%5Cn%20%20%20%20for%20text%20in%20bad_df%5B%5C%22content%5C%22%5D%3A%5Cn%20%20%20%20%20%20%20%20words%20%3D%20jieba.lcut(text)%5Cn%20%20%20%20%20%20%20%20for%20w%20in%20words%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20len(w)%20%3E%201%20and%20w%20not%20in%20stop_words%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20all_words.append(w)%5Cn%20%20%20%20word_series%20%3D%20pd.Series(all_words).value_counts().head(15)%5Cn%20%20%20%20print(%5C%22%E5%B7%AE%E8%AF%84%E9%AB%98%E9%A2%91%E7%97%9B%E7%82%B9%E8%AF%8DTOP15%EF%BC%9A%5C%22)%5Cn%20%20%20%20print(word_series)%5Cn%20%20%20%20return%20word_series%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;def&amp;nbsp;draw_emotion_chart(item_id):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn&amp;nbsp;=&amp;nbsp;sqlite3.connect(&amp;quot;goods_comment.db&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;pd.read_sql(f&amp;quot;SELECT&amp;nbsp;emotion_score&amp;nbsp;FROM&amp;nbsp;comment_data&amp;quot;,&amp;nbsp;conn)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.close()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;划分情感标签
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;label_emotion(score):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;score&amp;nbsp;&amp;gt;=&amp;nbsp;0.5:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;quot;好评&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;score&amp;nbsp;&amp;gt;=&amp;nbsp;0.3:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;quot;中评&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;quot;差评&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df[&amp;quot;emotion_type&amp;quot;]&amp;nbsp;=&amp;nbsp;df[&amp;quot;emotion_score&amp;quot;].apply(label_emotion)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;emo_count&amp;nbsp;=&amp;nbsp;df[&amp;quot;emotion_type&amp;quot;].value_counts()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;绘制饼图
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.rcParams[&amp;quot;font.sans-serif&amp;quot;]&amp;nbsp;=&amp;nbsp;[&amp;quot;SimHei&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.figure(figsize=(8,&amp;nbsp;6))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.pie(emo_count.values,&amp;nbsp;labels=emo_count.index,&amp;nbsp;autopct=&amp;quot;%1.2f%%&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;colors=[&amp;quot;#46b946&amp;quot;,&amp;nbsp;&amp;quot;#ffcc5c&amp;quot;,&amp;nbsp;&amp;quot;#ff5959&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.title(f&amp;quot;商品{item_id}评价情感分布&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.savefig(f&amp;quot;商品{item_id}_口碑分布图.png&amp;quot;,&amp;nbsp;dpi=300)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.show()

#&amp;nbsp;提取差评高频关键词
def&amp;nbsp;get_negative_keywords():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn&amp;nbsp;=&amp;nbsp;sqlite3.connect(&amp;quot;goods_comment.db&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bad_df&amp;nbsp;=&amp;nbsp;pd.read_sql(&amp;quot;SELECT&amp;nbsp;content&amp;nbsp;FROM&amp;nbsp;comment_data&amp;nbsp;WHERE&amp;nbsp;emotion_score&amp;nbsp;&amp;lt;&amp;nbsp;0.3&amp;quot;,&amp;nbsp;conn)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.close()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_words&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stop_words&amp;nbsp;=&amp;nbsp;{&amp;quot;的&amp;quot;,&amp;nbsp;&amp;quot;了&amp;quot;,&amp;nbsp;&amp;quot;很&amp;quot;,&amp;nbsp;&amp;quot;太&amp;quot;,&amp;nbsp;&amp;quot;就&amp;quot;,&amp;nbsp;&amp;quot;还&amp;quot;,&amp;nbsp;&amp;quot;有点&amp;quot;,&amp;nbsp;&amp;quot;但是&amp;quot;,&amp;nbsp;&amp;quot;感觉&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;text&amp;nbsp;in&amp;nbsp;bad_df[&amp;quot;content&amp;quot;]:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;words&amp;nbsp;=&amp;nbsp;jieba.lcut(text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;w&amp;nbsp;in&amp;nbsp;words:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(w)&amp;nbsp;&amp;gt;&amp;nbsp;1&amp;nbsp;and&amp;nbsp;w&amp;nbsp;not&amp;nbsp;in&amp;nbsp;stop_words:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_words.append(w)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;word_series&amp;nbsp;=&amp;nbsp;pd.Series(all_words).value_counts().head(15)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;差评高频痛点词TOP15：&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(word_series)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;word_series&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;3.3 程序主运行入口&lt;/p&gt;&lt;div aria-label=&quot;代码段 小部件&quot; class=&quot;cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected&quot; contenteditable=&quot;false&quot; data-cke-display-name=&quot;代码段&quot; data-cke-filter=&quot;off&quot; data-cke-widget-id=&quot;3&quot; data-cke-widget-wrapper=&quot;1&quot; role=&quot;region&quot; tabindex=&quot;-1&quot;&gt;&lt;pre class=&quot;cke_widget_element&quot; data-cke-widget-data=&quot;%7B%22classes%22%3Anull%2C%22lang%22%3Anull%2C%22code%22%3A%22if%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20%23%20%E6%9B%BF%E6%8D%A2%E4%B8%BA%E7%9B%AE%E6%A0%87%E5%95%86%E5%93%81ID%5Cn%20%20%20%20TARGET_GOODS_ID%20%3D%20%5C%221234567890123%5C%22%5Cn%20%20%20%20collector%20%3D%20GoodsCommentCollector(TARGET_GOODS_ID)%5Cn%5Cn%20%20%20%20%23%20%E6%93%8D%E4%BD%9C1%EF%BC%9A%E4%B8%80%E6%AC%A1%E6%80%A7%E5%85%A8%E9%87%8F%E9%87%87%E9%9B%86%E6%89%80%E6%9C%89%E8%AF%84%E4%BB%B7%5Cn%20%20%20%20collector.batch_crawl_all(max_page%3D30)%5Cn%20%20%20%20collector.save_to_local_db()%5Cn%20%20%20%20collector.export_to_csv()%5Cn%5Cn%20%20%20%20%23%20%E6%93%8D%E4%BD%9C2%EF%BC%9A%E7%94%9F%E6%88%90%E5%8F%A3%E7%A2%91%E6%83%85%E6%84%9F%E5%88%86%E5%B8%83%E5%9B%BE%5Cn%20%20%20%20draw_emotion_chart(TARGET_GOODS_ID)%5Cn%5Cn%20%20%20%20%23%20%E6%93%8D%E4%BD%9C3%EF%BC%9A%E6%8F%90%E5%8F%96%E5%B7%AE%E8%AF%84%E6%A0%B8%E5%BF%83%E7%97%9B%E7%82%B9%E8%AF%8D%5Cn%20%20%20%20get_negative_keywords()%5Cn%5Cn%20%20%20%20%23%20%E6%93%8D%E4%BD%9C4%EF%BC%9A%E5%BC%80%E5%90%AF%E9%95%BF%E6%9C%9F%E5%AE%9E%E6%97%B6%E7%9B%91%E6%8E%A7%EF%BC%88%E5%8F%96%E6%B6%88%E6%B3%A8%E9%87%8A%E5%8D%B3%E5%8F%AF7%C3%9724%E5%B0%8F%E6%97%B6%E8%BF%90%E8%A1%8C%EF%BC%89%5Cn%20%20%20%20%23%20collector.start_real_time_monitor(interval%3D1800)%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;替换为目标商品ID
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TARGET_GOODS_ID&amp;nbsp;=&amp;nbsp;&amp;quot;1234567890123&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;collector&amp;nbsp;=&amp;nbsp;GoodsCommentCollector(TARGET_GOODS_ID)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;操作1：一次性全量采集所有评价
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;collector.batch_crawl_all(max_page=30)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;collector.save_to_local_db()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;collector.export_to_csv()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;操作2：生成口碑情感分布图
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;draw_emotion_chart(TARGET_GOODS_ID)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;操作3：提取差评核心痛点词
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get_negative_keywords()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;操作4：开启长期实时监控（取消注释即可7×24小时运行）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;collector.start_real_time_monitor(interval=1800)&lt;/pre&gt;&lt;span class=&quot;cke_reset cke_widget_drag_handler_container&quot; style=&quot;background: url(&amp;quot;https://csdnimg.cn/release/blog_editor_html/release2.4.6/ckeditor/plugins/widget/images/handle.png&amp;quot;) rgba(220, 220, 220, 0.5); top: 0px; left: 0px;&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;h2&gt;四、功能落地效果说明&lt;/h2&gt;&lt;h3&gt;4.1 数据采集优势&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;字段完整全覆盖&lt;/strong&gt;：自动获取买家昵称、星级、正文、晒图标记、购买规格、评价时间、追评，完整还原用户消费反馈；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;分页自动处理&lt;/strong&gt;：无需手动控制翻页，循环采集至无新数据自动终止，万条评价一键拉取；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;稳定无封锁&lt;/strong&gt;：依托成熟数据通道，避开平台页面限制，不会出现传统网页抓取频繁失效、验证码拦截问题；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;缓存加速&lt;/strong&gt;：重复采集时可复用历史缓存，大幅缩短数据返回时间，降低资源消耗。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;4.2 监控与分析能力&lt;/h3&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;增量更新不重复&lt;/strong&gt;：本地数据库存储每条评价唯一标识，定时轮询只抓取新增内容，避免重复存储浪费空间；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;差评自动识别&lt;/strong&gt;：通过情感模型自动区分负面评价，批量提取高频痛点，快速定位产品缺陷（掉色、尺寸偏小、发货慢等）；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;可视化报表直观&lt;/strong&gt;：一键生成好评 / 中评 / 差评占比图表，运营人员无需看懂代码也能看懂口碑整体情况；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;长期数据沉淀&lt;/strong&gt;：SQLite 本地数据库永久存储历史评价，可按月、季度对比口碑变化，用于产品迭代、竞品对比分析。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;五、实际业务使用场景&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;店铺售后预警&lt;/strong&gt;：开启实时监控后，新增差评即时入库，搭配企业微信 / 钉钉推送脚本可实现负面消息秒级提醒，及时联系用户处理；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;产品迭代优化&lt;/strong&gt;：批量提取差评高频词汇，快速锁定产品核心短板，优化面料、做工、包装、物流等环节；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;竞品口碑调研&lt;/strong&gt;：批量采集多款同类竞品评价，对比各方优缺点，制定差异化宣传卖点；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;内容营销素材挖掘&lt;/strong&gt;：筛选高分带图好评，提取用户真实夸赞话术，用于商品详情页、短视频文案；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;运营数据复盘&lt;/strong&gt;：按月导出评价表格，统计晒图率、追评占比、差评率，量化店铺服务与产品质量指标。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;六、避坑实操小贴士&lt;/h2&gt;&lt;ol class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;采集间隔不要低于 1 秒，定时监控建议设置 30 分钟以上，平稳请求频率保证通道稳定；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;空白评价、系统默认无内容评价代码已自动过滤，无需手动清洗；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;如需多商品同时监控，可多实例初始化采集类，分别建立独立数据表；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;长期大批量监控建议部署在轻量云服务器，保持程序后台常驻运行；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;情感分析仅作参考，部分中性吐槽语句会存在打分偏差，可自定义负面关键词词库提升准确度。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;总结&lt;/h2&gt;&lt;p&gt;过去想要搭建一套完整的电商评价监控分析体系，要么投入大量人力手动统计，要么投入开发成本自研抓取方案，维护难度极高。借助 OpenClaw 一站式数据能力，仅需几十行 Python 代码就能完成&lt;strong&gt;采集 - 存储 - 监控 - 分析 - 可视化&lt;/strong&gt;全流程闭环，零基础开发、低成本落地，不管是个人电商从业者、数据实习生还是企业运营团队，都能快速落地用户口碑数字化管理。&lt;/p&gt;&lt;p&gt;后续可拓展优化方向：接入消息推送工具实现差评告警、搭建 Web 可视化后台、接入大模型做评价深度语义解读、多平台商品数据统一汇总分析。&lt;/p&gt;&lt;p&gt;&lt;span data-cke-copybin-end=&quot;1&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 20 Jul 2026 16:21:07 +0800</pubDate></item></channel></rss>