<?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://www.shopapi.com.cn/</link><description>Good Luck To You!</description><item><title>低成本搭建电商商品口碑实时监控系统｜从数据同步到情感分析完整落地（附 Python 可运行代码）</title><link>https://www.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://www.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://www.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://www.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><item><title>低成本搭建电商商品评论监控分析系统｜从实时采集到口碑洞察完整实战（附可运行 Python 代码）</title><link>https://www.shopapi.com.cn/?id=198</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;p&gt;本文完整覆盖工具配置、数据拉取、持久化存储、定时增量监控、评论情感分析、差评告警全流程，代码开箱即用，适配淘宝 / 天猫全品类商品，适合 CSDN、知乎技术分享阅读。&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;：依托 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;：基于评论唯一标识做数据去重，定时循环轮询，只抓取新增评论，减少资源消耗，实现 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;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;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%E6%A0%A1%E9%AA%8C%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%2237bJEH-1784280254984%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;支持多商品分组管理，可分开监控自家店铺商品与竞品商品，数据隔离便于独立复盘；&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;/ol&gt;&lt;p&gt;配置完成后，仅需将后台生成的凭证填入代码变量，即可直接启动采集流程。&lt;/p&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;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%20schedule%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;schedule&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;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%5Cnimport%20schedule%5Cnfrom%20snownlp%20import%20SnowNLP%5Cnimport%20os%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%8C%E6%9B%BF%E6%8D%A2%E4%B8%BA%E4%BD%A0%E5%90%8E%E5%8F%B0%E7%94%9F%E6%88%90%E7%9A%84%E5%87%AD%E8%AF%81%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%E5%90%8E%E5%8F%B0TOKEN%5C%22%5CnPROJECT_ID%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E9%A1%B9%E7%9B%AE%E7%BC%96%E5%8F%B7%5C%22%5CnMONITOR_ITEM_IDS%20%3D%20%5B%5C%22600530677643%5C%22%2C%20%5C%22698754321098%5C%22%5D%20%20%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%5CnSAVE_FILE%20%3D%20%5C%22%E5%95%86%E5%93%81%E8%AF%84%E8%AE%BA%E6%95%B0%E6%8D%AE.csv%5C%22%5CnMONITOR_INTERVAL%20%3D%2010%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%EF%BC%9A%E5%88%86%E9%92%9F%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%5Cn%5Cn%23%20%E5%85%A8%E5%B1%80%E5%AD%98%E5%82%A8%E5%B7%B2%E9%87%87%E9%9B%86%E8%AF%84%E8%AE%BAID%EF%BC%8C%E7%94%A8%E4%BA%8E%E5%A2%9E%E9%87%8F%E5%8E%BB%E9%87%8D%5Cnsaved_review_ids%20%3D%20set()%5Cn%5Cndef%20init_history_data()%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8E%86%E5%8F%B2%E6%95%B0%E6%8D%AE%EF%BC%8C%E8%AF%BB%E5%8F%96%E5%B7%B2%E4%BF%9D%E5%AD%98%E8%AF%84%E8%AE%BAID%5C%22%5C%22%5C%22%5Cn%20%20%20%20global%20saved_review_ids%5Cn%20%20%20%20if%20os.path.exists(SAVE_FILE)%3A%5Cn%20%20%20%20%20%20%20%20df%20%3D%20pd.read_csv(SAVE_FILE%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20%20%20%20%20saved_review_ids%20%3D%20set(df%5B%5C%22%E8%AF%84%E8%AE%BA%E5%94%AF%E4%B8%80ID%5C%22%5D.dropna().tolist())%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E5%8A%A0%E8%BD%BD%E5%8E%86%E5%8F%B2%E6%95%B0%E6%8D%AE%EF%BC%8C%E5%B7%B2%E6%9C%89%E5%8E%86%E5%8F%B2%E8%AF%84%E8%AE%BA%20%7Blen(saved_review_ids)%7D%20%E6%9D%A1%5C%22)%5Cn%20%20%20%20else%3A%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E6%9A%82%E6%97%A0%E5%8E%86%E5%8F%B2%E6%95%B0%E6%8D%AE%EF%BC%8C%E9%A6%96%E6%AC%A1%E5%85%A8%E9%87%8F%E9%87%87%E9%9B%86%5C%22)%5Cn%5Cndef%20get_goods_review(item_id%2C%20page%3D1%2C%20sort%3D1)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%E6%8B%89%E5%8F%96%E5%95%86%E5%93%81%E8%AF%84%E8%AE%BA%E6%95%B0%E6%8D%AE%5Cn%20%20%20%20%3Aparam%20item_id%3A%20%E5%95%86%E5%93%81ID%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%3Aparam%20sort%3A%201%3D%E6%9C%80%E6%96%B0%E8%AF%84%E8%AE%BA%E6%8E%92%E5%BA%8F%EF%BC%8C0%3D%E9%BB%98%E8%AE%A4%E6%8E%92%E5%BA%8F%5Cn%20%20%20%20%3Areturn%3A%20%E5%8D%95%E9%A1%B5%E8%AF%84%E8%AE%BA%E5%88%97%E8%A1%A8%5Cn%20%20%20%20%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%22Content-Type%5C%22%3A%20%5C%22application%2Fjson%5C%22%5Cn%20%20%20%20%7D%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_id%5C%22%3A%20PROJECT_ID%2C%5Cn%20%20%20%20%20%20%20%20%5C%22goods_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%22sort%5C%22%3A%20sort%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%2Fdata-collect.openclaw.cloud%2Fgoods%2Freview%5C%22%2C%20headers%3Dheaders%2C%20params%3Dparams%2C%20timeout%3D20)%5Cn%20%20%20%20%20%20%20%20res_json%20%3D%20resp.json()%5Cn%20%20%20%20%20%20%20%20if%20res_json.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%7Bres_json.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%20return%20res_json.get(%5C%22data%5C%22%2C%20%5B%5D)%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%5Cn%5Cndef%20parse_review_raw(raw_list%2C%20item_id)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E8%A7%A3%E6%9E%90%E5%8E%9F%E5%A7%8B%E8%BF%94%E5%9B%9E%E6%95%B0%E6%8D%AE%EF%BC%8C%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%20review_list%20%3D%20%5B%5D%5Cn%20%20%20%20for%20item%20in%20raw_list%3A%5Cn%20%20%20%20%20%20%20%20review_id%20%3D%20item.get(%5C%22rate_id%5C%22%2C%20%5C%22%5C%22)%5Cn%20%20%20%20%20%20%20%20if%20review_id%20in%20saved_review_ids%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20continue%5Cn%20%20%20%20%20%20%20%20%23%20%E5%8D%95%E6%9D%A1%E8%AF%84%E8%AE%BA%E7%BB%93%E6%9E%84%E5%8C%96%E5%AD%97%E6%AE%B5%5Cn%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%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%E8%AE%BA%E5%94%AF%E4%B8%80ID%5C%22%3A%20review_id%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%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%5C%22%E8%AF%84%E8%AE%BA%E6%98%9F%E7%BA%A7%5C%22%3A%20item.get(%5C%22rate_star%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%E8%AE%BA%E6%AD%A3%E6%96%87%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%5C%22%E8%B4%AD%E4%B9%B0%E8%A7%84%E6%A0%BC%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%22%E8%AF%84%E8%AE%BA%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%5C%22%E6%99%92%E5%9B%BE%E9%93%BE%E6%8E%A5%5C%22%3A%20%5C%22%2C%5C%22.join(item.get(%5C%22pics%5C%22%2C%20%5B%5D))%20if%20item.get(%5C%22pics%5C%22)%20else%20%5C%22%5C%22%2C%5Cn%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%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22%E8%BF%BD%E8%AF%84%E5%9B%BE%E7%89%87%5C%22%3A%20%5C%22%2C%5C%22.join(item.get(%5C%22add_feedback_images%5C%22%2C%20%5B%5D))%20if%20item.get(%5C%22add_feedback_images%5C%22)%20else%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%E8%A7%86%E9%A2%91%5C%22%3A%20item.get(%5C%22video%5C%22%2C%20%5C%22%5C%22)%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%23%20%E7%AE%80%E5%8D%95%E6%83%85%E6%84%9F%E5%88%86%E6%9E%90%5Cn%20%20%20%20%20%20%20%20text_all%20%3D%20review_info%5B%5C%22%E8%AF%84%E8%AE%BA%E6%AD%A3%E6%96%87%5C%22%5D%20%2B%20review_info%5B%5C%22%E8%BF%BD%E8%AF%84%E5%86%85%E5%AE%B9%5C%22%5D%5Cn%20%20%20%20%20%20%20%20if%20text_all.strip()%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20s%20%3D%20SnowNLP(text_all)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20sentiment_score%20%3D%20s.sentiments%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20sentiment_score%20%3E%3D%200.6%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20review_info%5B%5C%22%E6%83%85%E6%84%9F%E6%A0%87%E7%AD%BE%5C%22%5D%20%3D%20%5C%22%E5%A5%BD%E8%AF%84%5C%22%5Cn%20%20%20%20%20%20%20%20%20%20%20%20elif%20sentiment_score%20%3E%3D%200.3%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20review_info%5B%5C%22%E6%83%85%E6%84%9F%E6%A0%87%E7%AD%BE%5C%22%5D%20%3D%20%5C%22%E4%B8%AD%E8%AF%84%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%20review_info%5B%5C%22%E6%83%85%E6%84%9F%E6%A0%87%E7%AD%BE%5C%22%5D%20%3D%20%5C%22%E5%B7%AE%E8%AF%84%5C%22%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%96%B0%E5%A2%9E%E5%B7%AE%E8%AF%84%E8%A7%A6%E5%8F%91%E5%91%8A%E8%AD%A6%E9%80%BB%E8%BE%91%EF%BC%8C%E5%8F%AF%E6%89%A9%E5%B1%95%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%2F%E9%82%AE%E4%BB%B6%E6%8E%A8%E9%80%81%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%E5%95%86%E5%93%81%7Bitem_id%7D%E6%96%B0%E5%A2%9E%E5%B7%AE%E8%AF%84%EF%BC%9A%7Breview_info%5B&amp;#39;%E8%AF%84%E8%AE%BA%E6%AD%A3%E6%96%87&amp;#39;%5D%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20else%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20review_info%5B%5C%22%E6%83%85%E6%84%9F%E6%A0%87%E7%AD%BE%5C%22%5D%20%3D%20%5C%22%E6%97%A0%E5%86%85%E5%AE%B9%5C%22%5Cn%20%20%20%20%20%20%20%20saved_review_ids.add(review_id)%5Cn%20%20%20%20%20%20%20%20review_list.append(review_info)%5Cn%20%20%20%20return%20review_list%5Cn%5Cndef%20batch_crawl_item(item_id)%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%2F%E5%A2%9E%E9%87%8F%E9%87%87%E9%9B%86%5C%22%5C%22%5C%22%5Cn%20%20%20%20all_new_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_data%20%3D%20get_goods_review(item_id%2C%20page%3Dpage%2C%20sort%3D1)%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%20page_data%20%3D%20parse_review_raw(raw_data%2C%20item_id)%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%20%23%20%E5%BD%93%E5%89%8D%E9%A1%B5%E6%97%A0%E6%96%B0%E5%A2%9E%E8%AF%84%E8%AE%BA%EF%BC%8C%E5%81%9C%E6%AD%A2%E5%88%86%E9%A1%B5%5Cn%20%20%20%20%20%20%20%20%20%20%20%20break%5Cn%20%20%20%20%20%20%20%20all_new_data.extend(page_data)%5Cn%20%20%20%20%20%20%20%20page%20%2B%3D%201%5Cn%20%20%20%20%20%20%20%20time.sleep(1)%5Cn%20%20%20%20return%20all_new_data%5Cn%5Cndef%20save_to_csv(new_data)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96%E4%BF%9D%E5%AD%98%E8%87%B3CSV%5C%22%5C%22%5C%22%5Cn%20%20%20%20if%20not%20new_data%3A%5Cn%20%20%20%20%20%20%20%20return%5Cn%20%20%20%20df_new%20%3D%20pd.DataFrame(new_data)%5Cn%20%20%20%20if%20os.path.exists(SAVE_FILE)%3A%5Cn%20%20%20%20%20%20%20%20df_old%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_merge%20%3D%20pd.concat(%5Bdf_old%2C%20df_new%5D%2C%20ignore_index%3DTrue)%5Cn%20%20%20%20else%3A%5Cn%20%20%20%20%20%20%20%20df_merge%20%3D%20df_new%5Cn%20%20%20%20df_merge.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%9C%AC%E6%AC%A1%E6%96%B0%E5%A2%9E%E8%AF%84%E8%AE%BA%20%7Blen(new_data)%7D%20%E6%9D%A1%EF%BC%8C%E5%B7%B2%E5%AE%8C%E6%88%90%E5%AD%98%E5%82%A8%5C%22)%5Cn%5Cndef%20monitor_task()%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E5%AE%9A%E6%97%B6%E7%9B%91%E6%8E%A7%E4%B8%BB%E4%BB%BB%E5%8A%A1%5C%22%5C%22%5C%22%5Cn%20%20%20%20print(%5C%22%3D%3D%3D%3D%3D%20%E5%90%AF%E5%8A%A8%E4%B8%80%E8%BD%AE%E5%95%86%E5%93%81%E8%AF%84%E8%AE%BA%E7%9B%91%E6%8E%A7%20%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20init_history_data()%5Cn%20%20%20%20total_new%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%20print(f%5C%22%E6%AD%A3%E5%9C%A8%E9%87%87%E9%9B%86%E5%95%86%E5%93%81%20%7Bgoods_id%7D%20%E6%96%B0%E5%A2%9E%E8%AF%84%E8%AE%BA...%5C%22)%5Cn%20%20%20%20%20%20%20%20new_comments%20%3D%20batch_crawl_item(goods_id)%5Cn%20%20%20%20%20%20%20%20total_new.extend(new_comments)%5Cn%20%20%20%20save_to_csv(total_new)%5Cn%20%20%20%20print(%5C%22%3D%3D%3D%3D%3D%20%E6%9C%AC%E8%BD%AE%E7%9B%91%E6%8E%A7%E6%89%A7%E8%A1%8C%E5%AE%8C%E6%88%90%EF%BC%8C%E7%AD%89%E5%BE%85%E4%B8%8B%E4%B8%80%E8%BD%AE%20%3D%3D%3D%3D%5C%5Cn%5C%22)%5Cn%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8E%86%E5%8F%B2%E6%95%B0%E6%8D%AE%5Cn%20%20%20%20init_history_data()%5Cn%20%20%20%20%23%20%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1%E9%85%8D%E7%BD%AE%EF%BC%8C%E6%AF%8F10%E5%88%86%E9%92%9F%E6%89%A7%E8%A1%8C%E4%B8%80%E6%AC%A1%E7%9B%91%E6%8E%A7%5Cn%20%20%20%20schedule.every(MONITOR_INTERVAL).minutes.do(monitor_task)%5Cn%20%20%20%20print(f%5C%22%E7%9B%91%E6%8E%A7%E7%B3%BB%E7%BB%9F%E5%B7%B2%E5%90%AF%E5%8A%A8%EF%BC%8C%E6%AF%8F%7BMONITOR_INTERVAL%7D%E5%88%86%E9%92%9F%E8%87%AA%E5%8A%A8%E6%8B%89%E5%8F%96%E6%96%B0%E5%A2%9E%E8%AF%84%E8%AE%BA%EF%BC%8CCtrl%2BC%E5%81%9C%E6%AD%A2%E7%A8%8B%E5%BA%8F%5C%22)%5Cn%20%20%20%20%23%20%E5%B8%B8%E9%A9%BB%E5%BE%AA%E7%8E%AF%5Cn%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20schedule.run_pending()%5Cn%20%20%20%20%20%20%20%20time.sleep(30)%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;schedule
from&amp;nbsp;snownlp&amp;nbsp;import&amp;nbsp;SnowNLP
import&amp;nbsp;os

#&amp;nbsp;=====================&amp;nbsp;配置区，替换为你后台生成的凭证&amp;nbsp;=====================
TOKEN&amp;nbsp;=&amp;nbsp;&amp;quot;你的后台TOKEN&amp;quot;
PROJECT_ID&amp;nbsp;=&amp;nbsp;&amp;quot;你的项目编号&amp;quot;
MONITOR_ITEM_IDS&amp;nbsp;=&amp;nbsp;[&amp;quot;600530677643&amp;quot;,&amp;nbsp;&amp;quot;698754321098&amp;quot;]&amp;nbsp;&amp;nbsp;#&amp;nbsp;需要监控的商品ID列表
SAVE_FILE&amp;nbsp;=&amp;nbsp;&amp;quot;商品评论数据.csv&amp;quot;
MONITOR_INTERVAL&amp;nbsp;=&amp;nbsp;10&amp;nbsp;&amp;nbsp;#&amp;nbsp;监控轮询间隔，单位：分钟
#&amp;nbsp;=======================================================================

#&amp;nbsp;全局存储已采集评论ID，用于增量去重
saved_review_ids&amp;nbsp;=&amp;nbsp;set()

def&amp;nbsp;init_history_data():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;初始化历史数据，读取已保存评论ID&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;global&amp;nbsp;saved_review_ids
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;os.path.exists(SAVE_FILE):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;saved_review_ids&amp;nbsp;=&amp;nbsp;set(df[&amp;quot;评论唯一ID&amp;quot;].dropna().tolist())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;加载历史数据，已有历史评论&amp;nbsp;{len(saved_review_ids)}&amp;nbsp;条&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;print(&amp;quot;暂无历史数据，首次全量采集&amp;quot;)

