用 Python 搭建农产品价格分析与可视化系统:从电商数据采集到市场分层画像
目录
有需要本项目的代码、文档、完整资源,或者需要部署调试的朋友,可以私信博主。
做这个项目时,我最开始想解决的并不是一个特别复杂的问题,而是一个很贴近日常的问题:面对同一种水果、蔬菜或粮油商品,平台上的价格为什么差别这么大?哪些品类是真正的热销款,哪些只是标题写得热闹但转化并不高?如果只靠人工翻页面,很难形成稳定判断,所以我把目标定成了一个完整的数据分析系统:先把电商页面上的农产品价格、销量、店铺、品种和产地等信息采集下来,再通过清洗、入库、统计、可视化和聚类分析,把零散网页数据整理成可以浏览、可以比较、可以辅助决策的结果。
最终完成的系统以 Python 为主线,前端页面、后台管理、可视化大屏和聚类画像都围绕同一套数据展开。整体上看,它不是单纯的爬虫脚本,也不是只放几张图的展示页面,而是把数据采集、数据治理、分析建模和 Web 交互串成了一条相对完整的工程链路。普通用户可以打开浏览器查看图表和市场分布,管理员可以在后台维护数据、管理用户、查看系统概览,后续如果增加新的品类或新的平台,也有继续扩展的空间。
一、项目定位:把农产品价格信息变成可读的数据资产
农产品价格变化受产地、季节、品种、渠道、促销和店铺策略等多种因素影响。传统价格监测更多依赖批发市场或统计报表,适合宏观观察,但对电商平台中细分品类、具体店铺和实时商品结构的呈现并不充分。电商页面本身已经公开展示了大量信息,只是这些信息分散在商品卡片、详情页和属性区里,人工查看效率很低,也难以持续积累。
因此,这个系统采用“数据采集 + 数据清洗 + MySQL 存储 + SQL 预聚合 + Pyecharts/ECharts 可视化 + MiniBatchKMeans 聚类 + Flask Web 系统”的路线,把网页上的商品信息转化为结构化数据,再围绕关键词、店铺、产地、品种、价格区间、销量区间和聚类标签进行展示。项目目前覆盖多类常见农产品,整理后的有效记录约八千余条,字段包括商品标识、标题、价格、店铺、销量、品种、原产地等,基本能够支撑一次完整的展示型分析。
从使用场景来看,消费者可以借助价格区间和销量分布判断某个品类的大致价位,避免只看单个商品就下结论;经营者可以通过门店排行、产地结构和品种表现观察竞品策略,判断哪些商品适合做引流,哪些商品更适合做利润款;如果用于教学或项目实训,它也能覆盖爬虫、数据库、可视化、后端接口和机器学习等多个知识点,比较适合展示 Python 数据分析项目的完整开发过程。

图 1 电商商品列表与 DOM 结构脱敏展示
二、数据采集:从商品列表到详情页字段补全
数据采集部分使用 DrissionPage 完成。选择这个框架,是因为农产品列表页存在动态加载,单纯请求 HTML 很容易拿不到完整内容;通过浏览器自动化方式,可以更接近真实访问过程,也方便处理分页、等待加载、滚动和详情页跳转。采集流程先从关键词搜索页进入商品列表,通过商品卡片定位商品 ID、标题、价格、店铺和销量,再进入详情页补充品种、原产地等字段。
详情页字段并不是每个商品都完全一致,有的放在属性表格里,有的写在参数区,有的甚至只散落在页面文案中。为了降低空值比例,我在提取时设置了多级策略:优先读取结构化属性区域,如果没有命中,再从页面文本里做规则匹配;仍然无法确认时,再根据常见产地词进行兜底扫描。这样做虽然没有把所有边界情况都解决掉,但能保证绝大部分商品至少拥有可用于后续分析的核心字段。

图 2 商品详情页属性字段脱敏展示
爬虫执行时还加入了日志输出、异常捕获和分页控制。每次切换关键词、打开页面、处理商品或写入文件时都会记录状态,方便在长时间采集过程中定位中断点。采集结果先按关键词保存为 CSV,再进行统一合并,避免单次任务失败影响全部数据。
在实现过程中,我没有追求无限制地扩大采集量,而是更重视字段完整度和样本可用性。农产品页面里常见的重量规格、组合装、礼盒装和产地描述容易混在标题中,如果不做清洗,后面的价格统计会被噪声放大。因此采集阶段只负责尽量稳定地拿到原始信息,真正的标准化处理放到预处理环节完成,这样结构更清楚,也方便后续替换采集源。

图 3 数据采集整体流程示意