def&amp;nbsp;get_goods_review(item_id,&amp;nbsp;page=1,&amp;nbsp;sort=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;:param&amp;nbsp;sort:&amp;nbsp;1=最新评论排序，0=默认排序
&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;headers&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;Content-Type&amp;quot;:&amp;nbsp;&amp;quot;application/json&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;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_id&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;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;sort&amp;quot;:&amp;nbsp;sort
&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://data-collect.openclaw.cloud/goods/review&amp;quot;,&amp;nbsp;headers=headers,&amp;nbsp;params=params,&amp;nbsp;timeout=20)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res_json&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;res_json.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}页请求失败：{res_json.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;return&amp;nbsp;res_json.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;网络请求异常：{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_review_raw(raw_list,&amp;nbsp;item_id):
&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;review_list&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;review_id&amp;nbsp;=&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;if&amp;nbsp;review_id&amp;nbsp;in&amp;nbsp;saved_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;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;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;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;review_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;买家昵称&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;quot;评论星级&amp;quot;:&amp;nbsp;item.get(&amp;quot;rate_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;quot;评论正文&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;quot;购买规格&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;评论时间&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;quot;晒图链接&amp;quot;:&amp;nbsp;&amp;quot;,&amp;quot;.join(item.get(&amp;quot;pics&amp;quot;,&amp;nbsp;[]))&amp;nbsp;if&amp;nbsp;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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;追评内容&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;quot;追评图片&amp;quot;:&amp;nbsp;&amp;quot;,&amp;quot;.join(item.get(&amp;quot;add_feedback_images&amp;quot;,&amp;nbsp;[]))&amp;nbsp;if&amp;nbsp;item.get(&amp;quot;add_feedback_images&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;评价视频&amp;quot;:&amp;nbsp;item.get(&amp;quot;video&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;text_all&amp;nbsp;=&amp;nbsp;review_info[&amp;quot;评论正文&amp;quot;]&amp;nbsp;+&amp;nbsp;review_info[&amp;quot;追评内容&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;text_all.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;s&amp;nbsp;=&amp;nbsp;SnowNLP(text_all)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sentiment_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;if&amp;nbsp;sentiment_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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;review_info[&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif&amp;nbsp;sentiment_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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;review_info[&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;&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;review_info[&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;新增差评触发告警逻辑，可扩展企业微信/邮件推送
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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}新增差评：{review_info[&amp;#39;评论正文&amp;#39;]}&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;review_info[&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;saved_review_ids.add(review_id)
&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

def&amp;nbsp;batch_crawl_item(item_id):
&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_new_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_data&amp;nbsp;=&amp;nbsp;get_goods_review(item_id,&amp;nbsp;page=page,&amp;nbsp;sort=1)
&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;page_data&amp;nbsp;=&amp;nbsp;parse_review_raw(raw_data,&amp;nbsp;item_id)
&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;&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_new_data.extend(page_data)
&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;return&amp;nbsp;all_new_data

def&amp;nbsp;save_to_csv(new_data):
&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;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;df_new&amp;nbsp;=&amp;nbsp;pd.DataFrame(new_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;os.path.exists(SAVE_FILE):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_old&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_merge&amp;nbsp;=&amp;nbsp;pd.concat([df_old,&amp;nbsp;df_new],&amp;nbsp;ignore_index=True)
&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;df_merge&amp;nbsp;=&amp;nbsp;df_new
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_merge.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;本次新增评论&amp;nbsp;{len(new_data)}&amp;nbsp;条，已完成存储&amp;quot;)

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;print(&amp;quot;=====&amp;nbsp;启动一轮商品评论监控&amp;nbsp;=====&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;init_history_data()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_new&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;print(f&amp;quot;正在采集商品&amp;nbsp;{goods_id}&amp;nbsp;新增评论...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_comments&amp;nbsp;=&amp;nbsp;batch_crawl_item(goods_id)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_new.extend(new_comments)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;save_to_csv(total_new)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;=====&amp;nbsp;本轮监控执行完成，等待下一轮&amp;nbsp;====\n&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;init_history_data()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;定时任务配置，每10分钟执行一次监控
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;schedule.every(MONITOR_INTERVAL).minutes.do(monitor_task)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;监控系统已启动，每{MONITOR_INTERVAL}分钟自动拉取新增评论，Ctrl+C停止程序&amp;quot;)
&amp;nbsp;&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;schedule.run_pending()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(30)&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;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%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%5Cndef%20analyze_comment_data(file_path)%3A%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%20print(%5C%22%3D%3D%3D%20%E5%95%86%E5%93%81%E8%AF%84%E8%AE%BA%E6%95%B4%E4%BD%93%E7%BB%9F%E8%AE%A1%20%3D%3D%3D%5C%22)%5Cn%20%20%20%20print(f%5C%22%E6%80%BB%E8%AF%84%E8%AE%BA%E6%9D%A1%E6%95%B0%EF%BC%9A%7Blen(df)%7D%5C%22)%5Cn%20%20%20%20print(df%5B%5C%22%E6%83%85%E6%84%9F%E6%A0%87%E7%AD%BE%5C%22%5D.value_counts())%5Cn%20%20%20%20print(%5C%22-%5C%22%20*%2040)%5Cn%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%EF%BC%8C%E5%88%86%E8%AF%8D%E7%BB%9F%E8%AE%A1%E9%AB%98%E9%A2%91%E7%97%9B%E7%82%B9%E8%AF%8D%5Cn%20%20%20%20bad_comments%20%3D%20df%5Bdf%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%5B%5C%22%E8%AF%84%E8%AE%BA%E6%AD%A3%E6%96%87%5C%22%5D.tolist()%5Cn%20%20%20%20all_text%20%3D%20%5C%22%5C%22.join(bad_comments)%5Cn%20%20%20%20words%20%3D%20jieba.lcut(all_text)%5Cn%20%20%20%20%23%20%E8%BF%87%E6%BB%A4%E6%97%A0%E6%84%8F%E4%B9%89%E5%81%9C%E7%94%A8%E8%AF%8D%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%E6%9C%89%E7%82%B9%5C%22%2C%20%5C%22%E8%BF%98%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%5Cn%20%20%20%20word_filter%20%3D%20%5Bw%20for%20w%20in%20words%20if%20len(w)%20%3E%201%20and%20w%20not%20in%20stop_words%5D%5Cn%20%20%20%20word_count%20%3D%20Counter(word_filter)%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%E5%85%B3%E9%94%AE%E8%AF%8DTop15%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%5Cn%20%20%20%20%23%20%E7%BB%98%E5%88%B6%E6%83%85%E6%84%9F%E5%88%86%E5%B8%83%E9%A5%BC%E5%9B%BE%5Cn%20%20%20%20emo_count%20%3D%20df%5B%5C%22%E6%83%85%E6%84%9F%E6%A0%87%E7%AD%BE%5C%22%5D.value_counts()%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%20colors%3D%5B%5C%22%2366cc66%5C%22%2C%20%5C%22%23ffcc66%5C%22%2C%20%5C%22%23ff6666%5C%22%2C%20%5C%22%23cccccc%5C%22%5D)%5Cn%20%20%20%20plt.title(%5C%22%E5%95%86%E5%93%81%E8%AF%84%E8%AE%BA%E6%83%85%E6%84%9F%E5%88%86%E5%B8%83%5C%22)%5Cn%20%20%20%20plt.savefig(%5C%22%E8%AF%84%E8%AE%BA%E6%83%85%E6%84%9F%E5%88%86%E5%B8%83.png%5C%22%2C%20dpi%3D300)%5Cn%20%20%20%20plt.show()%5Cn%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20analyze_comment_data(%5C%22%E5%95%86%E5%93%81%E8%AF%84%E8%AE%BA%E6%95%B0%E6%8D%AE.csv%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;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

def&amp;nbsp;analyze_comment_data(file_path):
&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;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;print(df[&amp;quot;情感标签&amp;quot;].value_counts())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;-&amp;quot;&amp;nbsp;*&amp;nbsp;40)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;提取差评文本，分词统计高频痛点词
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bad_comments&amp;nbsp;=&amp;nbsp;df[df[&amp;quot;情感标签&amp;quot;]&amp;nbsp;==&amp;nbsp;&amp;quot;差评&amp;quot;][&amp;quot;评论正文&amp;quot;].tolist()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_text&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(bad_comments)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;words&amp;nbsp;=&amp;nbsp;jieba.lcut(all_text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;quot;收到&amp;quot;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;word_filter&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;stop_words]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;word_count&amp;nbsp;=&amp;nbsp;Counter(word_filter)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;差评高频痛点关键词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;emo_count&amp;nbsp;=&amp;nbsp;df[&amp;quot;情感标签&amp;quot;].value_counts()
&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;colors=[&amp;quot;#66cc66&amp;quot;,&amp;nbsp;&amp;quot;#ffcc66&amp;quot;,&amp;nbsp;&amp;quot;#ff6666&amp;quot;,&amp;nbsp;&amp;quot;#cccccc&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.savefig(&amp;quot;评论情感分布.png&amp;quot;,&amp;nbsp;dpi=300)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.show()

if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;analyze_comment_data(&amp;quot;商品评论数据.csv&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;：启动时自动读取历史所有评论唯一标识，轮询时仅抓取全新评论，避免重复存储，大幅降低存储占用；&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;：依靠 schedule 库实现后台常驻运行，自定义监控间隔，多商品批量同步追踪；&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 轻量化文本情感模型，自动区分好评 / 中评 / 差评，出现差评实时控制台预警，可自行扩展对接企业微信、钉钉消息推送；&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 脚本，无复杂依赖，Windows、Mac、Linux、轻量云服务器均可直接运行。&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;/p&gt;&lt;h3&gt;场景 2：竞品深度调研分析&lt;/h3&gt;&lt;p&gt;批量添加多款竞品商品 ID，长期沉淀竞品全量用户反馈，对比自身与竞品的用户痛点差异，找到差异化产品优化方向，用于新品研发、详情页卖点调整。&lt;/p&gt;&lt;h3&gt;场景 3：市场舆情复盘&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;：普通日常监控建议 10–15 分钟一轮；大促流量高峰期可缩短至 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;strong&gt;存储方案选择&lt;/strong&gt;：商品数量少于 10 款、评论总量 10 万条以内使用 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;：工具后台自带访问限流策略，代码内已增加分页休眠，无需额外搭建代理池，避免频繁访问限制；&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 适合轻量快速分析，若需要更高精准度可替换第三方大模型文本识别能力，优化评价分类准确率；&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;：可在差评预警代码段增加 webhook 请求，将差评内容自动推送至企业微信群、钉钉群，实现团队协同处理。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;七、总结&lt;/h2&gt;&lt;p&gt;借助 OpenClaw 数据能力，我们避开了传统爬虫频繁维护、逆向失效、风控拦截等一系列难题，仅用几十行 Python 代码就能搭建一套完整的商品评论监控与数据分析体系。整套方案轻量化、低成本，个人开发者、电商运营、产品调研都能快速上手落地。&lt;/p&gt;&lt;p&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>Fri, 17 Jul 2026 17:28:04 +0800</pubDate></item><item><title>电商口碑自动化监控方案：30 分钟搭建商品评论实时采集 + 情感分析系统（完整可运行代码）</title><link>https://www.shopapi.com.cn/?id=197</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;span id=&quot;cke_bm_5160S&quot; style=&quot;display:none&quot;&gt;&amp;nbsp;&lt;/span&gt;前言&lt;/h2&gt;&lt;p&gt;做电商运营、竞品调研、产品迭代的同学，几乎都有同一个痛点：人工刷商品评价效率极低。多店铺、多竞品同时跟踪时，每天花几小时翻评价、筛选差评、统计用户痛点，不仅耗时，还容易遗漏突发负面反馈，错过舆情处理黄金时间。&lt;/p&gt;&lt;p&gt;过去尝试过页面解析采集，但平台页面频繁改版、风控拦截、验证码、IP 限制等问题层出不穷，采集脚本隔三差五失效，维护成本极高。今天分享一套稳定成熟的商用数据采集方案，无需逆向页面、无需处理风控，开箱即可实现&lt;strong&gt;全量评论自动抓取、定时监控、文本情感分析、痛点可视化&lt;/strong&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;：一次性获取主评、追评、买家晒图、购买 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;：采集后直接接入 NLP 情感分析，自动区分好评 / 中评 / 差评，提取高频痛点关键词，生成统计图表；&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 实现，无需复杂服务架构，本地电脑、云服务器均可运行，兼容 Windows、Linux、Mac。&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;/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%20wordcloud%20schedule%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&amp;nbsp;schedule&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;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;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;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;wordcloud/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;schedule：定时循环监控任务&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;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%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%227lATkQ-1784185066537%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;code&gt;access_token&lt;/code&gt;替换为自己的凭证），无需额外申请平台权限，开通后即可调用全量商品评价数据。&lt;/p&gt;&lt;h3&gt;3. 获取商品 ID&lt;/h3&gt;&lt;p&gt;打开商品详情页，地址栏&lt;code&gt;id=&lt;/code&gt;后面的数字即为商品唯一标识，例如&lt;code&gt;https://item.taobao.com/item.htm?id=789654321098&lt;/code&gt;，商品 ID：&lt;code&gt;789654321098&lt;/code&gt;。&lt;/p&gt;&lt;h2&gt;三、完整代码实现（分三大模块）&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;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%5Cn%5Cn%23%20%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE%5CnACCESS_TOKEN%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E4%B8%93%E5%B1%9E%E8%AE%BF%E9%97%AE%E5%87%AD%E8%AF%81%5C%22%5CnTARGET_ITEM_ID%20%3D%20%5C%22789654321098%5C%22%20%20%23%20%E7%9B%AE%E6%A0%87%E5%95%86%E5%93%81ID%5CnSAVE_PATH%20%3D%20%5C%22goods_comment_data.csv%5C%22%5Cn%5Cndef%20fetch_goods_comments(item_id%2C%20page%3D1%2C%20page_size%3D20)%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%20ACCESS_TOKEN%2C%5Cn%20%20%20%20%20%20%20%20%5C%22goods_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%22limit%5C%22%3A%20page_size%5Cn%20%20%20%20%7D%5Cn%20%20%20%20%23%20%E6%95%B0%E6%8D%AE%E8%AF%B7%E6%B1%82%E5%9C%B0%E5%9D%80%5Cn%20%20%20%20res%20%3D%20requests.get(%5C%22https%3A%2F%2Fdata-collect-service.com%2Fshop_comment%5C%22%2C%20params%3Dparams)%5Cn%20%20%20%20result%20%3D%20res.json()%5Cn%20%20%20%20if%20result.get(%5C%22code%5C%22)%20!%3D%20200%3A%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E9%87%87%E9%9B%86%E5%A4%B1%E8%B4%A5%EF%BC%9A%7Bresult.get(&amp;#39;msg&amp;#39;)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20return%20None%5Cn%20%20%20%20return%20result.get(%5C%22data%5C%22%2C%20%7B%7D)%5Cn%5Cndef%20parse_comment_data(raw_data)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E6%B8%85%E6%B4%97%E5%8E%9F%E5%A7%8B%E6%95%B0%E6%8D%AE%EF%BC%8C%E6%8F%90%E5%8F%96%E6%9C%89%E6%95%88%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%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%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22comment_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%5C%22buyer_nick%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%5C%22buy_sku%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%22main_comment%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%5C%22append_comment%5C%22%3A%20item.get(%5C%22add_feedback%5C%22%2C%20%5C%22%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_append_img%5C%22%3A%201%20if%20item.get(%5C%22add_feedback_images%5C%22)%20else%200%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22star_score%5C%22%3A%20item.get(%5C%22user_star%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%5Cn%5Cndef%20batch_collect_all_comments(item_id)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E5%88%86%E9%A1%B5%E5%BE%AA%E7%8E%AF%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_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%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...%5C%22)%5Cn%20%20%20%20%20%20%20%20raw%20%3D%20fetch_goods_comments(item_id%2C%20page%3Dpage)%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%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%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%93%E6%9D%9F%5C%22)%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%20%23%20%E5%88%A4%E6%96%AD%E6%98%AF%E5%90%A6%E6%9C%80%E5%90%8E%E4%B8%80%E9%A1%B5%5Cn%20%20%20%20%20%20%20%20total_page%20%3D%20raw.get(%5C%22totalpage%5C%22%2C%201)%5Cn%20%20%20%20%20%20%20%20if%20page%20%3E%3D%20int(total_page)%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%E9%99%90%E6%B5%81%E4%BC%91%E7%9C%A0%5Cn%20%20%20%20%23%20%E4%BF%9D%E5%AD%98%E8%87%B3%E6%9C%AC%E5%9C%B0CSV%5Cn%20%20%20%20df%20%3D%20pd.DataFrame(all_data)%5Cn%20%20%20%20%23%20%E8%BF%BD%E5%8A%A0%E5%86%99%E5%85%A5%EF%BC%8C%E9%81%BF%E5%85%8D%E8%A6%86%E7%9B%96%E5%8E%86%E5%8F%B2%E6%95%B0%E6%8D%AE%5Cn%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20old_df%20%3D%20pd.read_csv(SAVE_PATH%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).drop_duplicates(subset%3D%5B%5C%22comment_id%5C%22%5D)%5Cn%20%20%20%20except%20FileNotFoundError%3A%5Cn%20%20%20%20%20%20%20%20pass%5Cn%20%20%20%20df.to_csv(SAVE_PATH%2C%20index%3DFalse%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20print(f%5C%22%E6%9C%AC%E6%AC%A1%E9%87%87%E9%9B%86%E5%AE%8C%E6%88%90%EF%BC%8C%E7%B4%AF%E8%AE%A1%E6%9C%89%E6%95%88%E8%AF%84%E4%BB%B7%EF%BC%9A%7Blen(df)%7D%E6%9D%A1%5C%22)%5Cn%20%20%20%20return%20all_data%5Cn%5Cn%23%20%E5%8D%95%E6%AC%A1%E9%87%87%E9%9B%86%E6%B5%8B%E8%AF%95%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20batch_collect_all_comments(TARGET_ITEM_ID)%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

#&amp;nbsp;基础配置
ACCESS_TOKEN&amp;nbsp;=&amp;nbsp;&amp;quot;你的专属访问凭证&amp;quot;
TARGET_ITEM_ID&amp;nbsp;=&amp;nbsp;&amp;quot;789654321098&amp;quot;&amp;nbsp;&amp;nbsp;#&amp;nbsp;目标商品ID
SAVE_PATH&amp;nbsp;=&amp;nbsp;&amp;quot;goods_comment_data.csv&amp;quot;

def&amp;nbsp;fetch_goods_comments(item_id,&amp;nbsp;page=1,&amp;nbsp;page_size=20):
&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;ACCESS_TOKEN,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;goods_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;limit&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;nbsp;res&amp;nbsp;=&amp;nbsp;requests.get(&amp;quot;https://data-collect-service.com/shop_comment&amp;quot;,&amp;nbsp;params=params)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;res.json()
&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;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;return&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;result.get(&amp;quot;data&amp;quot;,&amp;nbsp;{})

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;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;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;comment_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;quot;buyer_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;quot;buy_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;quot;main_comment&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;quot;append_comment&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;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_append_img&amp;quot;:&amp;nbsp;1&amp;nbsp;if&amp;nbsp;item.get(&amp;quot;add_feedback_images&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;star_score&amp;quot;:&amp;nbsp;item.get(&amp;quot;user_star&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

def&amp;nbsp;batch_collect_all_comments(item_id):
&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;print(f&amp;quot;正在采集第{page}页评价...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw&amp;nbsp;=&amp;nbsp;fetch_goods_comments(item_id,&amp;nbsp;page=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;=&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;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;all_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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_page&amp;nbsp;=&amp;nbsp;raw.get(&amp;quot;totalpage&amp;quot;,&amp;nbsp;1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;page&amp;nbsp;&amp;gt;=&amp;nbsp;int(total_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;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;#&amp;nbsp;保存至本地CSV
&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;#&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_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;df&amp;nbsp;=&amp;nbsp;pd.concat([old_df,&amp;nbsp;df]).drop_duplicates(subset=[&amp;quot;comment_id&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;pass
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df.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;print(f&amp;quot;本次采集完成，累计有效评价：{len(df)}条&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;all_data

#&amp;nbsp;单次采集测试
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;batch_collect_all_comments(TARGET_ITEM_ID)&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;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%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%E5%81%9C%E7%94%A8%E8%AF%8D%E8%BF%87%E6%BB%A4%EF%BC%8C%E5%89%94%E9%99%A4%E6%97%A0%E6%84%8F%E4%B9%89%E8%AF%8D%E6%B1%87%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%7D%5Cn%5Cndef%20comment_sentiment_analysis()%3A%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_label%20%3D%20%5B%5D%5Cn%20%20%20%20all_text%20%3D%20%5B%5D%5Cn%20%20%20%20negative_text%20%3D%20%5B%5D%5Cn%20%20%20%20for%20idx%2C%20row%20in%20df.iterrows()%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%20text%20%3D%20str(row%5B%5C%22main_comment%5C%22%5D)%20%2B%20str(row%5B%5C%22append_comment%5C%22%5D)%5Cn%20%20%20%20%20%20%20%20if%20text.strip()%20%3D%3D%20%5C%22%5C%22%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20sentiment_label.append(%5C%22%E6%97%A0%E8%AF%84%E4%BB%B7%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20continue%5Cn%20%20%20%20%20%20%20%20%23%20%E6%83%85%E6%84%9F%E6%89%93%E5%88%86%200~1%EF%BC%8C%E8%B6%8A%E9%AB%98%E8%B6%8A%E6%AD%A3%E5%90%91%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%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_label.append(label)%5Cn%20%20%20%20%20%20%20%20all_text.append(text)%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_text.append(text)%5Cn%20%20%20%20df%5B%5C%22sentiment%5C%22%5D%20%3D%20sentiment_label%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%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%5Cn%20%20%20%20%23%201.%20%E8%AF%84%E5%88%86%E5%88%86%E5%B8%83%E7%BB%9F%E8%AE%A1%E5%9B%BE%E8%A1%A8%5Cn%20%20%20%20count_result%20%3D%20df%5B%5C%22sentiment%5C%22%5D.value_counts()%5Cn%20%20%20%20count_result.plot(kind%3D%5C%22bar%5C%22%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%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%E7%BB%9F%E8%AE%A1%5C%22)%5Cn%20%20%20%20plt.savefig(%5C%22sentiment_dist.png%5C%22%2C%20dpi%3D300%2C%20bbox_inches%3D%5C%22tight%5C%22)%5Cn%20%20%20%20plt.close()%5Cn%5Cn%20%20%20%20%23%202.%20%E5%B7%AE%E8%AF%84%E5%85%B3%E9%94%AE%E8%AF%8D%E8%AF%8D%E4%BA%91%5Cn%20%20%20%20words%20%3D%20%5B%5D%5Cn%20%20%20%20for%20text%20in%20negative_text%3A%5Cn%20%20%20%20%20%20%20%20cut_words%20%3D%20jieba.lcut(text)%5Cn%20%20%20%20%20%20%20%20for%20w%20in%20cut_words%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%20words.append(w)%5Cn%20%20%20%20word_count%20%3D%20Counter(words)%5Cn%20%20%20%20cloud_text%20%3D%20%5C%22%20%5C%22.join(words)%5Cn%20%20%20%20wc%20%3D%20WordCloud(%5Cn%20%20%20%20%20%20%20%20font_path%3D%5C%22C%3A%2FWindows%2FFonts%2Fsimhei.ttf%5C%22%2C%5Cn%20%20%20%20%20%20%20%20width%3D1000%2C%20height%3D600%2C%20background_color%3D%5C%22white%5C%22%5Cn%20%20%20%20).generate(cloud_text)%5Cn%20%20%20%20wc.to_file(%5C%22negative_wordcloud.png%5C%22)%5Cn%20%20%20%20print(%5C%22%E6%83%85%E6%84%9F%E5%88%86%E6%9E%90%E5%AE%8C%E6%88%90%EF%BC%8C%E5%B7%B2%E7%94%9F%E6%88%90%E5%88%86%E5%B8%83%E5%9B%BE%E4%B8%8E%E5%B7%AE%E8%AF%84%E8%AF%8D%E4%BA%91%5C%22)%5Cn%20%20%20%20print(%5C%22%E9%AB%98%E9%A2%91%E8%B4%9F%E9%9D%A2%E5%85%B3%E9%94%AE%E8%AF%8DTOP10%EF%BC%9A%5C%22%2C%20word_count.most_common(10))%5Cn%20%20%20%20return%20df%5Cn%5Cn%23%20%E6%89%A7%E8%A1%8C%E5%88%86%E6%9E%90%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20comment_sentiment_analysis()%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

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;}

def&amp;nbsp;comment_sentiment_analysis():
&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_label&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_text&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;negative_text&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;idx,&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;#&amp;nbsp;合并主评+追评完整文本
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text&amp;nbsp;=&amp;nbsp;str(row[&amp;quot;main_comment&amp;quot;])&amp;nbsp;+&amp;nbsp;str(row[&amp;quot;append_comment&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;text.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;&amp;nbsp;&amp;nbsp;&amp;nbsp;sentiment_label.append(&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;continue
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;情感打分&amp;nbsp;0~1，越高越正向
&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;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_label.append(label)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_text.append(text)
&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_text.append(text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df[&amp;quot;sentiment&amp;quot;]&amp;nbsp;=&amp;nbsp;sentiment_label
&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;#&amp;nbsp;1.&amp;nbsp;评分分布统计图表
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count_result&amp;nbsp;=&amp;nbsp;df[&amp;quot;sentiment&amp;quot;].value_counts()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count_result.plot(kind=&amp;quot;bar&amp;quot;,&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;plt.title(&amp;quot;商品评价情感分布统计&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.savefig(&amp;quot;sentiment_dist.png&amp;quot;,&amp;nbsp;dpi=300,&amp;nbsp;bbox_inches=&amp;quot;tight&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.close()

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;2.&amp;nbsp;差评关键词词云
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;words&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;text&amp;nbsp;in&amp;nbsp;negative_text:
&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;for&amp;nbsp;w&amp;nbsp;in&amp;nbsp;cut_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;words.append(w)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;word_count&amp;nbsp;=&amp;nbsp;Counter(words)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cloud_text&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;nbsp;&amp;quot;.join(words)
&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;font_path=&amp;quot;C:/Windows/Fonts/simhei.ttf&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;width=1000,&amp;nbsp;height=600,&amp;nbsp;background_color=&amp;quot;white&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;).generate(cloud_text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wc.to_file(&amp;quot;negative_wordcloud.png&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;情感分析完成，已生成分布图与差评词云&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;高频负面关键词TOP10：&amp;quot;,&amp;nbsp;word_count.most_common(10))
&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;comment_sentiment_analysis()&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;设置定时循环采集，每小时同步一次最新评价，新增差评自动打印预警，实现 7×24 小时口碑监控。&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%20schedule%5Cnimport%20time%5Cnfrom%20module1%20import%20batch_collect_all_comments%5Cnfrom%20module2%20import%20comment_sentiment_analysis%5Cn%5CnTARGET_GOODS_ID%20%3D%20%5C%22789654321098%5C%22%5Cn%5Cndef%20monitor_task()%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E5%AE%9A%E6%97%B6%E7%9B%91%E6%8E%A7%E4%B8%BB%E4%BB%BB%E5%8A%A1%5C%22%5C%22%5C%22%5Cn%20%20%20%20print(%5C%22%3D%3D%3D%3D%3D%20%E5%90%AF%E5%8A%A8%E6%96%B0%E4%B8%80%E8%BD%AE%E5%95%86%E5%93%81%E5%8F%A3%E7%A2%91%E7%9B%91%E6%8E%A7%20%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20%23%201.%20%E6%8B%89%E5%8F%96%E6%9C%80%E6%96%B0%E8%AF%84%E4%BB%B7%5Cn%20%20%20%20batch_collect_all_comments(TARGET_GOODS_ID)%5Cn%20%20%20%20%23%202.%20%E6%89%A7%E8%A1%8C%E6%83%85%E6%84%9F%E5%88%86%E6%9E%90%5Cn%20%20%20%20df%20%3D%20comment_sentiment_analysis()%5Cn%20%20%20%20%23%203.%20%E7%AD%9B%E9%80%89%E6%9C%80%E6%96%B0%E5%B7%AE%E8%AF%84%E9%A2%84%E8%AD%A6%5Cn%20%20%20%20latest_df%20%3D%20df.tail(10)%5Cn%20%20%20%20bad_comment%20%3D%20latest_df%5Blatest_df%5B%5C%22sentiment%5C%22%5D%20%3D%3D%20%5C%22%E5%B7%AE%E8%AF%84%5C%22%5D%5Cn%20%20%20%20if%20len(bad_comment)%20%3E%200%3A%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E2%9A%A0%EF%B8%8F%20%E7%9B%91%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%20for%20idx%2C%20row%20in%20bad_comment.iterrows()%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E6%97%B6%E9%97%B4%EF%BC%9A%7Brow%5B&amp;#39;comment_time&amp;#39;%5D%7D%20%E8%AF%84%E4%BB%B7%EF%BC%9A%7Brow%5B&amp;#39;main_comment&amp;#39;%5D%7D%7Brow%5B&amp;#39;append_comment&amp;#39;%5D%7D%5C%22)%5Cn%20%20%20%20print(%5C%22%E6%9C%AC%E8%BD%AE%E7%9B%91%E6%8E%A7%E4%BB%BB%E5%8A%A1%E7%BB%93%E6%9D%9F%EF%BC%8C%E7%AD%89%E5%BE%85%E4%B8%8B%E4%B8%80%E8%BD%AE%5C%5Cn%5C%22)%5Cn%5Cn%23%20%E8%AE%BE%E7%BD%AE%E6%AF%8F60%E5%88%86%E9%92%9F%E6%89%A7%E8%A1%8C%E4%B8%80%E6%AC%A1%E7%9B%91%E6%8E%A7%5Cnschedule.every(60).minutes.do(monitor_task)%5Cn%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20print(%5C%22%E5%95%86%E5%93%81%E5%8F%A3%E7%A2%91%E7%9B%91%E6%8E%A7%E7%B3%BB%E7%BB%9F%E5%B7%B2%E5%90%AF%E5%8A%A8%EF%BC%8C%E6%8C%81%E7%BB%AD%E8%BF%90%E8%A1%8C%E4%B8%AD...%5C%22)%5Cn%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20schedule.run_pending()%5Cn%20%20%20%20%20%20%20%20time.sleep(30)%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;schedule
import&amp;nbsp;time
from&amp;nbsp;module1&amp;nbsp;import&amp;nbsp;batch_collect_all_comments
from&amp;nbsp;module2&amp;nbsp;import&amp;nbsp;comment_sentiment_analysis

TARGET_GOODS_ID&amp;nbsp;=&amp;nbsp;&amp;quot;789654321098&amp;quot;

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;print(&amp;quot;=====&amp;nbsp;启动新一轮商品口碑监控&amp;nbsp;=====&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;1.&amp;nbsp;拉取最新评价
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;batch_collect_all_comments(TARGET_GOODS_ID)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;2.&amp;nbsp;执行情感分析
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;comment_sentiment_analysis()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;3.&amp;nbsp;筛选最新差评预警
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latest_df&amp;nbsp;=&amp;nbsp;df.tail(10)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bad_comment&amp;nbsp;=&amp;nbsp;latest_df[latest_df[&amp;quot;sentiment&amp;quot;]&amp;nbsp;==&amp;nbsp;&amp;quot;差评&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(bad_comment)&amp;nbsp;&amp;gt;&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;⚠️&amp;nbsp;监测到新增差评，请及时处理：&amp;quot;)
&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;bad_comment.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;print(f&amp;quot;时间：{row[&amp;#39;comment_time&amp;#39;]}&amp;nbsp;评价：{row[&amp;#39;main_comment&amp;#39;]}{row[&amp;#39;append_comment&amp;#39;]}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;本轮监控任务结束，等待下一轮\n&amp;quot;)

#&amp;nbsp;设置每60分钟执行一次监控
schedule.every(60).minutes.do(monitor_task)

if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&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;schedule.run_pending()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(30)&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;批量添加同行竞品商品 ID，持续采集竞品全周期评价，通过词云对比双方用户痛点，找到竞品短板作为自身产品差异化卖点；统计不同 SKU 规格的好评占比，调整店铺备货、主推规格。&lt;/p&gt;&lt;h3&gt;场景 3：新品市场反馈测试&lt;/h3&gt;&lt;p&gt;新品上架后开启自动监控，7 天、15 天、30 天分别导出评价分析报告，快速判断用户接受度，若负面反馈集中则及时调整详情页、产品工艺。&lt;/p&gt;&lt;h2&gt;五、方案对比：传统采集 VS 本方案&lt;/h2&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;/td&gt;
			&lt;td&gt;极高，页面改版、风控频繁失效&lt;/td&gt;
			&lt;td&gt;几乎零维护，底层持续更新适配&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;数据完整性&lt;/td&gt;
			&lt;td&gt;容易缺失追评、晒图、SKU 信息&lt;/td&gt;
			&lt;td&gt;原生全字段，无数据丢失&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;风控风险&lt;/td&gt;
			&lt;td&gt;频繁验证码、IP 封禁、账号限制&lt;/td&gt;
			&lt;td&gt;底层规避风控，稳定长期运行&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;开发难度&lt;/td&gt;
			&lt;td&gt;需要逆向 JS、代理池、解析适配&lt;/td&gt;
			&lt;td&gt;开箱即用，仅修改商品 ID 与凭证&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;自动化能力&lt;/td&gt;
			&lt;td&gt;定时采集易中断，无预警机制&lt;/td&gt;
			&lt;td&gt;自带定时任务 + 差评实时预警&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;&lt;/table&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 存入列表，循环遍历执行采集，一次性监控十款以上商品；&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;：新增企业微信 / 钉钉机器人接口，检测到差评自动推送消息至运营群；&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;电商数据驱动运营已经是行业标配，人工处理海量评价早已跟不上市场节奏。这套轻量化监控分析方案无需复杂开发能力，依托成熟稳定的数据获取能力，搭配 Python 自然语言分析工具，即可搭建完整的商品口碑监控体系。&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>Thu, 16 Jul 2026 15:04:16 +0800</pubDate></item><item><title>电商口碑自动化监控 + 全量评论数据分析实战教程（Python 完整落地）</title><link>https://www.shopapi.com.cn/?id=196</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;strong&gt;商品评论全量自动抓取、长期数据监控、批量文本分析、口碑可视化&lt;/strong&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; 自动同步主评、追评、买家晒图 / 视频、购买规格 SKU、评价时间、脱敏买家昵称、点赞互动数据，无需手动解析页面 DOM，不会因为平台页面改版导致采集失效。&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; 不用搭建代理池、不用维护账号 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; 采集完成后直接用 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;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%22uydmzC-1784105538153%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;h3&gt;2. 开发环境依赖安装&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%20wordcloud%20snowNLP%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;snowNLP&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;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：数据存储、筛选、导出 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;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;wordcloud/matplotlib：生成好评差评词云可视化&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;三、完整采集代码实现（自动分页全量拉取评论）&lt;/h2&gt;&lt;h3&gt;3.1 基础数据采集工具类&lt;/h3&gt;&lt;p&gt;将商品唯一 ID 填入&lt;code&gt;item_id&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%20time%5Cnimport%20pandas%20as%20pd%5Cn%5Cnclass%20ShopCommentMonitor%3A%5Cn%20%20%20%20def%20__init__(self%2C%20access_key%2C%20access_secret)%3A%5Cn%20%20%20%20%20%20%20%20%23%20%E5%B9%B3%E5%8F%B0%E5%AF%86%E9%92%A5%EF%BC%8C%E6%9B%BF%E6%8D%A2%E6%88%90%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%5Cn%20%20%20%20%20%20%20%20self.key%20%3D%20access_key%5Cn%20%20%20%20%20%20%20%20self.secret%20%3D%20access_secret%5Cn%20%20%20%20%20%20%20%20self.base_url%20%3D%20%5C%22%E8%BF%9C%E7%A8%8B%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1%E5%9C%B0%E5%9D%80%5C%22%5Cn%20%20%20%20%20%20%20%20self.all_comment_data%20%3D%20%5B%5D%5Cn%5Cn%20%20%20%20def%20get_single_page_comment(self%2C%20item_id%2C%20page_num%3D1%2C%20page_size%3D20)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%E5%8D%95%E9%A1%B5%E8%8E%B7%E5%8F%96%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%20%20%20%20%20params%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22app_key%5C%22%3A%20self.key%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22app_secret%5C%22%3A%20self.secret%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22product_id%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_num%2C%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%5C%22size%5C%22%3A%20page_size%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(self.base_url%2C%20params%3Dparams%2C%20timeout%3D20)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20result%20%3D%20resp.json()%5Cn%20%20%20%20%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%20%20%20%20%20print(f%5C%22%E7%AC%AC%7Bpage_num%7D%E9%A1%B5%E6%95%B0%E6%8D%AE%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5%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%20%20%20%20%20return%20None%5Cn%20%20%20%20%20%20%20%20%20%20%20%20return%20result%5B%5C%22data%5C%22%5D%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%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%20%20%20%20def%20pull_all_comments(self%2C%20item_id)%3A%5Cn%20%20%20%20%20%20%20%20%5C%22%5C%22%5C%22%E5%BE%AA%E7%8E%AF%E5%88%86%E9%A1%B5%E6%8B%89%E5%8F%96%E5%95%86%E5%93%81%E5%85%A8%E9%83%A8%E8%AF%84%E8%AE%BA%5C%22%5C%22%5C%22%5Cn%20%20%20%20%20%20%20%20page%20%3D%201%5Cn%20%20%20%20%20%20%20%20while%20True%3A%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)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20page_data%20or%20len(page_data%5B%5C%22list%5C%22%5D)%20%3D%3D%200%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%5C%22%E5%85%A8%E9%83%A8%E8%AF%84%E8%AE%BA%E6%8A%93%E5%8F%96%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%E8%A7%A3%E6%9E%90%E5%8D%95%E9%A1%B5%E8%AF%84%E8%AE%BA%E5%88%97%E8%A1%A8%5Cn%20%20%20%20%20%20%20%20%20%20%20%20for%20item%20in%20page_data%5B%5C%22list%5C%22%5D%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%E8%AE%BAID%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%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)%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%22add_feedback%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%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%B4%AD%E4%B9%B0%E8%A7%84%E6%A0%BC%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%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%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%E5%B8%A6%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%E6%98%AF%E5%90%A6%E6%9C%89%E8%BF%BD%E8%AF%84%5C%22%3A%201%20if%20item.get(%5C%22add_feedback%5C%22)%20else%200%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%20self.all_comment_data.append(info)%5Cn%20%20%20%20%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(self.all_comment_data)%7D%E6%9D%A1%E8%AF%84%E4%BB%B7%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20page%20%2B%3D%201%5Cn%20%20%20%20%20%20%20%20%20%20%20%20time.sleep(1)%20%20%23%20%E8%AF%B7%E6%B1%82%E9%97%B4%E9%9A%94%EF%BC%8C%E9%81%BF%E5%85%8D%E9%AB%98%E9%A2%91%E8%AE%BF%E9%97%AE%E9%99%90%E5%88%B6%5Cn%20%20%20%20%20%20%20%20return%20self.all_comment_data%5Cn%5Cn%23%20-------------------%20%E6%89%A7%E8%A1%8C%E9%87%87%E9%9B%86%E9%80%BB%E8%BE%91%20-------------------%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%E8%87%AA%E5%B7%B1%E7%9A%84%E5%AF%86%E9%92%A5%5Cn%20%20%20%20AK%20%3D%20%5C%22%E4%BD%A0%E7%9A%84access_key%5C%22%5Cn%20%20%20%20SK%20%3D%20%5C%22%E4%BD%A0%E7%9A%84access_secret%5C%22%5Cn%20%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%E8%AF%A6%E6%83%85%E9%A1%B5%E9%93%BE%E6%8E%A5%E6%8F%90%E5%8F%96%5Cn%20%20%20%20target_item%20%3D%20%5C%221234567890123%5C%22%5Cn%20%20%20%20monitor%20%3D%20ShopCommentMonitor(AK%2C%20SK)%5Cn%20%20%20%20comment_list%20%3D%20monitor.pull_all_comments(target_item)%5Cn%20%20%20%20%23%20%E5%AF%BC%E5%87%BA%E5%8E%9F%E5%A7%8B%E8%AF%84%E8%AE%BA%E5%88%B0Excel%E6%9C%AC%E5%9C%B0%E5%AD%98%E6%A1%A3%5Cn%20%20%20%20df_raw%20%3D%20pd.DataFrame(comment_list)%5Cn%20%20%20%20df_raw.to_excel(%5C%22%E5%95%86%E5%93%81%E5%8E%9F%E5%A7%8B%E8%AF%84%E8%AE%BA%E6%95%B0%E6%8D%AE.xlsx%5C%22%2C%20index%3DFalse)%5Cn%20%20%20%20print(%5C%22%E5%8E%9F%E5%A7%8B%E8%AF%84%E8%AE%BA%E5%B7%B2%E5%AF%BC%E5%87%BA%E8%87%B3%E6%9C%AC%E5%9C%B0Excel%5C%22)%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

class&amp;nbsp;ShopCommentMonitor:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;__init__(self,&amp;nbsp;access_key,&amp;nbsp;access_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;access_key
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.secret&amp;nbsp;=&amp;nbsp;access_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;远程数据服务地址&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.all_comment_data&amp;nbsp;=&amp;nbsp;[]

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;get_single_page_comment(self,&amp;nbsp;item_id,&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;&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;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;app_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;app_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;product_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;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;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;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(self.base_url,&amp;nbsp;params=params,&amp;nbsp;timeout=20)
&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;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;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;第{page_num}页数据获取失败：{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;&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;result[&amp;quot;data&amp;quot;]
&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;def&amp;nbsp;pull_all_comments(self,&amp;nbsp;item_id):
&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;page&amp;nbsp;=&amp;nbsp;1
&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;page_data&amp;nbsp;=&amp;nbsp;self.get_single_page_comment(item_id,&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;if&amp;nbsp;not&amp;nbsp;page_data&amp;nbsp;or&amp;nbsp;len(page_data[&amp;quot;list&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;&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;for&amp;nbsp;item&amp;nbsp;in&amp;nbsp;page_data[&amp;quot;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;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;评论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;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;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;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;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_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;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;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;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;1&amp;nbsp;if&amp;nbsp;item.get(&amp;quot;add_feedback&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;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_data.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;print(f&amp;quot;已抓取第{page}页，当前累计{len(self.all_comment_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;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;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;self.all_comment_data

#&amp;nbsp;-------------------&amp;nbsp;执行采集逻辑&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;AK&amp;nbsp;=&amp;nbsp;&amp;quot;你的access_key&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SK&amp;nbsp;=&amp;nbsp;&amp;quot;你的access_secret&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;目标商品ID，从商品详情页链接提取
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;target_item&amp;nbsp;=&amp;nbsp;&amp;quot;1234567890123&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor&amp;nbsp;=&amp;nbsp;ShopCommentMonitor(AK,&amp;nbsp;SK)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;comment_list&amp;nbsp;=&amp;nbsp;monitor.pull_all_comments(target_item)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;导出原始评论到Excel本地存档
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_raw&amp;nbsp;=&amp;nbsp;pd.DataFrame(comment_list)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_raw.to_excel(&amp;quot;商品原始评论数据.xlsx&amp;quot;,&amp;nbsp;index=False)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;原始评论已导出至本地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.2 定时增量监控脚本（长效舆情监控）&lt;/h3&gt;&lt;p&gt;如果需要 7×24 小时追踪新增评价、及时捕捉差评，增加定时循环逻辑，对比本地历史数据实现增量更新：&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%20schedule%5Cn%5Cndef%20monitor_task()%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E5%AE%9A%E6%97%B6%E7%9B%91%E6%8E%A7%E4%BB%BB%E5%8A%A1%EF%BC%8C%E6%AF%8F2%E5%B0%8F%E6%97%B6%E6%89%A7%E8%A1%8C%E4%B8%80%E6%AC%A1%E5%A2%9E%E9%87%8F%E9%87%87%E9%9B%86%5C%22%5C%22%5C%22%5Cn%20%20%20%20AK%20%3D%20%5C%22%E4%BD%A0%E7%9A%84access_key%5C%22%5Cn%20%20%20%20SK%20%3D%20%5C%22%E4%BD%A0%E7%9A%84access_secret%5C%22%5Cn%20%20%20%20target_item%20%3D%20%5C%221234567890123%5C%22%5Cn%20%20%20%20monitor%20%3D%20ShopCommentMonitor(AK%2C%20SK)%5Cn%20%20%20%20new_data%20%3D%20monitor.pull_all_comments(target_item)%5Cn%20%20%20%20%23%20%E8%AF%BB%E5%8F%96%E5%8E%86%E5%8F%B2%E5%AD%98%E6%A1%A3%EF%BC%8C%E5%90%88%E5%B9%B6%E5%8E%BB%E9%87%8D%5Cn%20%20%20%20try%3A%5Cn%20%20%20%20%20%20%20%20history_df%20%3D%20pd.read_excel(%5C%22%E5%95%86%E5%93%81%E5%8E%9F%E5%A7%8B%E8%AF%84%E8%AE%BA%E6%95%B0%E6%8D%AE.xlsx%5C%22)%5Cn%20%20%20%20%20%20%20%20new_df%20%3D%20pd.DataFrame(new_data)%5Cn%20%20%20%20%20%20%20%20merge_df%20%3D%20pd.concat(%5Bhistory_df%2C%20new_df%5D).drop_duplicates(subset%3D%5B%5C%22%E8%AF%84%E8%AE%BAID%5C%22%5D)%5Cn%20%20%20%20%20%20%20%20merge_df.to_excel(%5C%22%E5%95%86%E5%93%81%E5%8E%9F%E5%A7%8B%E8%AF%84%E8%AE%BA%E6%95%B0%E6%8D%AE.xlsx%5C%22%2C%20index%3DFalse)%5Cn%20%20%20%20%20%20%20%20add_count%20%3D%20len(merge_df)%20-%20len(history_df)%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E6%9C%AC%E6%AC%A1%E7%9B%91%E6%8E%A7%E6%96%B0%E5%A2%9E%7Badd_count%7D%E6%9D%A1%E8%AF%84%E4%BB%B7%5C%22)%5Cn%20%20%20%20%20%20%20%20%23%20%E7%AD%9B%E9%80%89%E6%96%B0%E5%A2%9E%E5%B7%AE%E8%AF%84%E9%A2%84%E8%AD%A6%EF%BC%88%E5%8F%AF%E5%AF%B9%E6%8E%A5%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%2F%E9%92%89%E9%92%89%E6%8E%A8%E9%80%81%EF%BC%89%5Cn%20%20%20%20%20%20%20%20bad_comment%20%3D%20merge_df%5Bmerge_df%5B%5C%22%E8%AF%84%E4%BB%B7%E5%86%85%E5%AE%B9%5C%22%5D.str.contains(%5C%22%E5%B7%AE%7C%E4%B8%8D%E5%A5%BD%7C%E6%8E%89%E8%89%B2%7C%E7%A0%B4%E6%8D%9F%7C%E4%B8%8D%E5%80%BC%5C%22%2C%20na%3DFalse)%5D%5Cn%20%20%20%20%20%20%20%20if%20len(bad_comment)%20%3E%200%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(%5C%22%E3%80%90%E9%A2%84%E8%AD%A6%E3%80%91%E6%A3%80%E6%B5%8B%E5%88%B0%E8%B4%9F%E9%9D%A2%E8%AF%84%E4%BB%B7%EF%BC%9A%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(bad_comment%5B%5B%5C%22%E8%AF%84%E4%BB%B7%E6%97%B6%E9%97%B4%5C%22%2C%5C%22%E8%AF%84%E4%BB%B7%E5%86%85%E5%AE%B9%5C%22%2C%5C%22%E8%B4%AD%E4%B9%B0%E8%A7%84%E6%A0%BC%5C%22%5D%5D)%5Cn%20%20%20%20except%20FileNotFoundError%3A%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E6%97%A0%E5%8E%86%E5%8F%B2%E5%AD%98%E6%A1%A3%EF%BC%8C%E9%A6%96%E6%AC%A1%E5%85%A8%E9%87%8F%E9%87%87%E9%9B%86%5C%22)%5Cn%5Cn%23%20%E8%AE%BE%E7%BD%AE%E6%AF%8F2%E5%B0%8F%E6%97%B6%E8%87%AA%E5%8A%A8%E6%89%A7%E8%A1%8C%E4%B8%80%E6%AC%A1%E7%9B%91%E6%8E%A7%5Cnschedule.every(2).hours.do(monitor_task)%5Cn%23%20%E6%8C%81%E7%BB%AD%E8%BF%90%E8%A1%8C%E7%9B%91%E6%8E%A7%E7%A8%8B%E5%BA%8F%5Cnwhile%20True%3A%5Cn%20%20%20%20schedule.run_pending()%5Cn%20%20%20%20time.sleep(60)%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;schedule

def&amp;nbsp;monitor_task():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;定时监控任务，每2小时执行一次增量采集&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AK&amp;nbsp;=&amp;nbsp;&amp;quot;你的access_key&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SK&amp;nbsp;=&amp;nbsp;&amp;quot;你的access_secret&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;target_item&amp;nbsp;=&amp;nbsp;&amp;quot;1234567890123&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;monitor&amp;nbsp;=&amp;nbsp;ShopCommentMonitor(AK,&amp;nbsp;SK)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_data&amp;nbsp;=&amp;nbsp;monitor.pull_all_comments(target_item)
&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_excel(&amp;quot;商品原始评论数据.xlsx&amp;quot;)
&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_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;merge_df&amp;nbsp;=&amp;nbsp;pd.concat([history_df,&amp;nbsp;new_df]).drop_duplicates(subset=[&amp;quot;评论ID&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;merge_df.to_excel(&amp;quot;商品原始评论数据.xlsx&amp;quot;,&amp;nbsp;index=False)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add_count&amp;nbsp;=&amp;nbsp;len(merge_df)&amp;nbsp;-&amp;nbsp;len(history_df)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;本次监控新增{add_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;bad_comment&amp;nbsp;=&amp;nbsp;merge_df[merge_df[&amp;quot;评价内容&amp;quot;].str.contains(&amp;quot;差|不好|掉色|破损|不值&amp;quot;,&amp;nbsp;na=False)]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(bad_comment)&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;【预警】检测到负面评价：&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(bad_comment[[&amp;quot;评价时间&amp;quot;,&amp;quot;评价内容&amp;quot;,&amp;quot;购买规格&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;print(&amp;quot;无历史存档，首次全量采集&amp;quot;)

#&amp;nbsp;设置每2小时自动执行一次监控
schedule.every(2).hours.do(monitor_task)
#&amp;nbsp;持续运行监控程序
while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;schedule.run_pending()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(60)&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;采集完成后，基于本地 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%22import%20jieba%5Cnfrom%20snowNLP%20import%20SnowNLP%5Cnfrom%20wordcloud%20import%20WordCloud%5Cnimport%20matplotlib.pyplot%20as%20plt%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%E8%AE%BA%E6%95%B0%E6%8D%AE%5Cndf%20%3D%20pd.read_excel(%5C%22%E5%95%86%E5%93%81%E5%8E%9F%E5%A7%8B%E8%AF%84%E8%AE%BA%E6%95%B0%E6%8D%AE.xlsx%5C%22)%5Cn%5Cn%23%201.%20%E5%90%88%E5%B9%B6%E4%B8%BB%E8%AF%84%2B%E8%BF%BD%E8%AF%84%E5%85%A8%E9%83%A8%E6%96%87%E6%9C%AC%5Cndef%20merge_text(row)%3A%5Cn%20%20%20%20text%20%3D%20str(row%5B%5C%22%E8%AF%84%E4%BB%B7%E5%86%85%E5%AE%B9%5C%22%5D)%20%2B%20str(row%5B%5C%22%E8%BF%BD%E8%AF%84%E5%86%85%E5%AE%B9%5C%22%5D)%5Cn%20%20%20%20return%20text.replace(%5C%22%E6%97%A0%E8%AF%84%E4%BB%B7%5C%22%2C%20%5C%22%5C%22).strip()%5Cn%5Cndf%5B%5C%22%E5%AE%8C%E6%95%B4%E6%96%87%E6%9C%AC%5C%22%5D%20%3D%20df.apply(merge_text%2C%20axis%3D1)%5Cndf%20%3D%20df%5Bdf%5B%5C%22%E5%AE%8C%E6%95%B4%E6%96%87%E6%9C%AC%5C%22%5D%20!%3D%20%5C%22%5C%22%5D%5Cn%5Cn%23%202.%20%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%2F%E4%B8%AD%E8%AF%84%2F%E5%B7%AE%E8%AF%84%5Cndef%20get_sentiment(text)%3A%5Cn%20%20%20%20s%20%3D%20SnowNLP(text)%5Cn%20%20%20%20score%20%3D%20s.sentiments%5Cn%20%20%20%20if%20score%20%3E%3D%200.6%3A%5Cn%20%20%20%20%20%20%20%20return%20%5C%22%E5%A5%BD%E8%AF%84%5C%22%2C%20score%5Cn%20%20%20%20elif%20score%20%3E%3D%200.3%3A%5Cn%20%20%20%20%20%20%20%20return%20%5C%22%E4%B8%AD%E8%AF%84%5C%22%2C%20score%5Cn%20%20%20%20else%3A%5Cn%20%20%20%20%20%20%20%20return%20%5C%22%E5%B7%AE%E8%AF%84%5C%22%2C%20score%5Cn%5Cnsent_result%20%3D%20df%5B%5C%22%E5%AE%8C%E6%95%B4%E6%96%87%E6%9C%AC%5C%22%5D.apply(get_sentiment)%5Cndf%5B%5C%22%E6%83%85%E6%84%9F%E6%A0%87%E7%AD%BE%5C%22%5D%20%3D%20%5Bx%5B0%5D%20for%20x%20in%20sent_result%5D%5Cndf%5B%5C%22%E6%83%85%E6%84%9F%E5%88%86%E5%80%BC%5C%22%5D%20%3D%20%5Bx%5B1%5D%20for%20x%20in%20sent_result%5D%5Cn%5Cn%23%203.%20%E5%9F%BA%E7%A1%80%E5%8F%A3%E7%A2%91%E7%BB%9F%E8%AE%A1%5Cnstat_count%20%3D%20df%5B%5C%22%E6%83%85%E6%84%9F%E6%A0%87%E7%AD%BE%5C%22%5D.value_counts()%5Cnprint(%5C%22%E5%95%86%E5%93%81%E5%8F%A3%E7%A2%91%E5%88%86%E5%B8%83%E7%BB%9F%E8%AE%A1%EF%BC%9A%5C%22)%5Cnprint(stat_count)%5Cnprint(f%5C%22%E6%80%BB%E8%AF%84%E4%BB%B7%E6%95%B0%EF%BC%9A%7Blen(df)%7D%5C%22)%5Cnprint(f%5C%22%E5%A5%BD%E8%AF%84%E5%8D%A0%E6%AF%94%EF%BC%9A%7Bround(stat_count%5B&amp;#39;%E5%A5%BD%E8%AF%84&amp;#39;%5D%2Flen(df)*100%2C2)%7D%25%5C%22)%5Cn%5Cn%23%204.%20%E7%94%9F%E6%88%90%E5%B7%AE%E8%AF%84%E5%85%B3%E9%94%AE%E8%AF%8D%E8%AF%8D%E4%BA%91%EF%BC%88%E5%AE%9A%E4%BD%8D%E4%BA%A7%E5%93%81%E7%97%9B%E7%82%B9%EF%BC%89%5Cnbad_text%20%3D%20%5C%22%20%5C%22.join(df%5Bdf%5B%5C%22%E6%83%85%E6%84%9F%E6%A0%87%E7%AD%BE%5C%22%5D%3D%3D%5C%22%E5%B7%AE%E8%AF%84%5C%22%5D%5B%5C%22%E5%AE%8C%E6%95%B4%E6%96%87%E6%9C%AC%5C%22%5D.tolist())%5Cncut_words%20%3D%20jieba.cut(bad_text)%5Cnword_list%20%3D%20%5Bw%20for%20w%20in%20cut_words%20if%20len(w)%3E%3D2%20and%20w%20not%20in%20%5B%5C%22%E7%89%A9%E6%B5%81%5C%22%2C%5C%22%E5%8F%91%E8%B4%A7%5C%22%2C%5C%22%E5%AE%A2%E6%9C%8D%5C%22%5D%5D%5Cncloud_text%20%3D%20%5C%22%20%5C%22.join(word_list)%5Cn%5Cnwc%20%3D%20WordCloud(%5Cn%20%20%20%20font_path%3D%5C%22simhei.ttf%5C%22%2C%20%20%23%20%E9%BB%91%E4%BD%93%E5%AD%97%E4%BD%93%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84%5Cn%20%20%20%20width%3D1000%2C%20height%3D600%2C%5Cn%20%20%20%20background_color%3D%5C%22white%5C%22%2C%5Cn%20%20%20%20max_words%3D100%5Cn)%5Cnwc.generate(cloud_text)%5Cnplt.figure(figsize%3D(12%2C7))%5Cnplt.imshow(wc)%5Cnplt.axis(%5C%22off%5C%22)%5Cnplt.title(%5C%22%E5%B7%AE%E8%AF%84%E9%AB%98%E9%A2%91%E7%97%9B%E7%82%B9%E8%AF%8D%E4%BA%91%5C%22%2C%20fontsize%3D16)%5Cnplt.show()%5Cn%5Cn%23%205.%20%E5%AF%BC%E5%87%BA%E5%88%86%E6%9E%90%E7%BB%93%E6%9E%9C%5Cndf.to_excel(%5C%22%E8%AF%84%E8%AE%BA%E6%83%85%E6%84%9F%E5%88%86%E6%9E%90%E7%BB%93%E6%9E%9C.xlsx%5C%22%2C%20index%3DFalse)%5Cnprint(%5C%22%E5%B8%A6%E6%83%85%E6%84%9F%E6%A0%87%E7%AD%BE%E7%9A%84%E5%88%86%E6%9E%90%E6%96%87%E4%BB%B6%E5%B7%B2%E5%AF%BC%E5%87%BA%5C%22)%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;import&amp;nbsp;jieba
from&amp;nbsp;snowNLP&amp;nbsp;import&amp;nbsp;SnowNLP
from&amp;nbsp;wordcloud&amp;nbsp;import&amp;nbsp;WordCloud
import&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt

#&amp;nbsp;读取采集好的评论数据
df&amp;nbsp;=&amp;nbsp;pd.read_excel(&amp;quot;商品原始评论数据.xlsx&amp;quot;)

#&amp;nbsp;1.&amp;nbsp;合并主评+追评全部文本
def&amp;nbsp;merge_text(row):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text&amp;nbsp;=&amp;nbsp;str(row[&amp;quot;评价内容&amp;quot;])&amp;nbsp;+&amp;nbsp;str(row[&amp;quot;追评内容&amp;quot;])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;text.replace(&amp;quot;无评价&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;).strip()

df[&amp;quot;完整文本&amp;quot;]&amp;nbsp;=&amp;nbsp;df.apply(merge_text,&amp;nbsp;axis=1)
df&amp;nbsp;=&amp;nbsp;df[df[&amp;quot;完整文本&amp;quot;]&amp;nbsp;!=&amp;nbsp;&amp;quot;&amp;quot;]

#&amp;nbsp;2.&amp;nbsp;情感打分，划分好评/中评/差评
def&amp;nbsp;get_sentiment(text):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s&amp;nbsp;=&amp;nbsp;SnowNLP(text)
&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.6:
&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;score
&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;return&amp;nbsp;&amp;quot;中评&amp;quot;,&amp;nbsp;score
&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;return&amp;nbsp;&amp;quot;差评&amp;quot;,&amp;nbsp;score

sent_result&amp;nbsp;=&amp;nbsp;df[&amp;quot;完整文本&amp;quot;].apply(get_sentiment)
df[&amp;quot;情感标签&amp;quot;]&amp;nbsp;=&amp;nbsp;[x[0]&amp;nbsp;for&amp;nbsp;x&amp;nbsp;in&amp;nbsp;sent_result]
df[&amp;quot;情感分值&amp;quot;]&amp;nbsp;=&amp;nbsp;[x[1]&amp;nbsp;for&amp;nbsp;x&amp;nbsp;in&amp;nbsp;sent_result]

#&amp;nbsp;3.&amp;nbsp;基础口碑统计
stat_count&amp;nbsp;=&amp;nbsp;df[&amp;quot;情感标签&amp;quot;].value_counts()
print(&amp;quot;商品口碑分布统计：&amp;quot;)
print(stat_count)
print(f&amp;quot;总评价数：{len(df)}&amp;quot;)
print(f&amp;quot;好评占比：{round(stat_count[&amp;#39;好评&amp;#39;]/len(df)*100,2)}%&amp;quot;)

#&amp;nbsp;4.&amp;nbsp;生成差评关键词词云（定位产品痛点）
bad_text&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;nbsp;&amp;quot;.join(df[df[&amp;quot;情感标签&amp;quot;]==&amp;quot;差评&amp;quot;][&amp;quot;完整文本&amp;quot;].tolist())
cut_words&amp;nbsp;=&amp;nbsp;jieba.cut(bad_text)
word_list&amp;nbsp;=&amp;nbsp;[w&amp;nbsp;for&amp;nbsp;w&amp;nbsp;in&amp;nbsp;cut_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;[&amp;quot;物流&amp;quot;,&amp;quot;发货&amp;quot;,&amp;quot;客服&amp;quot;]]
cloud_text&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;nbsp;&amp;quot;.join(word_list)

wc&amp;nbsp;=&amp;nbsp;WordCloud(
&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;width=1000,&amp;nbsp;height=600,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;background_color=&amp;quot;white&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;max_words=100
)
wc.generate(cloud_text)
plt.figure(figsize=(12,7))
plt.imshow(wc)
plt.axis(&amp;quot;off&amp;quot;)
plt.title(&amp;quot;差评高频痛点词云&amp;quot;,&amp;nbsp;fontsize=16)
plt.show()

#&amp;nbsp;5.&amp;nbsp;导出分析结果
df.to_excel(&amp;quot;评论情感分析结果.xlsx&amp;quot;,&amp;nbsp;index=False)
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;定时脚本自动抓取新增评价，出现负面关键词实时预警，运营第一时间联系买家解决问题，降低差评对转化的影响，长期沉淀用户反馈优化详情页、售后话术。&lt;/p&gt;&lt;h3&gt;场景 2：竞品对标分析&lt;/h3&gt;&lt;p&gt;批量填入多款竞品商品 ID，一次性拉取全量评价，通过情感分值、高频痛点词对比竞品优缺点，找到差异化产品卖点，调整定价与推广文案。&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-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;&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;：长期监控建议搭配 MySQL 存储，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;：封装商品 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;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, 15 Jul 2026 16:57:33 +0800</pubDate></item><item><title>电商商品口碑自动化监控与文本分析完整实操方案（附可运行 Python 代码）</title><link>https://www.shopapi.com.cn/?id=195</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，仅需简单配置就能稳定批量拉取全维度用户评价，搭配 Python 实现定时监控、数据清洗、情感词频分析，整套流程不用复杂部署，普通笔记本、轻量云服务器都能 7×24 小时自动运行，下面把完整落地流程、可直接复制运行的代码分享给大家。&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;：借助 Open Claw 配置商品任务，输入商品编号即可批量拉取综合 / 最新排序评价，自动覆盖评论正文、评价时间、买家昵称、购买规格、晒图、追评、视频素材等全量字段，支持缓存加速，减少重复请求耗时；&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 脚本自动过滤系统默认好评、空白无效内容、重复评价，统一时间格式，将结构化数据存入本地 CSV，也可无缝对接 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;：基于分词工具拆分评论文本，区分正向 / 负向反馈，统计差评高频痛点词，生成好评 / 差评词云、情感分布饼图，自动输出商品口碑简报。&lt;/p&gt;&lt;/li&gt;&lt;/ol&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;稳定性强：规避平台页面动态渲染、反爬拦截问题，无需维护代理池、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;字段完整：原生支持抓取追加评价、买家实拍图、商品短视频、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;灵活调度：支持分页循环采集、定时轮询，新增评论实时同步，实现口碑 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;多格式输出：原始数据可直接转为 JSON、表格文本，适配各类数据分析脚本。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;二、环境前置准备&lt;/h2&gt;&lt;h3&gt;1. 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;h3&gt;2. Open Claw 基础配置&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;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%E5%88%9B%E5%BB%BA%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%22LhGD4M-1784020923550%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;/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;DATA_SOURCE_URL&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;/ol&gt;&lt;h2&gt;三、完整可运行代码&lt;/h2&gt;&lt;h3&gt;模块 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%22%23%20coding%3Autf-8%5Cnimport%20requests%5Cnimport%20pandas%20as%20pd%5Cnimport%20time%5Cnimport%20re%5Cnimport%20os%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%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%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%5Cn%23%20Open%20Claw%E7%94%9F%E6%88%90%E7%9A%84%E4%BB%BB%E5%8A%A1%E8%AE%BF%E9%97%AE%E9%93%BE%E6%8E%A5%5CnDATA_SOURCE_URL%20%3D%20%5C%22https%3A%2F%2Fxxx.xxx%2Ftask%2Freview%3Fgoods_id%3D600530677643%5C%22%5Cn%23%20%E6%9C%AC%E5%9C%B0%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E6%96%87%E4%BB%B6%5CnSAVE_CSV%20%3D%20%5C%22goods_review_data.csv%5C%22%5Cn%23%20%E6%AF%8F%E6%AC%A1%E9%87%87%E9%9B%86%E9%97%B4%E9%9A%94%E7%A7%92%E6%95%B0%EF%BC%8C%E9%98%B2%E6%AD%A2%E9%AB%98%E9%A2%91%E8%AF%B7%E6%B1%82%5CnSLEEP_SECONDS%20%3D%203%5Cn%23%20%E6%98%AF%E5%90%A6%E5%BC%80%E5%90%AF%E7%BC%93%E5%AD%98%E5%8A%A0%E9%80%9F%EF%BC%8Cyes%2Fno%5CnCACHE_SWITCH%20%3D%20%5C%22yes%5C%22%5Cn%23%20%E9%87%87%E9%9B%86%E6%8E%92%E5%BA%8F%EF%BC%9A0%E7%BB%BC%E5%90%88%E6%8E%92%E5%BA%8F%EF%BC%8C1%E6%9C%80%E6%96%B0%E6%8E%92%E5%BA%8F%EF%BC%88%E7%9B%91%E6%8E%A7%E6%96%B0%E5%A2%9E%E8%AF%84%E8%AE%BA%E9%80%891%EF%BC%89%5CnSORT_TYPE%20%3D%201%5Cn%23%20%E6%9C%80%E5%A4%A7%E9%87%87%E9%9B%86%E9%A1%B5%E6%95%B0%5CnMAX_PAGE%20%3D%2010%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%23%20%E6%B8%85%E6%B4%97%E6%96%87%E6%9C%AC%EF%BC%9A%E5%8E%BB%E9%99%A4%E6%8D%A2%E8%A1%8C%E3%80%81%E7%A9%BA%E6%A0%BC%E3%80%81%E7%89%B9%E6%AE%8A%E7%AC%A6%E5%8F%B7%5Cndef%20clean_text(text)%3A%5Cn%20%20%20%20if%20not%20text%3A%5Cn%20%20%20%20%20%20%20%20return%20%5C%22%5C%22%5Cn%20%20%20%20text%20%3D%20re.sub(r%5C%22%5C%5Cs%2B%5C%22%2C%20%5C%22%5C%22%2C%20str(text))%5Cn%20%20%20%20text%20%3D%20re.sub(r%5C%22%5B%5E%5C%5Cu4e00-%5C%5Cu9fa5a-zA-Z0-9%EF%BC%8C%E3%80%82%EF%BC%81%EF%BC%9F%E3%80%81%5D%5C%22%2C%20%5C%22%5C%22%2C%20text)%5Cn%20%20%20%20return%20text%5Cn%5Cn%23%20%E8%AF%B7%E6%B1%82%E5%8D%95%E9%A1%B5%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE%5Cndef%20get_review_page(page_num)%3A%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%20params%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22cache%5C%22%3A%20CACHE_SWITCH%2C%5Cn%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%5C%22sort%5C%22%3A%20SORT_TYPE%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(DATA_SOURCE_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%20res_json%20%3D%20resp.json()%5Cn%20%20%20%20%20%20%20%20%23%20%E7%8A%B6%E6%80%81%E5%88%A4%E6%96%AD%EF%BC%9A%E6%97%A0%E6%95%B0%E6%8D%AE%2F%E4%BB%BB%E5%8A%A1%E5%BC%82%E5%B8%B8%E7%9B%B4%E6%8E%A5%E8%BF%94%E5%9B%9E%E7%A9%BA%E5%88%97%E8%A1%A8%5Cn%20%20%20%20%20%20%20%20if%20res_json.get(%5C%22error_code%5C%22)%20!%3D%20%5C%220000%5C%22%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%E6%95%B0%E6%8D%AE%E5%BC%82%E5%B8%B8%EF%BC%9A%7Bres_json.get(&amp;#39;error_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%20return%20res_json.get(%5C%22review_list%5C%22%2C%20%5B%5D)%5Cn%20%20%20%20except%20Exception%20as%20e%3A%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E7%AC%AC%7Bpage_num%7D%E9%A1%B5%E8%AF%B7%E6%B1%82%E5%A4%B1%E8%B4%A5%EF%BC%9A%7Bstr(e)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20return%20%5B%5D%5Cn%5Cn%23%20%E8%A7%A3%E6%9E%90%E5%8D%95%E6%9D%A1%E8%AF%84%E4%BB%B7%E7%BB%93%E6%9E%84%E5%8C%96%E6%95%B0%E6%8D%AE%5Cndef%20parse_review_item(item)%3A%5Cn%20%20%20%20data_dict%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22%E8%AF%84%E8%AE%BAID%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%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%20%5C%22%5C%22)%2C%5Cn%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%20clean_text(item.get(%5C%22rate_content%5C%22%2C%20%5C%22%5C%22))%2C%5Cn%20%20%20%20%20%20%20%20%5C%22%E8%BF%BD%E5%8A%A0%E8%AF%84%E4%BB%B7%5C%22%3A%20clean_text(item.get(%5C%22add_feedback%5C%22%2C%20%5C%22%5C%22))%2C%5Cn%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%5C%22%E8%B4%AD%E4%B9%B0%E8%A7%84%E6%A0%BC%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%5C%22%E6%99%92%E5%9B%BE%E9%93%BE%E6%8E%A5%5C%22%3A%20%5C%22%2C%5C%22.join(item.get(%5C%22pics%5C%22%2C%20%5B%5D))%20if%20item.get(%5C%22pics%5C%22)%20else%20%5C%22%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22%E8%BF%BD%E8%AF%84%E5%9B%BE%E7%89%87%5C%22%3A%20%5C%22%2C%5C%22.join(item.get(%5C%22add_feedback_images%5C%22%2C%20%5B%5D))%20if%20item.get(%5C%22add_feedback_images%5C%22)%20else%20%5C%22%5C%22%2C%5Cn%20%20%20%20%20%20%20%20%5C%22%E8%AF%84%E4%BB%B7%E8%A7%86%E9%A2%91%5C%22%3A%20item.get(%5C%22video%5C%22%2C%20%5C%22%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%5C%22%E8%A7%86%E9%A2%91%E5%B0%81%E9%9D%A2%5C%22%3A%20item.get(%5C%22videoCover%5C%22%2C%20%5C%22%5C%22)%5Cn%20%20%20%20%7D%5Cn%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%20if%20len(data_dict%5B%5C%22%E8%AF%84%E4%BB%B7%E6%AD%A3%E6%96%87%5C%22%5D)%20%3C%202%20and%20len(data_dict%5B%5C%22%E8%BF%BD%E5%8A%A0%E8%AF%84%E4%BB%B7%5C%22%5D)%20%3C%202%3A%5Cn%20%20%20%20%20%20%20%20return%20None%5Cn%20%20%20%20return%20data_dict%5Cn%5Cn%23%20%E6%89%B9%E9%87%8F%E9%87%87%E9%9B%86%E5%85%A8%E9%A1%B5%E6%95%B0%E6%8D%AE%5Cndef%20batch_crawl_all_review()%3A%5Cn%20%20%20%20all_review_data%20%3D%20%5B%5D%5Cn%20%20%20%20for%20page%20in%20range(1%2C%20MAX_PAGE%20%2B%201)%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%7D%E9%A1%B5%E8%AF%84%E4%BB%B7...%5C%22)%5Cn%20%20%20%20%20%20%20%20raw_list%20%3D%20get_review_page(page)%5Cn%20%20%20%20%20%20%20%20if%20not%20raw_list%3A%5Cn%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%E6%95%B0%E6%8D%AE%EF%BC%8C%E5%81%9C%E6%AD%A2%E5%88%86%E9%A1%B5%E9%87%87%E9%9B%86%5C%22)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20break%5Cn%20%20%20%20%20%20%20%20for%20item%20in%20raw_list%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20parse_data%20%3D%20parse_review_item(item)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20parse_data%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20all_review_data.append(parse_data)%5Cn%20%20%20%20%20%20%20%20time.sleep(SLEEP_SECONDS)%5Cn%20%20%20%20return%20all_review_data%5Cn%5Cn%23%20%E5%A2%9E%E9%87%8F%E5%86%99%E5%85%A5CSV%EF%BC%8C%E9%81%BF%E5%85%8D%E9%87%8D%E5%A4%8D%E5%AD%98%E5%82%A8%5Cndef%20save_to_csv(data_list)%3A%5Cn%20%20%20%20if%20not%20data_list%3A%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E6%9C%AC%E6%AC%A1%E6%97%A0%E6%96%B0%E5%A2%9E%E6%9C%89%E6%95%88%E8%AF%84%E4%BB%B7%5C%22)%5Cn%20%20%20%20%20%20%20%20return%5Cn%20%20%20%20df_new%20%3D%20pd.DataFrame(data_list)%5Cn%20%20%20%20%23%20%E5%88%A4%E6%96%AD%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%EF%BC%8C%E5%A2%9E%E9%87%8F%E5%90%88%E5%B9%B6%E5%8E%BB%E9%87%8D%5Cn%20%20%20%20if%20os.path.exists(SAVE_CSV)%3A%5Cn%20%20%20%20%20%20%20%20df_old%20%3D%20pd.read_csv(SAVE_CSV%2C%20dtype%3Dstr)%5Cn%20%20%20%20%20%20%20%20df_merge%20%3D%20pd.concat(%5Bdf_old%2C%20df_new%5D%2C%20ignore_index%3DTrue)%5Cn%20%20%20%20%20%20%20%20df_merge%20%3D%20df_merge.drop_duplicates(subset%3D%5B%5C%22%E8%AF%84%E8%AE%BAID%5C%22%5D%2C%20keep%3D%5C%22last%5C%22)%5Cn%20%20%20%20%20%20%20%20df_merge.to_csv(SAVE_CSV%2C%20index%3DFalse%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20else%3A%5Cn%20%20%20%20%20%20%20%20df_new.to_csv(SAVE_CSV%2C%20index%3DFalse%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20print(f%5C%22%E6%88%90%E5%8A%9F%E5%AD%98%E5%82%A8%7Blen(data_list)%7D%E6%9D%A1%E6%9C%89%E6%95%88%E8%AF%84%E4%BB%B7%EF%BC%8C%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84%EF%BC%9A%7BSAVE_CSV%7D%5C%22)%5Cn%5Cn%23%20%E5%AE%9A%E6%97%B6%E7%9B%91%E6%8E%A7%E4%B8%BB%E5%BE%AA%E7%8E%AF%EF%BC%88%E5%8F%96%E6%B6%88%E6%B3%A8%E9%87%8Awhile%20True%E5%BC%80%E5%90%AF7%C3%9724%E5%B0%8F%E6%97%B6%E8%BD%AE%E8%AF%A2%EF%BC%89%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20%23%20while%20True%3A%5Cn%20%20%20%20review_data%20%3D%20batch_crawl_all_review()%5Cn%20%20%20%20save_to_csv(review_data)%5Cn%20%20%20%20%23%20time.sleep(3600)%20%20%23%20%E6%AF%8F%E5%B0%8F%E6%97%B6%E8%87%AA%E5%8A%A8%E9%87%87%E9%9B%86%E4%B8%80%E6%AC%A1%EF%BC%8C%E6%8C%89%E9%9C%80%E8%B0%83%E6%95%B4%E9%97%B4%E9%9A%94%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;#&amp;nbsp;coding:utf-8
import&amp;nbsp;requests
import&amp;nbsp;pandas&amp;nbsp;as&amp;nbsp;pd
import&amp;nbsp;time
import&amp;nbsp;re
import&amp;nbsp;os

#&amp;nbsp;=====================基础配置区（自行修改）=====================
#&amp;nbsp;Open&amp;nbsp;Claw生成的任务访问链接
DATA_SOURCE_URL&amp;nbsp;=&amp;nbsp;&amp;quot;https://xxx.xxx/task/review?goods_id=600530677643&amp;quot;
#&amp;nbsp;本地数据存储文件
SAVE_CSV&amp;nbsp;=&amp;nbsp;&amp;quot;goods_review_data.csv&amp;quot;
#&amp;nbsp;每次采集间隔秒数，防止高频请求
SLEEP_SECONDS&amp;nbsp;=&amp;nbsp;3
#&amp;nbsp;是否开启缓存加速，yes/no
CACHE_SWITCH&amp;nbsp;=&amp;nbsp;&amp;quot;yes&amp;quot;
#&amp;nbsp;采集排序：0综合排序，1最新排序（监控新增评论选1）
SORT_TYPE&amp;nbsp;=&amp;nbsp;1
#&amp;nbsp;最大采集页数
MAX_PAGE&amp;nbsp;=&amp;nbsp;10
#&amp;nbsp;==============================================================

#&amp;nbsp;清洗文本：去除换行、空格、特殊符号
def&amp;nbsp;clean_text(text):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;text:
&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;text&amp;nbsp;=&amp;nbsp;re.sub(r&amp;quot;\s+&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;,&amp;nbsp;str(text))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text&amp;nbsp;=&amp;nbsp;re.sub(r&amp;quot;[^\u4e00-\u9fa5a-zA-Z0-9，。！？、]&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;,&amp;nbsp;text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;text

#&amp;nbsp;请求单页评价数据
def&amp;nbsp;get_review_page(page_num):
&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;params&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;CACHE_SWITCH,
&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;quot;sort&amp;quot;:&amp;nbsp;SORT_TYPE
&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(DATA_SOURCE_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;res_json&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;if&amp;nbsp;res_json.get(&amp;quot;error_code&amp;quot;)&amp;nbsp;!=&amp;nbsp;&amp;quot;0000&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;第{page_num}页数据异常：{res_json.get(&amp;#39;error_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;return&amp;nbsp;res_json.get(&amp;quot;review_list&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_num}页请求失败：{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;解析单条评价结构化数据
def&amp;nbsp;parse_review_item(item):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data_dict&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;quot;&amp;quot;),
&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;quot;&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;评价正文&amp;quot;:&amp;nbsp;clean_text(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;quot;追加评价&amp;quot;:&amp;nbsp;clean_text(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;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;quot;购买规格&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;quot;晒图链接&amp;quot;:&amp;nbsp;&amp;quot;,&amp;quot;.join(item.get(&amp;quot;pics&amp;quot;,&amp;nbsp;[]))&amp;nbsp;if&amp;nbsp;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;追评图片&amp;quot;:&amp;nbsp;&amp;quot;,&amp;quot;.join(item.get(&amp;quot;add_feedback_images&amp;quot;,&amp;nbsp;[]))&amp;nbsp;if&amp;nbsp;item.get(&amp;quot;add_feedback_images&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;评价视频&amp;quot;:&amp;nbsp;item.get(&amp;quot;video&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;视频封面&amp;quot;:&amp;nbsp;item.get(&amp;quot;videoCover&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;if&amp;nbsp;len(data_dict[&amp;quot;评价正文&amp;quot;])&amp;nbsp;&amp;lt;&amp;nbsp;2&amp;nbsp;and&amp;nbsp;len(data_dict[&amp;quot;追加评价&amp;quot;])&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;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;data_dict

#&amp;nbsp;批量采集全页数据
def&amp;nbsp;batch_crawl_all_review():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_review_data&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;print(f&amp;quot;正在采集第{page}页评价...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raw_list&amp;nbsp;=&amp;nbsp;get_review_page(page)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;raw_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;break
&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;raw_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;parse_data&amp;nbsp;=&amp;nbsp;parse_review_item(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;if&amp;nbsp;parse_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;all_review_data.append(parse_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(SLEEP_SECONDS)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;all_review_data

#&amp;nbsp;增量写入CSV，避免重复存储
def&amp;nbsp;save_to_csv(data_list):
&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;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;df_new&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;if&amp;nbsp;os.path.exists(SAVE_CSV):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_old&amp;nbsp;=&amp;nbsp;pd.read_csv(SAVE_CSV,&amp;nbsp;dtype=str)
&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_old,&amp;nbsp;df_new],&amp;nbsp;ignore_index=True)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_merge&amp;nbsp;=&amp;nbsp;df_merge.drop_duplicates(subset=[&amp;quot;评论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_CSV,&amp;nbsp;index=False,&amp;nbsp;encoding=&amp;quot;utf-8-sig&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;df_new.to_csv(SAVE_CSV,&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(data_list)}条有效评价，文件路径：{SAVE_CSV}&amp;quot;)

#&amp;nbsp;定时监控主循环（取消注释while&amp;nbsp;True开启7×24小时轮询）
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;while&amp;nbsp;True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;review_data&amp;nbsp;=&amp;nbsp;batch_crawl_all_review()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;save_to_csv(review_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;time.sleep(3600)&amp;nbsp;&amp;nbsp;#&amp;nbsp;每小时自动采集一次，按需调整间隔&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;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%23%20coding%3Autf-8%5Cnimport%20pandas%20as%20pd%5Cnimport%20jieba%5Cnfrom%20collections%20import%20Counter%5Cnfrom%20wordcloud%20import%20WordCloud%5Cnimport%20matplotlib.pyplot%20as%20plt%5Cn%5Cn%23%20%E5%81%9C%E7%94%A8%E8%AF%8D%EF%BC%88%E8%BF%87%E6%BB%A4%E6%97%A0%E6%84%8F%E4%B9%89%E8%AF%8D%E6%B1%87%EF%BC%89%5CnSTOP_WORDS%20%3D%20%7B%5C%22%E5%BE%88%E5%A5%BD%5C%22%2C%20%5C%22%E4%B8%8D%E9%94%99%5C%22%2C%20%5C%22%E6%BB%A1%E6%84%8F%5C%22%2C%20%5C%22%E8%BF%98%E8%A1%8C%5C%22%2C%20%5C%22%E4%B8%80%E8%88%AC%5C%22%2C%20%5C%22%E6%94%B6%E5%88%B0%5C%22%2C%20%5C%22%E5%8F%91%E8%B4%A7%5C%22%2C%20%5C%22%E7%89%A9%E6%B5%81%5C%22%2C%20%5C%22%E5%8C%85%E8%A3%85%5C%22%2C%20%5C%22%E5%AE%A2%E6%9C%8D%5C%22%2C%20%5C%22%E6%8E%A8%E8%8D%90%5C%22%2C%20%5C%22%E8%B4%AD%E4%B9%B0%5C%22%2C%20%5C%22%E4%BD%BF%E7%94%A8%5C%22%7D%5CnCSV_FILE%20%3D%20%5C%22goods_review_data.csv%5C%22%5Cn%5Cn%23%20%E5%90%88%E5%B9%B6%E6%89%80%E6%9C%89%E8%AF%84%E8%AE%BA%E6%96%87%E6%9C%AC%5Cndef%20get_all_comment_text()%3A%5Cn%20%20%20%20df%20%3D%20pd.read_csv(CSV_FILE%2C%20dtype%3Dstr)%5Cn%20%20%20%20text_total%20%3D%20%5C%22%5C%22%5Cn%20%20%20%20for%20idx%2C%20row%20in%20df.iterrows()%3A%5Cn%20%20%20%20%20%20%20%20text_total%20%2B%3D%20row%5B%5C%22%E8%AF%84%E4%BB%B7%E6%AD%A3%E6%96%87%5C%22%5D%20%2B%20row%5B%5C%22%E8%BF%BD%E5%8A%A0%E8%AF%84%E4%BB%B7%5C%22%5D%5Cn%20%20%20%20return%20text_total%5Cn%5Cn%23%20%E5%88%86%E8%AF%8D%2B%E8%BF%87%E6%BB%A4%E5%81%9C%E7%94%A8%E8%AF%8D%EF%BC%8C%E7%BB%9F%E8%AE%A1%E9%AB%98%E9%A2%91%E8%AF%8D%5Cndef%20get_word_freq(top_n%3D20)%3A%5Cn%20%20%20%20full_text%20%3D%20get_all_comment_text()%5Cn%20%20%20%20words%20%3D%20jieba.lcut(full_text)%5Cn%20%20%20%20valid_words%20%3D%20%5Bw%20for%20w%20in%20words%20if%20len(w)%20%3E%201%20and%20w%20not%20in%20STOP_WORDS%5D%5Cn%20%20%20%20word_count%20%3D%20Counter(valid_words)%5Cn%20%20%20%20return%20word_count.most_common(top_n)%5Cn%5Cn%23%20%E7%94%9F%E6%88%90%E8%AF%8D%E4%BA%91%E5%9B%BE%5Cndef%20generate_word_cloud()%3A%5Cn%20%20%20%20word_freq%20%3D%20get_word_freq(100)%5Cn%20%20%20%20word_dict%20%3D%20dict(word_freq)%5Cn%20%20%20%20wc%20%3D%20WordCloud(%5Cn%20%20%20%20%20%20%20%20font_path%3D%5C%22C%3A%2FWindows%2FFonts%2Fsimhei.ttf%5C%22%2C%20%20%23%20Windows%E9%BB%91%E4%BD%93%E8%B7%AF%E5%BE%84%EF%BC%8CMac%E6%9B%BF%E6%8D%A2%E4%B8%BA%E5%AF%B9%E5%BA%94%E5%AD%97%E4%BD%93%5Cn%20%20%20%20%20%20%20%20width%3D1000%2C%20height%3D600%2C%5Cn%20%20%20%20%20%20%20%20background_color%3D%5C%22white%5C%22%2C%5Cn%20%20%20%20%20%20%20%20max_words%3D100%5Cn%20%20%20%20)%5Cn%20%20%20%20wc.generate_from_frequencies(word_dict)%5Cn%20%20%20%20plt.figure(figsize%3D(12%2C%207))%5Cn%20%20%20%20plt.imshow(wc%2C%20interpolation%3D%5C%22bilinear%5C%22)%5Cn%20%20%20%20plt.axis(%5C%22off%5C%22)%5Cn%20%20%20%20plt.title(%5C%22%E5%95%86%E5%93%81%E8%AF%84%E4%BB%B7%E5%85%B3%E9%94%AE%E8%AF%8D%E8%AF%8D%E4%BA%91%5C%22%2C%20fontsize%3D16)%5Cn%20%20%20%20plt.savefig(%5C%22review_wordcloud.png%5C%22%2C%20dpi%3D300%2C%20bbox_inches%3D%5C%22tight%5C%22)%5Cn%20%20%20%20plt.show()%5Cn%20%20%20%20print(%5C%22%E8%AF%8D%E4%BA%91%E5%9B%BE%E7%89%87%E5%B7%B2%E4%BF%9D%E5%AD%98%E4%B8%BA%20review_wordcloud.png%5C%22)%5Cn%5Cn%23%20%E7%AE%80%E6%98%93%E6%83%85%E6%84%9F%E5%8C%BA%E5%88%86%EF%BC%88%E6%A0%B9%E6%8D%AE%E8%B4%9F%E9%9D%A2%E5%85%B3%E9%94%AE%E8%AF%8D%E5%88%92%E5%88%86%E6%AD%A3%E8%B4%9F%E5%90%91%EF%BC%89%5Cndef%20sentiment_statistics()%3A%5Cn%20%20%20%20negative_key%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%E6%8E%89%E8%89%B2%5C%22%2C%20%5C%22%E8%B5%B7%E7%90%83%5C%22%2C%20%5C%22%E7%A0%B4%E6%8D%9F%5C%22%2C%20%5C%22%E5%BC%82%E5%91%B3%5C%22%2C%20%5C%22%E5%81%8F%E5%B0%8F%5C%22%2C%20%5C%22%E5%81%8F%E5%A4%A7%5C%22%2C%20%5C%22%E8%B4%A8%E9%87%8F%E5%B7%AE%5C%22%2C%20%5C%22%E9%80%80%E8%B4%A7%5C%22%2C%20%5C%22%E7%91%95%E7%96%B5%5C%22%7D%5Cn%20%20%20%20df%20%3D%20pd.read_csv(CSV_FILE%2C%20dtype%3Dstr)%5Cn%20%20%20%20good_count%20%3D%200%5Cn%20%20%20%20bad_count%20%3D%200%5Cn%20%20%20%20total%20%3D%20len(df)%5Cn%20%20%20%20for%20idx%2C%20row%20in%20df.iterrows()%3A%5Cn%20%20%20%20%20%20%20%20content%20%3D%20row%5B%5C%22%E8%AF%84%E4%BB%B7%E6%AD%A3%E6%96%87%5C%22%5D%20%2B%20row%5B%5C%22%E8%BF%BD%E5%8A%A0%E8%AF%84%E4%BB%B7%5C%22%5D%5Cn%20%20%20%20%20%20%20%20if%20any(k%20in%20content%20for%20k%20in%20negative_key)%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20bad_count%20%2B%3D%201%5Cn%20%20%20%20%20%20%20%20else%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20good_count%20%2B%3D%201%5Cn%20%20%20%20%23%20%E7%BB%98%E5%88%B6%E6%83%85%E6%84%9F%E5%88%86%E5%B8%83%E9%A5%BC%E5%9B%BE%5Cn%20%20%20%20plt.figure(figsize%3D(8%2C%208))%5Cn%20%20%20%20label%20%3D%20%5B%5C%22%E6%AD%A3%E5%90%91%E8%AF%84%E4%BB%B7%5C%22%2C%20%5C%22%E8%B4%9F%E9%9D%A2%E8%AF%84%E4%BB%B7%5C%22%5D%5Cn%20%20%20%20num%20%3D%20%5Bgood_count%2C%20bad_count%5D%5Cn%20%20%20%20color%20%3D%20%5B%5C%22%2366cc66%5C%22%2C%20%5C%22%23ff6666%5C%22%5D%5Cn%20%20%20%20plt.pie(num%2C%20labels%3Dlabel%2C%20colors%3Dcolor%2C%20autopct%3D%5C%22%251.2f%25%25%5C%22%2C%20startangle%3D90)%5Cn%20%20%20%20plt.title(f%5C%22%E5%95%86%E5%93%81%E5%8F%A3%E7%A2%91%E6%83%85%E6%84%9F%E5%88%86%E5%B8%83%EF%BC%88%E6%80%BB%E8%AF%84%E4%BB%B7%7Btotal%7D%E6%9D%A1%EF%BC%89%5C%22)%5Cn%20%20%20%20plt.savefig(%5C%22sentiment_pie.png%5C%22%2C%20dpi%3D300)%5Cn%20%20%20%20plt.show()%5Cn%20%20%20%20print(f%5C%22%E6%AD%A3%E5%90%91%E8%AF%84%E4%BB%B7%EF%BC%9A%7Bgood_count%7D%E6%9D%A1%EF%BC%8C%E8%B4%9F%E9%9D%A2%E8%AF%84%E4%BB%B7%EF%BC%9A%7Bbad_count%7D%E6%9D%A1%5C%22)%5Cn%20%20%20%20print(%5C%22TOP20%E9%AB%98%E9%A2%91%E7%94%A8%E6%88%B7%E5%85%B3%E9%94%AE%E8%AF%8D%EF%BC%9A%5C%22%2C%20get_word_freq(20))%5Cn%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20sentiment_statistics()%5Cn%20%20%20%20generate_word_cloud()%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;#&amp;nbsp;coding:utf-8
import&amp;nbsp;pandas&amp;nbsp;as&amp;nbsp;pd
import&amp;nbsp;jieba
from&amp;nbsp;collections&amp;nbsp;import&amp;nbsp;Counter
from&amp;nbsp;wordcloud&amp;nbsp;import&amp;nbsp;WordCloud
import&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt

#&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;}
CSV_FILE&amp;nbsp;=&amp;nbsp;&amp;quot;goods_review_data.csv&amp;quot;

#&amp;nbsp;合并所有评论文本
def&amp;nbsp;get_all_comment_text():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;pd.read_csv(CSV_FILE,&amp;nbsp;dtype=str)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text_total&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;idx,&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_total&amp;nbsp;+=&amp;nbsp;row[&amp;quot;评价正文&amp;quot;]&amp;nbsp;+&amp;nbsp;row[&amp;quot;追加评价&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;text_total

#&amp;nbsp;分词+过滤停用词，统计高频词
def&amp;nbsp;get_word_freq(top_n=20):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;full_text&amp;nbsp;=&amp;nbsp;get_all_comment_text()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;words&amp;nbsp;=&amp;nbsp;jieba.lcut(full_text)
&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;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;STOP_WORDS]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;word_count&amp;nbsp;=&amp;nbsp;Counter(valid_words)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;word_count.most_common(top_n)

#&amp;nbsp;生成词云图
def&amp;nbsp;generate_word_cloud():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;word_freq&amp;nbsp;=&amp;nbsp;get_word_freq(100)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;word_dict&amp;nbsp;=&amp;nbsp;dict(word_freq)
&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;font_path=&amp;quot;C:/Windows/Fonts/simhei.ttf&amp;quot;,&amp;nbsp;&amp;nbsp;#&amp;nbsp;Windows黑体路径，Mac替换为对应字体
&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;background_color=&amp;quot;white&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;max_words=100
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wc.generate_from_frequencies(word_dict)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.figure(figsize=(12,&amp;nbsp;7))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.imshow(wc,&amp;nbsp;interpolation=&amp;quot;bilinear&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.axis(&amp;quot;off&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.title(&amp;quot;商品评价关键词词云&amp;quot;,&amp;nbsp;fontsize=16)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.savefig(&amp;quot;review_wordcloud.png&amp;quot;,&amp;nbsp;dpi=300,&amp;nbsp;bbox_inches=&amp;quot;tight&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.show()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;词云图片已保存为&amp;nbsp;review_wordcloud.png&amp;quot;)

#&amp;nbsp;简易情感区分（根据负面关键词划分正负向）
def&amp;nbsp;sentiment_statistics():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;negative_key&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;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;pd.read_csv(CSV_FILE,&amp;nbsp;dtype=str)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;good_count&amp;nbsp;=&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bad_count&amp;nbsp;=&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total&amp;nbsp;=&amp;nbsp;len(df)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;idx,&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;content&amp;nbsp;=&amp;nbsp;row[&amp;quot;评价正文&amp;quot;]&amp;nbsp;+&amp;nbsp;row[&amp;quot;追加评价&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;any(k&amp;nbsp;in&amp;nbsp;content&amp;nbsp;for&amp;nbsp;k&amp;nbsp;in&amp;nbsp;negative_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;bad_count&amp;nbsp;+=&amp;nbsp;1
&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;good_count&amp;nbsp;+=&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;绘制情感分布饼图
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.figure(figsize=(8,&amp;nbsp;8))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;label&amp;nbsp;=&amp;nbsp;[&amp;quot;正向评价&amp;quot;,&amp;nbsp;&amp;quot;负面评价&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num&amp;nbsp;=&amp;nbsp;[good_count,&amp;nbsp;bad_count]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;color&amp;nbsp;=&amp;nbsp;[&amp;quot;#66cc66&amp;quot;,&amp;nbsp;&amp;quot;#ff6666&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.pie(num,&amp;nbsp;labels=label,&amp;nbsp;colors=color,&amp;nbsp;autopct=&amp;quot;%1.2f%%&amp;quot;,&amp;nbsp;startangle=90)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.title(f&amp;quot;商品口碑情感分布（总评价{total}条）&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.savefig(&amp;quot;sentiment_pie.png&amp;quot;,&amp;nbsp;dpi=300)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.show()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;正向评价：{good_count}条，负面评价：{bad_count}条&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;TOP20高频用户关键词：&amp;quot;,&amp;nbsp;get_word_freq(20))

if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sentiment_statistics()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;generate_word_cloud()&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：配置 Open Claw 采集任务&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;code&gt;yes&lt;/code&gt;、排序选择&lt;code&gt;1（最新）&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;DATA_SOURCE_URL&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;/ol&gt;&lt;h3&gt;步骤 2：数据采集与增量存储&lt;/h3&gt;&lt;p&gt;运行第一段采集脚本，首次执行会自动创建&lt;code&gt;goods_review_data.csv&lt;/code&gt;，所有评价完整入库；取消代码中&lt;code&gt;while True&lt;/code&gt;注释、设置&lt;code&gt;time.sleep(3600)&lt;/code&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;基础文本：评价正文、追加追评、买家昵称&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;唯一标识：评论 ID（用于自动去重，避免重复统计）&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;步骤 3：口碑数据分析与可视化&lt;/h3&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;code&gt;review_wordcloud.png&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;sentiment_pie.png&lt;/code&gt;：正负评价占比饼图，直观判断商品整体口碑； 控制台同步打印 TOP20 高频词汇、正负评价数量，可直接用于运营复盘、产品优化报告。&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;：定时轮询抓取最新评价，脚本可拓展对接企业微信 / 飞书推送负面评价，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;&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;strong&gt;采集速度慢&lt;/strong&gt;：开启缓存参数&lt;code&gt;cache=yes&lt;/code&gt;，减少重复请求平台数据源，采集效率提升 60% 以上；&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;code&gt;encoding=&amp;quot;utf-8-sig&amp;quot;&lt;/code&gt;，Windows、Mac 打开表格无中文乱码；&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;font_path&lt;/code&gt;字体路径，Windows 使用 simhei.ttf，Mac 用 PingFang.ttc；&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;：循环遍历多任务链接，配合轻量云服务器 7×24 小时挂机运行，一次性监控几十款商品无压力。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;七、总结&lt;/h2&gt;&lt;p&gt;传统人工整理评价的方式效率极低，而 Open Claw 搭配 Python 搭建的自动化口碑监控体系，零复杂开发成本，兼顾采集稳定性与数据完整性。整套流程从数据自动拉取、清洗存储到情感可视化分析一站式完成，运营、产品、市场人员不用学习复杂爬虫、分布式技术，复制代码修改少量配置即可落地，长期使用能大幅降低用户反馈调研成本，快速从海量评论中挖掘业务优化机会。&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, 14 Jul 2026 17:27:54 +0800</pubDate></item><item><title>电商竞品全自动监控 + 数据分析落地教程，半小时搞定全品类行情追踪</title><link>https://www.shopapi.com.cn/?id=194</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;做电商运营、产品调研、市场分析的朋友应该都有同款痛点： 想盯同行定价、活动优惠、销量波动、评价风向，手动复制粘贴商品页面、整理表格，每天耗费 2-3 小时；大促节点竞品调价、上新节奏完全跟不上，错过最佳调价、备货时机；多品类、几十上百款商品同步追踪时，人工统计极易漏数据、错数据，历史行情也没法留存复盘。&lt;/p&gt;&lt;p&gt;试过自建采集脚本、多浏览器轮询监控，要么频繁触发平台限制，要么代码维护成本极高，新增监控商品就要改一堆逻辑。后来接触到一套成熟稳定的数据抓取工具（Open Claw），无需复杂底层搭建，开箱实现商品全维度实时监控，搭配 Python 完成数据清洗、可视化分析，个人 / 中小企业不用投入服务器、代理池成本，单人就能完成全流程市场监测。&lt;/p&gt;&lt;p&gt;本文完整分享落地流程，附带可直接运行的 Python 代码，覆盖&lt;strong&gt;商品定时监控、数据存储、行情统计、价格波动预警&lt;/strong&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;：设置定时轮询周期（10 分钟 / 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;：Python 读取本地存储的数据，完成数据清洗、价格区间分布统计、销量趋势绘图、竞品分层分析，生成 Excel 报表，支持配置消息提醒（企业微信 / 邮件）。&lt;/p&gt;&lt;/li&gt;&lt;/ol&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;无需搭建代理池、解决访问封禁、验证码拦截等问题&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;/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%20pandas%20matplotlib%20openpyxl%20schedule%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;matplotlib&amp;nbsp;openpyxl&amp;nbsp;schedule&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;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;schedule：本地定时任务，循环监控&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;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%20pandas%20as%20pd%5Cnimport%20matplotlib.pyplot%20as%20plt%5Cnimport%20schedule%5Cnimport%20time%5Cnfrom%20datetime%20import%20datetime%5Cnimport%20os%5Cn%5Cn%23%20%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE%5Cn%23%20%E5%B7%A5%E5%85%B7%E5%90%8E%E5%8F%B0%E8%8E%B7%E5%8F%96%E7%9A%84%E4%B8%AA%E4%BA%BA%E5%87%AD%E8%AF%81%EF%BC%88%E6%9B%BF%E6%8D%A2%E4%B8%BA%E8%87%AA%E5%B7%B1%E8%B4%A6%E5%8F%B7%E7%94%9F%E6%88%90%E7%9A%84%E5%AF%86%E9%92%A5%EF%BC%89%5CnTOKEN%20%3D%20%5C%22xxxxxxxxxxxxxxxxxxxx%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%E6%89%B9%E9%87%8F%E6%96%B0%E5%A2%9E%E7%9B%B4%E6%8E%A5%E8%BF%BD%E5%8A%A0%5CnMONITOR_GOODS%20%3D%20%5B%5C%22723456123987%5C%22%2C%20%5C%22723456987654%5C%22%2C%20%5C%22723456543210%5C%22%5D%5Cn%23%20%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E6%96%87%E4%BB%B6%5CnDATA_FILE%20%3D%20%5C%22goods_monitor_data.csv%5C%22%5Cn%23%20%E7%BB%98%E5%9B%BE%E5%AD%97%E4%BD%93%E9%80%82%E9%85%8D%E4%B8%AD%E6%96%87%5Cnplt.rcParams%5B%5C%22font.family%5C%22%5D%20%3D%20%5B%5C%22SimHei%5C%22%2C%20%5C%22WenQuanYi%20Micro%20Hei%5C%22%5D%5Cnplt.rcParams%5B%5C%22axes.unicode_minus%5C%22%5D%20%3D%20False%5Cn%5Cndef%20get_goods_info(item_id)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%E8%B0%83%E7%94%A8%E4%BA%91%E7%AB%AF%E6%95%B0%E6%8D%AE%E8%83%BD%E5%8A%9B%EF%BC%8C%E8%8E%B7%E5%8F%96%E5%8D%95%E6%AC%BE%E5%95%86%E5%93%81%E5%AE%8C%E6%95%B4%E4%BF%A1%E6%81%AF%5Cn%20%20%20%20%3Aparam%20item_id%3A%20%E5%95%86%E5%93%81%E5%94%AF%E4%B8%80%E6%A0%87%E8%AF%86%5Cn%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%E6%95%B0%E6%8D%AE%5Cn%20%20%20%20%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%22Content-Type%5C%22%3A%20%5C%22application%2Fjson%5C%22%5Cn%20%20%20%20%7D%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%22item_id%5C%22%3A%20item_id%5Cn%20%20%20%20%7D%5Cn%20%20%20%20%23%20%E5%B7%A5%E5%85%B7%E6%95%B0%E6%8D%AE%E8%AF%B7%E6%B1%82%E5%9C%B0%E5%9D%80%5Cn%20%20%20%20resp%20%3D%20requests.get(%5C%22https%3A%2F%2Fdata-claw.collector.work%2Fshop%2Fgoods%5C%22%2C%20headers%3Dheaders%2C%20params%3Dparams)%5Cn%20%20%20%20res_data%20%3D%20resp.json()%5Cn%20%20%20%20if%20res_data.get(%5C%22code%5C%22)%20!%3D%20200%3A%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E5%95%86%E5%93%81%7Bitem_id%7D%E6%95%B0%E6%8D%AE%E8%8E%B7%E5%8F%96%E5%A4%B1%E8%B4%A5%EF%BC%9A%7Bres_data.get(&amp;#39;msg&amp;#39;)%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20return%20None%5Cn%20%20%20%20info%20%3D%20res_data.get(%5C%22data%5C%22)%5Cn%20%20%20%20%23%20%E6%8F%90%E5%8F%96%E6%A0%B8%E5%BF%83%E4%B8%9A%E5%8A%A1%E5%AD%97%E6%AE%B5%5Cn%20%20%20%20result%20%3D%20%7B%5Cn%20%20%20%20%20%20%20%20%5C%22crawl_time%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%5C%22item_id%5C%22%3A%20item_id%2C%5Cn%20%20%20%20%20%20%20%20%5C%22title%5C%22%3A%20info.get(%5C%22title%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%5C%22price%5C%22%3A%20float(info.get(%5C%22price%5C%22%2C%200))%2C%5Cn%20%20%20%20%20%20%20%20%5C%22prom_price%5C%22%3A%20float(info.get(%5C%22prom_price%5C%22%2C%200))%2C%5Cn%20%20%20%20%20%20%20%20%5C%22sales%5C%22%3A%20int(info.get(%5C%22sales%5C%22%2C%200))%2C%5Cn%20%20%20%20%20%20%20%20%5C%22stock%5C%22%3A%20int(info.get(%5C%22stock%5C%22%2C%200))%2C%5Cn%20%20%20%20%20%20%20%20%5C%22shop_name%5C%22%3A%20info.get(%5C%22shop_name%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20%5C%22score%5C%22%3A%20float(info.get(%5C%22score%5C%22%2C%200))%2C%5Cn%20%20%20%20%20%20%20%20%5C%22review_count%5C%22%3A%20int(info.get(%5C%22review_count%5C%22%2C%200))%5Cn%20%20%20%20%7D%5Cn%20%20%20%20return%20result%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;pandas&amp;nbsp;as&amp;nbsp;pd
import&amp;nbsp;matplotlib.pyplot&amp;nbsp;as&amp;nbsp;plt
import&amp;nbsp;schedule
import&amp;nbsp;time
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime
import&amp;nbsp;os

#&amp;nbsp;基础配置
#&amp;nbsp;工具后台获取的个人凭证（替换为自己账号生成的密钥）
TOKEN&amp;nbsp;=&amp;nbsp;&amp;quot;xxxxxxxxxxxxxxxxxxxx&amp;quot;
#&amp;nbsp;需要监控的商品ID列表，批量新增直接追加
MONITOR_GOODS&amp;nbsp;=&amp;nbsp;[&amp;quot;723456123987&amp;quot;,&amp;nbsp;&amp;quot;723456987654&amp;quot;,&amp;nbsp;&amp;quot;723456543210&amp;quot;]
#&amp;nbsp;数据存储文件
DATA_FILE&amp;nbsp;=&amp;nbsp;&amp;quot;goods_monitor_data.csv&amp;quot;
#&amp;nbsp;绘图字体适配中文
plt.rcParams[&amp;quot;font.family&amp;quot;]&amp;nbsp;=&amp;nbsp;[&amp;quot;SimHei&amp;quot;,&amp;nbsp;&amp;quot;WenQuanYi&amp;nbsp;Micro&amp;nbsp;Hei&amp;quot;]
plt.rcParams[&amp;quot;axes.unicode_minus&amp;quot;]&amp;nbsp;=&amp;nbsp;False

def&amp;nbsp;get_goods_info(item_id):
&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;商品唯一标识
&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;headers&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;Content-Type&amp;quot;:&amp;nbsp;&amp;quot;application/json&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;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;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;nbsp;工具数据请求地址
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;requests.get(&amp;quot;https://data-claw.collector.work/shop/goods&amp;quot;,&amp;nbsp;headers=headers,&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;if&amp;nbsp;res_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;print(f&amp;quot;商品{item_id}数据获取失败：{res_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;return&amp;nbsp;None
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;info&amp;nbsp;=&amp;nbsp;res_data.get(&amp;quot;data&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;提取核心业务字段
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;crawl_time&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;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;title&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;quot;price&amp;quot;:&amp;nbsp;float(info.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;quot;prom_price&amp;quot;:&amp;nbsp;float(info.get(&amp;quot;prom_price&amp;quot;,&amp;nbsp;0)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;sales&amp;quot;:&amp;nbsp;int(info.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;&amp;quot;stock&amp;quot;:&amp;nbsp;int(info.get(&amp;quot;stock&amp;quot;,&amp;nbsp;0)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;shop_name&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;quot;score&amp;quot;:&amp;nbsp;float(info.get(&amp;quot;score&amp;quot;,&amp;nbsp;0)),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;review_count&amp;quot;:&amp;nbsp;int(info.get(&amp;quot;review_count&amp;quot;,&amp;nbsp;0))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;result&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%20save_and_check_change(goods_data)%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20%E5%86%99%E5%85%A5%E6%9C%AC%E5%9C%B0CSV%E5%8E%86%E5%8F%B2%E6%96%87%E4%BB%B6%EF%BC%8C%E5%AF%B9%E6%AF%94%E5%8E%86%E5%8F%B2%E6%95%B0%E6%8D%AE%E8%AF%86%E5%88%AB%E4%BB%B7%E6%A0%BC%2F%E9%94%80%E9%87%8F%E5%BC%82%E5%8A%A8%5Cn%20%20%20%20%5C%22%5C%22%5C%22%5Cn%20%20%20%20if%20not%20goods_data%3A%5Cn%20%20%20%20%20%20%20%20return%5Cn%20%20%20%20%23%20%E5%88%9D%E5%A7%8B%E5%8C%96%E6%95%B0%E6%8D%AE%E6%96%87%E4%BB%B6%5Cn%20%20%20%20if%20not%20os.path.exists(DATA_FILE)%3A%5Cn%20%20%20%20%20%20%20%20df_init%20%3D%20pd.DataFrame(%5Bgoods_data%5D)%5Cn%20%20%20%20%20%20%20%20df_init.to_csv(DATA_FILE%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%BD%95%E5%85%A5%E5%95%86%E5%93%81%7Bgoods_data%5B&amp;#39;item_id&amp;#39;%5D%7D%E7%9B%91%E6%8E%A7%E6%95%B0%E6%8D%AE%5C%22)%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%5Cn%20%20%20%20df_history%20%3D%20pd.read_csv(DATA_FILE%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20item_id%20%3D%20goods_data%5B%5C%22item_id%5C%22%5D%5Cn%20%20%20%20%23%20%E7%AD%9B%E9%80%89%E8%AF%A5%E5%95%86%E5%93%81%E5%8E%86%E5%8F%B2%E6%9C%80%E6%96%B0%E4%B8%80%E6%9D%A1%E8%AE%B0%E5%BD%95%5Cn%20%20%20%20history_item%20%3D%20df_history%5Bdf_history%5B%5C%22item_id%5C%22%5D%20%3D%3D%20item_id%5D%5Cn%20%20%20%20%23%20%E5%86%99%E5%85%A5%E6%96%B0%E6%95%B0%E6%8D%AE%5Cn%20%20%20%20df_new%20%3D%20pd.concat(%5Bdf_history%2C%20pd.DataFrame(%5Bgoods_data%5D)%5D%2C%20ignore_index%3DTrue)%5Cn%20%20%20%20df_new.to_csv(DATA_FILE%2C%20index%3DFalse%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%5Cn%20%20%20%20%23%20%E5%BC%82%E5%8A%A8%E5%88%A4%E6%96%AD%E9%80%BB%E8%BE%91%5Cn%20%20%20%20if%20len(history_item)%20%3E%200%3A%5Cn%20%20%20%20%20%20%20%20last_record%20%3D%20history_item.iloc%5B-1%5D%5Cn%20%20%20%20%20%20%20%20price_old%20%3D%20last_record%5B%5C%22prom_price%5C%22%5D%5Cn%20%20%20%20%20%20%20%20price_new%20%3D%20goods_data%5B%5C%22prom_price%5C%22%5D%5Cn%20%20%20%20%20%20%20%20sales_old%20%3D%20last_record%5B%5C%22sales%5C%22%5D%5Cn%20%20%20%20%20%20%20%20sales_new%20%3D%20goods_data%5B%5C%22sales%5C%22%5D%5Cn%20%20%20%20%20%20%20%20%23%20%E4%BB%B7%E6%A0%BC%E5%8F%98%E5%8A%A8%E9%A2%84%E8%AD%A6%EF%BC%88%E5%B7%AE%E4%BB%B7%E5%A4%A7%E4%BA%8E5%E5%85%83%E8%A7%A6%E5%8F%91%E6%8F%90%E9%86%92%EF%BC%89%5Cn%20%20%20%20%20%20%20%20if%20abs(price_new%20-%20price_old)%20%3E%205%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E3%80%90%E4%BB%B7%E6%A0%BC%E5%BC%82%E5%8A%A8%E6%8F%90%E9%86%92%E3%80%91%E5%95%86%E5%93%81%7Bgoods_data%5B&amp;#39;title&amp;#39;%5D%7D%EF%BC%8C%E5%8E%9F%E4%BB%B7%7Bprice_old%7D%E2%86%92%E7%8E%B0%E4%BB%B7%7Bprice_new%7D%5C%22)%5Cn%20%20%20%20%20%20%20%20%23%20%E9%94%80%E9%87%8F%E6%9A%B4%E6%B6%A8%E6%8F%90%E9%86%92%EF%BC%88%E5%8D%95%E6%AC%A1%E5%A2%9E%E9%87%8F%E8%B6%85200%EF%BC%89%5Cn%20%20%20%20%20%20%20%20if%20sales_new%20-%20sales_old%20%3E%20200%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20print(f%5C%22%E3%80%90%E9%94%80%E9%87%8F%E6%9A%B4%E6%B6%A8%E6%8F%90%E9%86%92%E3%80%91%E5%95%86%E5%93%81%7Bgoods_data%5B&amp;#39;title&amp;#39;%5D%7D%EF%BC%8C%E6%96%B0%E5%A2%9E%E9%94%80%E9%87%8F%7Bsales_new%20-%20sales_old%7D%5C%22)%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;def&amp;nbsp;save_and_check_change(goods_data):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;写入本地CSV历史文件，对比历史数据识别价格/销量异动
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;not&amp;nbsp;goods_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;if&amp;nbsp;not&amp;nbsp;os.path.exists(DATA_FILE):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_init&amp;nbsp;=&amp;nbsp;pd.DataFrame([goods_data])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_init.to_csv(DATA_FILE,&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;首次录入商品{goods_data[&amp;#39;item_id&amp;#39;]}监控数据&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;df_history&amp;nbsp;=&amp;nbsp;pd.read_csv(DATA_FILE,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;item_id&amp;nbsp;=&amp;nbsp;goods_data[&amp;quot;item_id&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;筛选该商品历史最新一条记录
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;history_item&amp;nbsp;=&amp;nbsp;df_history[df_history[&amp;quot;item_id&amp;quot;]&amp;nbsp;==&amp;nbsp;item_id]
&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.concat([df_history,&amp;nbsp;pd.DataFrame([goods_data])],&amp;nbsp;ignore_index=True)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df_new.to_csv(DATA_FILE,&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;&amp;nbsp;if&amp;nbsp;len(history_item)&amp;nbsp;&amp;gt;&amp;nbsp;0:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;last_record&amp;nbsp;=&amp;nbsp;history_item.iloc[-1]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price_old&amp;nbsp;=&amp;nbsp;last_record[&amp;quot;prom_price&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;price_new&amp;nbsp;=&amp;nbsp;goods_data[&amp;quot;prom_price&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sales_old&amp;nbsp;=&amp;nbsp;last_record[&amp;quot;sales&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sales_new&amp;nbsp;=&amp;nbsp;goods_data[&amp;quot;sales&amp;quot;]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;价格变动预警（差价大于5元触发提醒）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;abs(price_new&amp;nbsp;-&amp;nbsp;price_old)&amp;nbsp;&amp;gt;&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;print(f&amp;quot;【价格异动提醒】商品{goods_data[&amp;#39;title&amp;#39;]}，原价{price_old}→现价{price_new}&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;销量暴涨提醒（单次增量超200）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;sales_new&amp;nbsp;-&amp;nbsp;sales_old&amp;nbsp;&amp;gt;&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;【销量暴涨提醒】商品{goods_data[&amp;#39;title&amp;#39;]}，新增销量{sales_new&amp;nbsp;-&amp;nbsp;sales_old}&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;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%22def%20monitor_task()%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E5%8D%95%E6%AC%A1%E6%89%B9%E9%87%8F%E7%9B%91%E6%8E%A7%E4%BB%BB%E5%8A%A1%EF%BC%8C%E5%BE%AA%E7%8E%AF%E6%89%80%E6%9C%89%E5%95%86%E5%93%81%5C%22%5C%22%5C%22%5Cn%20%20%20%20print(f%5C%22%5C%5Cn%3D%3D%3D%3D%3D%20%E5%BC%80%E5%A7%8B%E6%89%A7%E8%A1%8C%E6%89%B9%E9%87%8F%E7%9B%91%E6%8E%A7%20%7Bdatetime.now().strftime(&amp;#39;%25Y-%25m-%25d%20%25H%3A%25M%3A%25S&amp;#39;)%7D%20%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20for%20good_id%20in%20MONITOR_GOODS%3A%5Cn%20%20%20%20%20%20%20%20data%20%3D%20get_goods_info(good_id)%5Cn%20%20%20%20%20%20%20%20if%20data%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20save_and_check_change(data)%5Cn%20%20%20%20print(%5C%22%3D%3D%3D%3D%3D%20%E6%9C%AC%E8%BD%AE%E7%9B%91%E6%8E%A7%E6%89%A7%E8%A1%8C%E5%AE%8C%E6%88%90%20%3D%3D%3D%3D%3D%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;print(f&amp;quot;\n=====&amp;nbsp;开始执行批量监控&amp;nbsp;{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;for&amp;nbsp;good_id&amp;nbsp;in&amp;nbsp;MONITOR_GOODS:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;get_goods_info(good_id)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;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;save_and_check_change(data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;=====&amp;nbsp;本轮监控执行完成&amp;nbsp;=====&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;3.4 数据分析与可视化报表函数&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%20data_analysis_export()%3A%5Cn%20%20%20%20%5C%22%5C%22%5C%22%E8%AF%BB%E5%8F%96%E5%85%A8%E9%83%A8%E5%8E%86%E5%8F%B2%E6%95%B0%E6%8D%AE%EF%BC%8C%E7%BB%9F%E8%AE%A1%E5%88%86%E6%9E%90%E5%B9%B6%E5%AF%BC%E5%87%BAExcel%2B%E4%BB%B7%E6%A0%BC%E8%B6%8B%E5%8A%BF%E5%9B%BE%5C%22%5C%22%5C%22%5Cn%20%20%20%20if%20not%20os.path.exists(DATA_FILE)%3A%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E6%9A%82%E6%97%A0%E7%9B%91%E6%8E%A7%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%20df%20%3D%20pd.read_csv(DATA_FILE%2C%20encoding%3D%5C%22utf-8-sig%5C%22)%5Cn%20%20%20%20%23%201.%20%E5%9F%BA%E7%A1%80%E7%BB%9F%E8%AE%A1%5Cn%20%20%20%20stat_df%20%3D%20df.groupby(%5B%5C%22item_id%5C%22%2C%20%5C%22title%5C%22%5D).agg(%5Cn%20%20%20%20%20%20%20%20min_price%3D(%5C%22prom_price%5C%22%2C%20%5C%22min%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20max_price%3D(%5C%22prom_price%5C%22%2C%20%5C%22max%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20avg_price%3D(%5C%22prom_price%5C%22%2C%20%5C%22mean%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20total_sales%3D(%5C%22sales%5C%22%2C%20%5C%22max%5C%22)%2C%5Cn%20%20%20%20%20%20%20%20latest_score%3D(%5C%22score%5C%22%2C%20%5C%22last%5C%22)%5Cn%20%20%20%20).reset_index()%5Cn%20%20%20%20%23%20%E5%AF%BC%E5%87%BA%E7%BB%9F%E8%AE%A1%E6%8A%A5%E8%A1%A8%5Cn%20%20%20%20stat_df.to_excel(%5C%22%E7%AB%9E%E5%93%81%E8%A1%8C%E6%83%85%E7%BB%9F%E8%AE%A1%E6%8A%A5%E8%A1%A8.xlsx%5C%22%2C%20index%3DFalse)%5Cn%20%20%20%20print(%5C%22%E8%A1%8C%E6%83%85%E7%BB%9F%E8%AE%A1%E6%8A%A5%E8%A1%A8%E5%B7%B2%E7%94%9F%E6%88%90%EF%BC%9A%E7%AB%9E%E5%93%81%E8%A1%8C%E6%83%85%E7%BB%9F%E8%AE%A1%E6%8A%A5%E8%A1%A8.xlsx%5C%22)%5Cn%5Cn%20%20%20%20%23%202.%20%E7%BB%98%E5%88%B6%E4%BB%B7%E6%A0%BC%E8%B6%8B%E5%8A%BF%E5%9B%BE%EF%BC%88%E5%8F%96%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%95%86%E5%93%81%E5%81%9A%E7%A4%BA%E4%BE%8B%EF%BC%89%5Cn%20%20%20%20target_id%20%3D%20MONITOR_GOODS%5B0%5D%5Cn%20%20%20%20target_data%20%3D%20df%5Bdf%5B%5C%22item_id%5C%22%5D%20%3D%3D%20target_id%5D.sort_values(%5C%22crawl_time%5C%22)%5Cn%20%20%20%20if%20len(target_data)%20%3E%201%3A%5Cn%20%20%20%20%20%20%20%20fig%2C%20ax%20%3D%20plt.subplots(figsize%3D(12%2C%206))%5Cn%20%20%20%20%20%20%20%20ax.plot(target_data%5B%5C%22crawl_time%5C%22%5D%2C%20target_data%5B%5C%22prom_price%5C%22%5D%2C%20marker%3D%5C%22o%5C%22%2C%20label%3D%5C%22%E6%B4%BB%E5%8A%A8%E5%94%AE%E4%BB%B7%5C%22)%5Cn%20%20%20%20%20%20%20%20ax.set_title(%5C%22%E5%95%86%E5%93%81%E4%BB%B7%E6%A0%BC%E5%8E%86%E5%8F%B2%E6%B3%A2%E5%8A%A8%E8%B6%8B%E5%8A%BF%5C%22)%5Cn%20%20%20%20%20%20%20%20ax.set_xlabel(%5C%22%E7%9B%91%E6%8E%A7%E6%97%B6%E9%97%B4%5C%22)%5Cn%20%20%20%20%20%20%20%20ax.set_ylabel(%5C%22%E4%BB%B7%E6%A0%BC%EF%BC%88%E5%85%83%EF%BC%89%5C%22)%5Cn%20%20%20%20%20%20%20%20plt.xticks(rotation%3D45)%5Cn%20%20%20%20%20%20%20%20ax.legend()%5Cn%20%20%20%20%20%20%20%20plt.tight_layout()%5Cn%20%20%20%20%20%20%20%20plt.savefig(%5C%22price_trend.png%5C%22)%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E4%BB%B7%E6%A0%BC%E8%B6%8B%E5%8A%BF%E5%9B%BE%E8%A1%A8%E5%B7%B2%E4%BF%9D%E5%AD%98%EF%BC%9Aprice_trend.png%5C%22)%5Cn%22%7D&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;codeSnippet&quot;&gt;def&amp;nbsp;data_analysis_export():
&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;if&amp;nbsp;not&amp;nbsp;os.path.exists(DATA_FILE):
&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;df&amp;nbsp;=&amp;nbsp;pd.read_csv(DATA_FILE,&amp;nbsp;encoding=&amp;quot;utf-8-sig&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;1.&amp;nbsp;基础统计
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stat_df&amp;nbsp;=&amp;nbsp;df.groupby([&amp;quot;item_id&amp;quot;,&amp;nbsp;&amp;quot;title&amp;quot;]).agg(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_price=(&amp;quot;prom_price&amp;quot;,&amp;nbsp;&amp;quot;min&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;max_price=(&amp;quot;prom_price&amp;quot;,&amp;nbsp;&amp;quot;max&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;avg_price=(&amp;quot;prom_price&amp;quot;,&amp;nbsp;&amp;quot;mean&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_sales=(&amp;quot;sales&amp;quot;,&amp;nbsp;&amp;quot;max&amp;quot;),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;latest_score=(&amp;quot;score&amp;quot;,&amp;nbsp;&amp;quot;last&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;).reset_index()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;导出统计报表
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stat_df.to_excel(&amp;quot;竞品行情统计报表.xlsx&amp;quot;,&amp;nbsp;index=False)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;行情统计报表已生成：竞品行情统计报表.xlsx&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;2.&amp;nbsp;绘制价格趋势图（取第一个商品做示例）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;target_id&amp;nbsp;=&amp;nbsp;MONITOR_GOODS[0]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;target_data&amp;nbsp;=&amp;nbsp;df[df[&amp;quot;item_id&amp;quot;]&amp;nbsp;==&amp;nbsp;target_id].sort_values(&amp;quot;crawl_time&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(target_data)&amp;nbsp;&amp;gt;&amp;nbsp;1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fig,&amp;nbsp;ax&amp;nbsp;=&amp;nbsp;plt.subplots(figsize=(12,&amp;nbsp;6))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ax.plot(target_data[&amp;quot;crawl_time&amp;quot;],&amp;nbsp;target_data[&amp;quot;prom_price&amp;quot;],&amp;nbsp;marker=&amp;quot;o&amp;quot;,&amp;nbsp;label=&amp;quot;活动售价&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ax.set_title(&amp;quot;商品价格历史波动趋势&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ax.set_xlabel(&amp;quot;监控时间&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ax.set_ylabel(&amp;quot;价格（元）&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.xticks(rotation=45)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ax.legend()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.tight_layout()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.savefig(&amp;quot;price_trend.png&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&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;p&gt;3.5 定时循环启动入口&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%22if%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20%23%20%E8%AE%BE%E7%BD%AE%E6%AF%8F1%E5%B0%8F%E6%97%B6%E8%87%AA%E5%8A%A8%E6%89%A7%E8%A1%8C%E4%B8%80%E8%BD%AE%E7%9B%91%E6%8E%A7%EF%BC%8C%E5%8F%AF%E4%BF%AE%E6%94%B9%E4%B8%BA30%2F60%2F120%E5%88%86%E9%92%9F%5Cn%20%20%20%20schedule.every(1).hours.do(monitor_task)%5Cn%20%20%20%20%23%20%E7%A8%8B%E5%BA%8F%E5%90%AF%E5%8A%A8%E5%85%88%E6%89%A7%E8%A1%8C%E4%B8%80%E6%AC%A1%E7%9B%91%E6%8E%A7%2B%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%5Cn%20%20%20%20monitor_task()%5Cn%20%20%20%20data_analysis_export()%5Cn%20%20%20%20print(%5C%22%5C%5Cn%E7%9B%91%E6%8E%A7%E7%A8%8B%E5%BA%8F%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C%E4%B8%AD%EF%BC%8C%E6%AF%8F%E5%B0%8F%E6%97%B6%E8%87%AA%E5%8A%A8%E5%90%8C%E6%AD%A5%E6%95%B0%E6%8D%AE%EF%BC%8C%E6%8C%89Ctrl%2BC%E7%BB%88%E6%AD%A2%5C%22)%5Cn%20%20%20%20%23%20%E6%8C%81%E7%BB%AD%E5%BE%AA%E7%8E%AF%E8%B0%83%E5%BA%A6%5Cn%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20schedule.run_pending()%5Cn%20%20%20%20%20%20%20%20time.sleep(60)%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;设置每1小时自动执行一轮监控，可修改为30/60/120分钟
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;schedule.every(1).hours.do(monitor_task)
&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;data_analysis_export()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;\n监控程序后台运行中，每小时自动同步数据，按Ctrl+C终止&amp;quot;)
&amp;nbsp;&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;schedule.run_pending()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(60)&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;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%87%AD%E8%AF%81%E6%9B%BF%E6%8D%A2%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%22tu67Wg-1783935978028%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;code&gt;TOKEN&lt;/code&gt;替换为 Open Claw 后台个人专属密钥，登录工具后台即可一键生成，权限默认开放商品全字段查询；&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;MONITOR_GOODS&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;code&gt;schedule.every(1).hours&lt;/code&gt;修改数字，0.5 代表 30 分钟，2 代表 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;&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;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;导入整个类目几十上百款商品 ID，长期采集后用 Pandas 做整体价格区间分布、店铺评分分层、销量梯队划分，输出类目市场报告，作为选品、备货、上新的核心数据依据，替代人工逐页截图统计。&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;：长期监控会积累大量历史快照，可增加定时清理 30 天前旧数据的逻辑，避免 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;：代码可新增 try-except 捕获网络波动，监控失败自动重试，防止单次接口超时中断整轮批量任务；&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;：程序支持 Windows、Mac、Linux 服务器后台挂起运行，服务器 24 小时不间断监控，本地电脑仅需运行时查看报表即可。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;七、总结&lt;/h2&gt;&lt;p&gt;以往做电商市场监测，要么靠人工低效统计，要么投入大量开发成本搭建采集体系，对中小商家、个人运营极不友好。借助 Open Claw 一站式数据能力，搭配几十行轻量化 Python 代码，零底层开发成本实现&lt;strong&gt;7×24 小时全自动商品监控&lt;/strong&gt;，自动留存历史数据、识别异动、输出可视化分析报表。&lt;/p&gt;&lt;p&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>Mon, 13 Jul 2026 17:50:54 +0800</pubDate></item><item><title>电商竞品评论自动监控 + 深度文本分析完整实操方案（附可运行 Python 代码）</title><link>https://www.shopapi.com.cn/?id=193</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;做电商运营、产品、市场调研的朋友，几乎都绕不开竞品用户评价分析这件事。传统手动复制评论、Excel 整理的方式效率极低：单款商品上万条评价，逐条筛选差评、统计吐槽点、跟踪新增反馈，人工至少耗费半天；多商品长期监控更是分身乏术，等整理完数据，竞品已经完成一轮产品迭代。&lt;/p&gt;&lt;p&gt;本文分享一套轻量化落地方案，借助 OpenClaw 一站式数据能力，无需复杂环境搭建，半小时完成商品评论全量获取、实时增量监控、情感分词、关键词统计，附带完整可运行代码，个人 / 小团队均可直接复用，适配淘宝、天猫国内电商场景。&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;&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%BF%AB%E9%80%9F%E6%8B%89%E5%8F%96%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%22CZreHb-1783670394655%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;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; 仅需 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;本地安装 Python3.8 及以上版本，执行 pip 安装所需工具包：&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%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&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;登录 OpenClaw 后台，创建个人数据项目，获取专属身份凭证字符串（下文代码中&lt;code&gt;token&lt;/code&gt;字段替换为个人凭证），填写目标商品 ID 即可锁定采集对象，支持单次传入多个商品编号批量处理。&lt;/p&gt;&lt;h2&gt;三、完整实操代码（分三大模块：数据拉取、增量监控、评论分析）&lt;/h2&gt;&lt;h3&gt;模块 1：批量获取商品全部评价数据&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;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%E5%9F%BA%E7%A1%80%E9%85%8D%E7%BD%AE%5CnTOKEN%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E4%B8%AA%E4%BA%BA%E8%BA%AB%E4%BB%BD%E5%87%AD%E8%AF%81%E5%AD%97%E7%AC%A6%E4%B8%B2%5C%22%5CnTARGET_ITEM_IDS%20%3D%20%5B%5C%22728945612345%5C%22%2C%20%5C%22728945678901%5C%22%5D%20%20%23%20%E5%BE%85%E7%9B%91%E6%8E%A7%E5%95%86%E5%93%81ID%E5%88%97%E8%A1%A8%5CnSAVE_PATH%20%3D%20%5C%22%E7%94%B5%E5%95%86%E8%AF%84%E8%AE%BA%E5%8E%9F%E5%A7%8B%E6%95%B0%E6%8D%AE.xlsx%5C%22%5Cn%5Cndef%20get_all_reviews(item_id)%3A%5Cn%20%20%20%20review_list%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%20%23%20%E6%9E%84%E5%BB%BA%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%22token%5C%22%3A%20TOKEN%2C%5Cn%20%20%20%20%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%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%22limit%5C%22%3A%2050%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20resp%20%3D%20requests.get(%5C%22https%3A%2F%2Fdata-claw.fetchcontent.com%2Fcomment%5C%22%2C%20params%3Dparams)%5Cn%20%20%20%20%20%20%20%20res_data%20%3D%20resp.json()%5Cn%20%20%20%20%20%20%20%20%23%20%E5%88%A4%E6%96%AD%E6%97%A0%E6%9B%B4%E5%A4%9A%E6%95%B0%E6%8D%AE%E5%88%99%E9%80%80%E5%87%BA%E5%BE%AA%E7%8E%AF%5Cn%20%20%20%20%20%20%20%20if%20len(res_data.get(%5C%22data%5C%22%2C%20%5B%5D))%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%20%23%20%E6%B8%85%E6%B4%97%E5%8D%95%E6%9D%A1%E8%AF%84%E4%BB%B7%E5%AD%97%E6%AE%B5%5Cn%20%20%20%20%20%20%20%20for%20item%20in%20res_data%5B%5C%22data%5C%22%5D%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%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%5C%22%E8%AF%84%E4%BB%B7%E6%97%B6%E9%97%B4%5C%22%3A%20item.get(%5C%22publish_time%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%22star%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%E5%86%85%E5%AE%B9%5C%22%3A%20item.get(%5C%22content%5C%22)%2C%5Cn%20%20%20%20%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%20item.get(%5C%22is_add_comment%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%E6%95%B0%E9%87%8F%5C%22%3A%20item.get(%5C%22img_num%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%A0%87%E7%AD%BE%5C%22%3A%20item.get(%5C%22buyer_tag%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(temp_dict)%5Cn%20%20%20%20%20%20%20%20page%20%2B%3D%201%5Cn%20%20%20%20%20%20%20%20time.sleep(1.2)%20%20%23%20%E9%99%90%E6%B5%81%E9%98%B2%E9%AB%98%E9%A2%91%E8%AE%BF%E9%97%AE%5Cn%20%20%20%20return%20review_list%5Cn%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20total_data%20%3D%20%5B%5D%5Cn%20%20%20%20for%20goods_id%20in%20TARGET_ITEM_IDS%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%E5%95%86%E5%93%81%7Bgoods_id%7D%E8%AF%84%E4%BB%B7%E6%95%B0%E6%8D%AE...%5C%22)%5Cn%20%20%20%20%20%20%20%20goods_reviews%20%3D%20get_all_reviews(goods_id)%5Cn%20%20%20%20%20%20%20%20total_data.extend(goods_reviews)%5Cn%20%20%20%20%20%20%20%20print(f%5C%22%E5%95%86%E5%93%81%7Bgoods_id%7D%E5%85%B1%E8%8E%B7%E5%8F%96%7Blen(goods_reviews)%7D%E6%9D%A1%E8%AF%84%E4%BB%B7%5C%22)%5Cn%20%20%20%20%23%20%E4%BF%9D%E5%AD%98%E8%87%B3%E6%9C%AC%E5%9C%B0Excel%5Cn%20%20%20%20df%20%3D%20pd.DataFrame(total_data)%5Cn%20%20%20%20df.to_excel(SAVE_PATH%2C%20index%3DFalse)%5Cn%20%20%20%20print(f%5C%22%E5%85%A8%E9%83%A8%E6%95%B0%E6%8D%AE%E9%87%87%E9%9B%86%E5%AE%8C%E6%88%90%EF%BC%8C%E5%B7%B2%E4%BF%9D%E5%AD%98%E8%87%B3%7BSAVE_PATH%7D%5C%22)%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;基础配置
TOKEN&amp;nbsp;=&amp;nbsp;&amp;quot;你的个人身份凭证字符串&amp;quot;
TARGET_ITEM_IDS&amp;nbsp;=&amp;nbsp;[&amp;quot;728945612345&amp;quot;,&amp;nbsp;&amp;quot;728945678901&amp;quot;]&amp;nbsp;&amp;nbsp;#&amp;nbsp;待监控商品ID列表
SAVE_PATH&amp;nbsp;=&amp;nbsp;&amp;quot;电商评论原始数据.xlsx&amp;quot;

def&amp;nbsp;get_all_reviews(item_id):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;review_list&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;#&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;token&amp;quot;:&amp;nbsp;TOKEN,
&amp;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;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;limit&amp;quot;:&amp;nbsp;50
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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.fetchcontent.com/comment&amp;quot;,&amp;nbsp;params=params)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res_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;if&amp;nbsp;len(res_data.get(&amp;quot;data&amp;quot;,&amp;nbsp;[]))&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;#&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;res_data[&amp;quot;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;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_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;quot;评价时间&amp;quot;:&amp;nbsp;item.get(&amp;quot;publish_time&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;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;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;is_add_comment&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;img_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;quot;买家标签&amp;quot;:&amp;nbsp;item.get(&amp;quot;buyer_tag&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(temp_dict)
&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.2)&amp;nbsp;&amp;nbsp;#&amp;nbsp;限流防高频访问
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;review_list

if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_data&amp;nbsp;=&amp;nbsp;[]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;goods_id&amp;nbsp;in&amp;nbsp;TARGET_ITEM_IDS:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;正在采集商品{goods_id}评价数据...&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;goods_reviews&amp;nbsp;=&amp;nbsp;get_all_reviews(goods_id)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total_data.extend(goods_reviews)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;商品{goods_id}共获取{len(goods_reviews)}条评价&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;保存至本地Excel
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;pd.DataFrame(total_data)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df.to_excel(SAVE_PATH,&amp;nbsp;index=False)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;全部数据采集完成，已保存至{SAVE_PATH}&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;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%5Cnfrom%20datetime%20import%20datetime%5Cn%5CnTOKEN%20%3D%20%5C%22%E4%BD%A0%E7%9A%84%E4%B8%AA%E4%BA%BA%E8%BA%AB%E4%BB%BD%E5%87%AD%E8%AF%81%E5%AD%97%E7%AC%A6%E4%B8%B2%5C%22%5CnTARGET_ITEM_IDS%20%3D%20%5B%5C%22728945612345%5C%22%2C%20%5C%22728945678901%5C%22%5D%5CnHISTORY_FILE%20%3D%20%5C%22%E7%94%B5%E5%95%86%E8%AF%84%E8%AE%BA%E5%8E%9F%E5%A7%8B%E6%95%B0%E6%8D%AE.xlsx%5C%22%5CnNEW_REVIEW_LOG%20%3D%20%5C%22%E6%96%B0%E5%A2%9E%E8%AF%84%E4%BB%B7%E5%AE%9E%E6%97%B6%E6%97%A5%E5%BF%97.txt%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%8C%E5%8F%AF%E8%87%AA%E8%A1%8C%E6%89%A9%E5%85%85%5CnBAD_WORDS%20%3D%20%5B%5C%22%E8%89%B2%E5%B7%AE%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%8F%91%E8%B4%A7%E6%85%A2%5C%22%2C%20%5C%22%E8%B4%A8%E9%87%8F%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%E6%B0%94%E5%91%B3%E5%A4%A7%5C%22%5D%5Cn%5Cndef%20get_new_reviews(item_id)%3A%5Cn%20%20%20%20new_data%20%3D%20%5B%5D%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%22item_id%5C%22%3A%20item_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%22limit%5C%22%3A%2030%5Cn%20%20%20%20%7D%5Cn%20%20%20%20resp%20%3D%20requests.get(%5C%22https%3A%2F%2Fdata-claw.fetchcontent.com%2Fcomment%5C%22%2C%20params%3Dparams)%5Cn%20%20%20%20res_data%20%3D%20resp.json()%5Cn%20%20%20%20return%20res_data.get(%5C%22data%5C%22%2C%20%5B%5D)%5Cn%5Cndef%20monitor_task()%3A%5Cn%20%20%20%20%23%20%E8%AF%BB%E5%8F%96%E5%8E%86%E5%8F%B2%E5%B7%B2%E6%9C%89%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_excel(HISTORY_FILE)%5Cn%20%20%20%20%20%20%20%20history_content_set%20%3D%20set(history_df%5B%5C%22%E8%AF%84%E4%BB%B7%E5%86%85%E5%AE%B9%5C%22%5D.tolist())%5Cn%20%20%20%20except%3A%5Cn%20%20%20%20%20%20%20%20history_content_set%20%3D%20set()%5Cn%20%20%20%20%5Cn%20%20%20%20today%20%3D%20datetime.now().strftime(%5C%22%25Y-%25m-%25d%20%25H%3A%25M%3A%25S%5C%22)%5Cn%20%20%20%20log_text%20%3D%20f%5C%22%5C%5Cn%3D%3D%3D%3D%3D%20%7Btoday%7D%20%E7%9B%91%E6%8E%A7%E8%BD%AE%E6%AC%A1%20%3D%3D%3D%3D%3D%5C%5Cn%5C%22%5Cn%20%20%20%20alert_flag%20%3D%20False%5Cn%5Cn%20%20%20%20for%20goods_id%20in%20TARGET_ITEM_IDS%3A%5Cn%20%20%20%20%20%20%20%20fresh_comments%20%3D%20get_new_reviews(goods_id)%5Cn%20%20%20%20%20%20%20%20for%20comment%20in%20fresh_comments%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20content%20%3D%20comment.get(%5C%22content%5C%22%2C%20%5C%22%5C%22)%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%E4%B8%BA%E5%85%A8%E6%96%B0%E8%AF%84%E4%BB%B7%5Cn%20%20%20%20%20%20%20%20%20%20%20%20if%20content%20not%20in%20history_content_set%20and%20content.strip()%20!%3D%20%5C%22%5C%22%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20log_text%20%2B%3D%20f%5C%22%E3%80%90%E5%95%86%E5%93%81%7Bgoods_id%7D%E3%80%91%7Bcomment%5B&amp;#39;publish_time&amp;#39;%5D%7D%20%7C%20%7Bcomment%5B&amp;#39;star&amp;#39;%5D%7D%E6%98%9F%20%7C%20%7Bcontent%7D%5C%5Cn%5C%22%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20history_content_set.add(content)%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%B4%9F%E9%9D%A2%E5%85%B3%E9%94%AE%E8%AF%8D%E9%A2%84%E8%AD%A6%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20word%20in%20BAD_WORDS%3A%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20word%20in%20content%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%20log_text%20%2B%3D%20f%5C%22%E2%9A%A0%EF%B8%8F%20%E8%B4%9F%E9%9D%A2%E9%A2%84%E8%AD%A6%EF%BC%9A%E5%91%BD%E4%B8%AD%E5%85%B3%E9%94%AE%E8%AF%8D%E3%80%90%7Bword%7D%E3%80%91%5C%5Cn%5C%22%5Cn%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alert_flag%20%3D%20True%5Cn%20%20%20%20%23%20%E5%86%99%E5%85%A5%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%5Cn%20%20%20%20with%20open(NEW_REVIEW_LOG%2C%20%5C%22a%5C%22%2C%20encoding%3D%5C%22utf-8%5C%22)%20as%20f%3A%5Cn%20%20%20%20%20%20%20%20f.write(log_text)%5Cn%20%20%20%20if%20alert_flag%3A%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E3%80%90%E9%87%8D%E8%A6%81%E6%8F%90%E9%86%92%E3%80%91%E6%9C%AC%E8%BD%AE%E7%9B%91%E6%8E%A7%E5%8F%91%E7%8E%B0%E8%B4%9F%E9%9D%A2%E8%AF%84%E4%BB%B7%EF%BC%8C%E8%AF%B7%E6%9F%A5%E7%9C%8B%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%EF%BC%81%5C%22)%5Cn%20%20%20%20else%3A%5Cn%20%20%20%20%20%20%20%20print(%5C%22%E6%9C%AC%E8%BD%AE%E7%9B%91%E6%8E%A7%E5%AE%8C%E6%88%90%EF%BC%8C%E6%97%A0%E6%96%B0%E5%A2%9E%E8%B4%9F%E9%9D%A2%E5%8F%8D%E9%A6%88%5C%22)%5Cn%5Cn%23%20%E5%AE%9A%E6%97%B6%E5%BE%AA%E7%8E%AF%EF%BC%8C%E6%AF%8F30%E5%88%86%E9%92%9F%E6%89%A7%E8%A1%8C%E4%B8%80%E6%AC%A1%E7%9B%91%E6%8E%A7%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20while%20True%3A%5Cn%20%20%20%20%20%20%20%20monitor_task()%5Cn%20%20%20%20%20%20%20%20time.sleep(1800)%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
from&amp;nbsp;datetime&amp;nbsp;import&amp;nbsp;datetime

TOKEN&amp;nbsp;=&amp;nbsp;&amp;quot;你的个人身份凭证字符串&amp;quot;
TARGET_ITEM_IDS&amp;nbsp;=&amp;nbsp;[&amp;quot;728945612345&amp;quot;,&amp;nbsp;&amp;quot;728945678901&amp;quot;]
HISTORY_FILE&amp;nbsp;=&amp;nbsp;&amp;quot;电商评论原始数据.xlsx&amp;quot;
NEW_REVIEW_LOG&amp;nbsp;=&amp;nbsp;&amp;quot;新增评价实时日志.txt&amp;quot;
#&amp;nbsp;负面关键词库，可自行扩充
BAD_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;]

def&amp;nbsp;get_new_reviews(item_id):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_data&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;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;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;1,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;limit&amp;quot;:&amp;nbsp;30
&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.fetchcontent.com/comment&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.get(&amp;quot;data&amp;quot;,&amp;nbsp;[])

def&amp;nbsp;monitor_task():
&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_excel(HISTORY_FILE)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;history_content_set&amp;nbsp;=&amp;nbsp;set(history_df[&amp;quot;评价内容&amp;quot;].tolist())
&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;history_content_set&amp;nbsp;=&amp;nbsp;set()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;today&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;log_text&amp;nbsp;=&amp;nbsp;f&amp;quot;\n=====&amp;nbsp;{today}&amp;nbsp;监控轮次&amp;nbsp;=====\n&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alert_flag&amp;nbsp;=&amp;nbsp;False

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;goods_id&amp;nbsp;in&amp;nbsp;TARGET_ITEM_IDS:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fresh_comments&amp;nbsp;=&amp;nbsp;get_new_reviews(goods_id)
&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;fresh_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;content&amp;nbsp;=&amp;nbsp;comment.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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;判断是否为全新评价
&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;content&amp;nbsp;not&amp;nbsp;in&amp;nbsp;history_content_set&amp;nbsp;and&amp;nbsp;content.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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log_text&amp;nbsp;+=&amp;nbsp;f&amp;quot;【商品{goods_id}】{comment[&amp;#39;publish_time&amp;#39;]}&amp;nbsp;|&amp;nbsp;{comment[&amp;#39;star&amp;#39;]}星&amp;nbsp;|&amp;nbsp;{content}\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;history_content_set.add(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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;负面关键词预警
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;word&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;word&amp;nbsp;in&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;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log_text&amp;nbsp;+=&amp;nbsp;f&amp;quot;⚠️&amp;nbsp;负面预警：命中关键词【{word}】\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;alert_flag&amp;nbsp;=&amp;nbsp;True
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;写入日志文件
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with&amp;nbsp;open(NEW_REVIEW_LOG,&amp;nbsp;&amp;quot;a&amp;quot;,&amp;nbsp;encoding=&amp;quot;utf-8&amp;quot;)&amp;nbsp;as&amp;nbsp;f:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f.write(log_text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;alert_flag:
&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;else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;本轮监控完成，无新增负面反馈&amp;quot;)

#&amp;nbsp;定时循环，每30分钟执行一次监控
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&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;monitor_task()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time.sleep(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;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;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%5CnDATA_FILE%20%3D%20%5C%22%E7%94%B5%E5%95%86%E8%AF%84%E8%AE%BA%E5%8E%9F%E5%A7%8B%E6%95%B0%E6%8D%AE.xlsx%5C%22%5CnSTOP_WORDS%20%3D%20%5B%5C%22%E5%BE%88%E5%A5%BD%5C%22%2C%20%5C%22%E4%B8%8D%E9%94%99%5C%22%2C%20%5C%22%E8%BF%98%E8%A1%8C%5C%22%2C%20%5C%22%E6%BB%A1%E6%84%8F%5C%22%2C%20%5C%22%E7%89%A9%E6%B5%81%E5%BF%AB%5C%22%2C%20%5C%22%E8%B4%A8%E9%87%8F%E5%A5%BD%5C%22%2C%20%5C%22%E6%94%B6%E5%88%B0%5C%22%2C%20%5C%22%E9%9D%9E%E5%B8%B8%5C%22%5D%5Cn%5Cndef%20analysis_comments()%3A%5Cn%20%20%20%20df%20%3D%20pd.read_excel(DATA_FILE)%5Cn%20%20%20%20%23%201.%20%E6%98%9F%E7%BA%A7%E5%88%86%E5%B8%83%E7%BB%9F%E8%AE%A1%5Cn%20%20%20%20star_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()%5Cn%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%20print(star_count)%5Cn%20%20%20%20%23%20%E5%88%92%E5%88%86%E5%A5%BD%E8%AF%84%2F%E4%B8%AD%E5%B7%AE%E8%AF%84%5Cn%20%20%20%20good%20%3D%20df%5Bdf%5B%5C%22%E6%98%9F%E7%BA%A7%E8%AF%84%E5%88%86%5C%22%5D%20%3E%3D%204%5D.shape%5B0%5D%5Cn%20%20%20%20bad%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.shape%5B0%5D%5Cn%20%20%20%20total%20%3D%20df.shape%5B0%5D%5Cn%20%20%20%20print(f%5C%22%E5%A5%BD%E8%AF%84%E5%8D%A0%E6%AF%94%EF%BC%9A%7Bround(good%2Ftotal*100%2C2)%7D%25%EF%BC%8C%E4%B8%AD%E5%B7%AE%E8%AF%84%E5%8D%A0%E6%AF%94%EF%BC%9A%7Bround(bad%2Ftotal*100%2C2)%7D%25%5C%22)%5Cn%5Cn%20%20%20%20%23%202.%20%E6%8F%90%E5%8F%96%E4%B8%AD%E5%B7%AE%E8%AF%84%E9%AB%98%E9%A2%91%E5%85%B3%E9%94%AE%E8%AF%8D%5Cn%20%20%20%20bad_df%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%5Cn%20%20%20%20all_text%20%3D%20%5C%22%5C%22.join(bad_df%5B%5C%22%E8%AF%84%E4%BB%B7%E5%86%85%E5%AE%B9%5C%22%5D.astype(str))%5Cn%20%20%20%20words%20%3D%20jieba.lcut(all_text)%5Cn%20%20%20%20word_filter%20%3D%20%5Bw%20for%20w%20in%20words%20if%20len(w)%3E%3D2%20and%20w%20not%20in%20STOP_WORDS%5D%5Cn%20%20%20%20word_freq%20%3D%20Counter(word_filter)%5Cn%20%20%20%20top20%20%3D%20word_freq.most_common(20)%5Cn%20%20%20%20print(%5C%22%5C%5Cn%3D%3D%3D%3D%3D%20%E4%B8%AD%E5%B7%AE%E8%AF%84Top20%E9%AB%98%E9%A2%91%E5%85%B3%E9%94%AE%E8%AF%8D%20%3D%3D%3D%3D%3D%5C%22)%5Cn%20%20%20%20for%20word%2C%20num%20in%20top20%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%20%5Cn%20%20%20%20%23%203.%20%E7%BB%98%E5%88%B6%E8%AF%8D%E9%A2%91%E6%9F%B1%E7%8A%B6%E5%9B%BE%5Cn%20%20%20%20words_list%20%3D%20%5Bi%5B0%5D%20for%20i%20in%20top20%5D%5Cn%20%20%20%20count_list%20%3D%20%5Bi%5B1%5D%20for%20i%20in%20top20%5D%5Cn%20%20%20%20plt.figure(figsize%3D(12%2C6))%5Cn%20%20%20%20plt.bar(words_list%2C%20count_list)%5Cn%20%20%20%20plt.xticks(rotation%3D45)%5Cn%20%20%20%20plt.title(%5C%22%E7%AB%9E%E5%93%81%E5%B7%AE%E8%AF%84%E9%AB%98%E9%A2%91%E5%85%B3%E9%94%AE%E8%AF%8D%E7%BB%9F%E8%AE%A1%5C%22)%5Cn%20%20%20%20plt.tight_layout()%5Cn%20%20%20%20plt.savefig(%5C%22%E5%B7%AE%E8%AF%84%E5%85%B3%E9%94%AE%E8%AF%8D%E5%88%86%E5%B8%83%E5%9B%BE.png%5C%22)%5Cn%20%20%20%20print(%5C%22%5C%5Cn%E8%AF%8D%E9%A2%91%E5%9B%BE%E8%A1%A8%E5%B7%B2%E4%BF%9D%E5%AD%98%E8%87%B3%E6%9C%AC%E5%9C%B0%EF%BC%81%5C%22)%5Cn%5Cnif%20__name__%20%3D%3D%20%5C%22__main__%5C%22%3A%5Cn%20%20%20%20analysis_comments()%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
DATA_FILE&amp;nbsp;=&amp;nbsp;&amp;quot;电商评论原始数据.xlsx&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;]

def&amp;nbsp;analysis_comments():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;df&amp;nbsp;=&amp;nbsp;pd.read_excel(DATA_FILE)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;1.&amp;nbsp;星级分布统计
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;star_count&amp;nbsp;=&amp;nbsp;df[&amp;quot;星级评分&amp;quot;].value_counts().sort_index()
&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(star_count)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;划分好评/中差评
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;good&amp;nbsp;=&amp;nbsp;df[df[&amp;quot;星级评分&amp;quot;]&amp;nbsp;&amp;gt;=&amp;nbsp;4].shape[0]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bad&amp;nbsp;=&amp;nbsp;df[df[&amp;quot;星级评分&amp;quot;]&amp;nbsp;&amp;lt;=&amp;nbsp;3].shape[0]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total&amp;nbsp;=&amp;nbsp;df.shape[0]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(f&amp;quot;好评占比：{round(good/total*100,2)}%，中差评占比：{round(bad/total*100,2)}%&amp;quot;)

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;2.&amp;nbsp;提取中差评高频关键词
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bad_df&amp;nbsp;=&amp;nbsp;df[df[&amp;quot;星级评分&amp;quot;]&amp;nbsp;&amp;lt;=&amp;nbsp;3]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all_text&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;.join(bad_df[&amp;quot;评价内容&amp;quot;].astype(str))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;words&amp;nbsp;=&amp;nbsp;jieba.lcut(all_text)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;word_filter&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]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;word_freq&amp;nbsp;=&amp;nbsp;Counter(word_filter)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;top20&amp;nbsp;=&amp;nbsp;word_freq.most_common(20)
&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;for&amp;nbsp;word,&amp;nbsp;num&amp;nbsp;in&amp;nbsp;top20:
&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;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;3.&amp;nbsp;绘制词频柱状图
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;words_list&amp;nbsp;=&amp;nbsp;[i[0]&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;top20]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count_list&amp;nbsp;=&amp;nbsp;[i[1]&amp;nbsp;for&amp;nbsp;i&amp;nbsp;in&amp;nbsp;top20]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.figure(figsize=(12,6))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.bar(words_list,&amp;nbsp;count_list)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.xticks(rotation=45)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.title(&amp;quot;竞品差评高频关键词统计&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.tight_layout()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.savefig(&amp;quot;差评关键词分布图.png&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;\n词频图表已保存至本地！&amp;quot;)

if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;&amp;quot;__main__&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;analysis_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;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，一次性拉取全部历史评价，生成基础 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;开启 7×24 小时监控&lt;/strong&gt; 后台常驻运行第二段监控脚本，每 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;/ol&gt;&lt;h2&gt;五、实战落地场景分享&lt;/h2&gt;&lt;h3&gt;场景 1：新品上线竞品对标调研&lt;/h3&gt;&lt;p&gt;新品筹备阶段，批量采集同赛道头部 3-5 款竞品全部评价，通过词频分析找到用户核心痛点：比如服装类目集中吐槽 “尺码偏小”，开发阶段直接调整版型；小家电频繁反馈 “噪音大”，优化内部电机结构，精准打造差异化卖点。&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;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.2 秒间隔限流，若商品评价超 10 万条，可拆分商品 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;code&gt;STOP_WORDS&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;strong&gt;监控日志文件过大&lt;/strong&gt; 新增定时清理脚本，按月归档历史日志，只保留近 30 天新增评价记录，节省本地存储空间。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;七、总结&lt;/h2&gt;&lt;p&gt;这套基于 OpenClaw 搭建的电商评论监控分析方案，完美解决传统人工整理数据低效、反馈滞后的痛点。无需复杂底层开发，三段代码覆盖&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>Fri, 10 Jul 2026 16:01:32 +0800</pubDate></item></channel></rss>