图 4 采集日志与 CSV 结果文件脱敏展示
三、数据清洗与入库:先把数据变干净,再谈分析
网页采集得到的数据并不能直接用于建模和图表展示。原始数据里会出现重复商品、异常价格、字段格式不统一、类别过于分散等问题。清洗阶段主要使用 Pandas 完成:先合并多份 CSV,删除重复记录,对价格异常值进行过滤,再把中文字段名统一映射成英文变量,保证后续 SQL、建模和接口调用时不出现命名混乱。
类别字段是这个项目里比较需要处理的一类数据。店铺、品种、产地的取值数量很多,如果全部做独热编码,维度会快速膨胀,聚类结果也容易被极少数样本干扰。因此我把出现次数过低的类别合并为“其他”类,再对销量字段做对数变换,让长尾分布更平滑。这样处理后,数据既保留了主要差异,也减少了噪声。
存储层选择 MySQL。一方面它适合保存清洗后的结构化数据,另一方面也方便通过 SQL 预聚合生成可视化所需的结果表。很多图表如果每次打开页面才临时统计,响应会比较慢;我把关键词统计、店铺价格、产地销量、价格区间等结果提前计算好,前端只需要读取结果表即可,页面加载会稳定得多。
这种“原始表 + 分析结果表”的方式也让系统更容易维护。原始表保留采集后的主体数据,分析表面向图表和接口单独组织,后期如果新增一个图表,只需要补充对应的统计逻辑,不必反复改动用户页面。对于展示型系统来说,稳定的读取速度比临时计算更重要,尤其是大屏页面一次要加载多个模块,预聚合能明显减少等待。

图 5 数据清洗、特征构造与数据库脱敏预览
四、系统结构:用户端看分析,管理员端管数据
Web 部分采用 Flask 搭建,整体功能分成普通用户和管理员两条线。普通用户登录后主要查看各类图表、浏览聚类结果、进入大屏页面,也可以修改个人资料和密码。管理员则多了一套后台维护能力,包括系统概览、商品数据增删改查、用户管理和权限升级。两类角色通过 Session 标记区分,前端菜单和后端接口都围绕权限做了分流。
功能设计上,我没有把所有页面做成完全独立的孤岛,而是尽量保持统一的交互习惯:列表页使用表格分页,筛选条件集中在顶部,新增和编辑使用弹窗表单,删除前设置二次确认。这样用户在一个模块里熟悉操作后,切换到其他模块也不会重新学习一遍。

图 6 用户侧与管理员侧功能流程

图 7 数据库关系结构示意
五、页面实现:从登录入口到后台维护
用户端页面的重点是“直接看结果”。登录成功后,左侧导航按照分析维度组织,包括关键词与文本特征、品种价格与销量、产地价格与销量、门店经营分析、聚类分析和大屏展示等。每个页面嵌入相应的图表,支持鼠标悬停查看数值,也可以通过图例切换部分指标。个人中心保留了基础资料修改入口,便于形成一个完整的 Web 系统,而不是只有图表的静态页面。

图 8 用户端登录、分析页面与个人中心脱敏展示
管理员端主要服务系统维护。后台首页放置数据总量、用户数量、活跃情况和系统负载等概览信息,数据管理页面支持按关键词、品种和产地筛选,并对记录进行新增、编辑和删除。用户管理模块则负责维护普通账号,并提供升级管理员的入口。由于演示图片中包含账号、标题和部分数据细节,整理时已经做了遮挡处理,只保留页面布局和功能效果。

图 9 管理员端概览、数据维护与表单操作脱敏展示
六、可视化分析:让不同维度的市场特征同时呈现
可视化是这个系统最适合展示的部分。后端使用 Pyecharts 生成多种交互图表,前端大屏使用 ECharts 动态渲染核心指标。图表并不是随便堆叠,而是围绕“看品类、看店铺、看产地、看品种、看区间、看组合”六个方向展开。关键词维度可以观察不同品类的样本量、平均价格和平均销量;店铺维度可以比较均价、总销量、商品数量和品种丰富度;产地维度可以看到不同地区的供给占比与销量表现;品种维度则更适合判断细分商品的价格带。
文本特征也被纳入展示。商品标题中大量出现“新鲜”“水果”“现摘”“产地直发”等词,这些词本身就是电商农产品营销的高频表达。词云图虽然不承担严谨建模任务,但非常适合帮助用户快速感受标题风格。热力图、漏斗图和玫瑰图则更适合呈现组合关系和区间分布,例如关键词与品种之间的对应关系、产地与品种的销量组合、价格区间中的商品数量结构等。

图 10 关键词、词云、热力图和价格区间可视化效果
在经营分析层面,门店总销量 TOP、产地商品占比、品种结构占比和销量区间分布能够更直接地服务选品和运营判断。比如某些店铺商品数量不一定最多,但总销量很突出;某些产地在商品数量上占比高,但价格带不一定高;还有一些品类样本不多,却能形成明显的高客单价特征。把这些图表放在一起,就能比单独看一张柱状图更容易形成判断。

图 11 门店、产地、品种和销量区间综合展示
七、可视化大屏:把分散图表整合成展示入口
大屏页面是系统对外展示时最直观的入口。页面顶部集中放置总商品数、全局平均价格、门店数和总销量等核心指标,中间区域展示产地与品种指标表,左右两侧安排关键词统计、门店排行、综合指标和均价销量对比,底部加入标题词云。相比逐页查看图表,大屏更适合演示、汇报和项目展示,能够在一页内体现系统的数据规模、分析维度和视觉效果。
为了让大屏更灵活,我把部分区域做成标签切换,例如关键词分析可以在出现次数、平均价格、平均销量之间切换,均价销量对比也可以按产地或品种查看。这样同一个页面既能保持紧凑,又不会牺牲信息量。实际部署时,如果接入定时采集任务,还可以把大屏改造成近实时更新的价格监测看板。
大屏中的数据并不追求把每个明细都摊开,而是突出关键趋势和结构差异。真正需要查看明细时,管理员可以进入数据维护页面继续筛选;需要快速汇报时,大屏已经足够说明系统能够从多维度读懂农产品电商数据。这种分层展示的方式,也能避免页面既想做管理后台又想做展示看板,最后两边都显得拥挤。

图 12 可视化大屏整体效果脱敏展示
八、聚类分析:给商品打上业务可读的市场标签
仅靠描述性图表,可以知道哪个品类贵、哪个店铺卖得多,但很难回答“这些商品大致可以分成几类”。因此我加入了 MiniBatchKMeans 聚类分析。特征选择上,以价格和销量为核心数值变量,同时加入店铺、品种、产地等类别信息。为了避免类别过散,先合并低频取值,再做独热编码;为了让销量长尾不至于主导全部距离计算,先进行对数处理。
聚类时没有固定写死簇数,而是在候选范围内循环训练,并用轮廓系数选择表现更合适的结果。最终把商品划分为五类:主流稳定商品池、平台爆款引流商品、自营保障型基础生鲜、长尾滞销低转化商品和区域特色农产品。这里的重点不是展示一个抽象编号,而是把聚类结果翻译成运营人员能理解的标签。比如爆款引流类往往价格较低、销量高;长尾低转化类销量中位数很低,需要谨慎备货;区域特色类规模不大,但有产地和品种特色。

图 13 聚类数量、销量中位数与价格中位数对比
散点图能直观看到不同类型商品在价格和销量空间中的位置。爆款类集中在低价高销区域,长尾类大量分布在低销量区域,稳定商品形成中间主体,区域特色商品则更分散。再结合各聚类下的品种和产地 TOP 分布,就能进一步解释这些标签为什么成立。这样的结果可以为消费者比价、商家选品和平台巡查提供一个轻量参考。

图 14 聚类散点、品种分布与产地分布
九、测试与运行:功能能跑通,页面能稳定展示
系统完成后,我分别从用户可见功能和后端逻辑两条线做了测试。登录、注册、数据新增、编辑、删除、条件筛选、图表加载和大屏切换主要用黑盒方式验证;爬虫流程、SQL 查询、聚类计算、数据写入等则结合白盒思路检查代码路径和异常处理。最终用户登录、管理员 CRUD、可视化图表加载和聚类结果展示都能正常运行,页面切换没有明显卡顿。
从实际体验看,这套系统已经可以满足项目展示、课程答辩和基础演示的需求。如果继续完善,可以把采集任务改成定时调度,扩展更多平台和更多品类;算法上可以加入价格预测模型,把系统从“描述当前市场”推进到“判断未来趋势”;前端也可以用 Vue 或 React 重构,进一步提升交互流畅度。
十、项目小结
这个项目最大的收获,是把很多单点技术真正串起来了。爬虫不是采完数据就结束,清洗不是只做一遍表格处理,可视化也不是随便生成几张图。只有当采集、清洗、存储、分析、建模和 Web 展示形成闭环时,数据才会从“文件”变成“系统能力”。农产品价格看似只是一个生活化场景,但它背后涉及信息获取、数据质量、市场结构和用户交互,正好适合作为 Python 数据分析系统的综合练习。
完整资源中还包含运行说明、数据处理脚本、可视化页面、后台管理逻辑和聚类分析结果。感兴趣的朋友可以在此基础上继续扩展价格预测、异常波动预警、跨平台比价、定时采集和多端展示,把它改造成更贴近实际业务的农产品价格监测工具。
每文一语:
真正能沉淀下来的能力,往往来自一次次把想法做成作品的过程。
更多推荐

所有评论(0)