尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

基于Streamlit与Spark的汽车销售大数据分析系统全链路实践

基于Streamlit与Spark的汽车销售大数据分析系统全链路实践 这次我们来看一个非常适合计算机毕业设计、课程设计以及大数据入门实践的项目一个基于 Streamlit 的国内汽车销售分析系统。它不是单纯画几个图表的 Demo而是把 Python 爬虫、Hadoop、Spark 和 Streamlit 可视化串成一条完整数据链路的“小中台”项目。你拿到手可以直接演示数据采集、存储、分布式计算和前端交互看板也可以当成毕业设计的骨架往里面继续加功能。先说这个系统最值得关注的几个点数据源通过 Python 爬虫自动抓取国内汽车销量、车型、品牌、价格、地区等公开信息存储层可以对接 HDFS 或本地文件系统计算层使用 Spark 做清洗、聚合、同比环比、品牌排行、价格区间分布等分析展示层全部基于 Streamlit 搭建页面交互流畅不用写前端代码。更关键的是它对硬件要求很低一台 16GB 内存的普通电脑就能跑起来不需要 GPU不需要昂贵服务器。下面我会按“环境准备 → 爬虫采集 → Hadoop 存储 → Spark 分析 → Streamlit 可视化”的顺序带你完整走一遍这套系统的搭建、启动和验证流程。如果你是正在选题的学生或者想快速搭建一个数据分析展示项目的开发者这篇文章可以直接收藏。我会把每个环节的启动方式、可能踩的坑、性能观察方法和常见错误都写清楚。1. 核心能力速览能力项说明项目类型毕业设计 / 课程设计 / 大数据分析演示项目核心功能汽车销量数据采集、批量清洗、分布式分析、可视化看板技术栈Python、Streamlit、Requests/Scrapy 爬虫、Hadoop HDFS、Spark数据来源通过爬虫获取国内汽车销量公开数据需遵守目标站点规则分析维度品牌销量、车型销量、价格区间、地区分布、同比环比、TopN 排行可视化方式Streamlit Web 页面支持图表联动和筛选条件推荐运行环境Windows / Linux / macOS内存 16GB 以上无需 GPU启动方式命令行启动爬虫、Spark 任务和 Streamlit 服务是否支持 API可以通过 Streamlit 后端接口或独立 Flask/FastAPI 封装是否支持批量任务支持爬虫可定时批量抓取Spark 可批量处理历史数据适合人群计算机相关专业学生、数据分析初学者、大数据入门开发者从材料看这套系统的技术选型很典型Python 负责“数据获取和处理脚本”Hadoop 负责“分布式文件存储”Spark 负责“内存计算”Streamlit 负责“交互式展示”。它不对标生产级商业分析平台但作为教学项目、毕设展示和数据分析入门结构非常完整。2. 适用场景与使用边界这类系统最适合三类人。第一类是计算机、大数据、数据科学专业的毕业生。它把爬虫、大数据存储、分布式计算、可视化四个模块全部打通论文和答辩时可以清晰展示每一层的数据流转技术点充分容易写满工作量。第二类是正在做课程设计或实训项目的学生。相比只做一个“爬虫 Flask 网页”的简单系统加入 Hadoop 和 Spark 之后项目技术含量明显提升中期检查和期末演示都更有说服力。第三类是希望快速上手大数据工具链的开发者。通过这个项目可以理解 HDFS 在项目中到底干什么用、Spark 和普通 Pandas 分析有什么区别以及 Streamlit 如何把分析结果变成可交互页面。同时要注意使用边界它是教学演示项目不是生产级系统。如果在真实业务中处理大规模集群数据需要对任务调度、容错、安全、权限做大量增强。爬虫部分必须遵守目标网站的 Robots 协议和合法合规要求。只采集公开数据控制抓取频率不采集个人隐私、不绕过登录验证、不恶意高并发抓取。如果只用单机模式运行 Hadoop 和 Spark分布式优势不明显核心价值在于把整套分布式工具链跑通。可视化看板的实时性取决于数据更新频率。默认是“批处理 定时更新”不是流式计算。3. 环境准备与前置条件这一节先给出一套通用环境检查清单。具体版本以你实际安装为准但建议参考下面的搭配兼容性比较稳。环境项建议要求说明操作系统Windows 10/11、Ubuntu 20.04、macOSWindows 下注意 Hadoop 的本地环境配置Python3.9 或 3.10太新的版本部分第三方库可能尚未适配JDKJDK 1.8 或 JDK 11Hadoop 3.x 通常基于 JDK 8 或 11HadoopHadoop 3.3.x单机伪分布式模式即可跑通SparkSpark 3.3.x需要与 PySpark 版本匹配pip 依赖streamlit、pyspark、requests、pandas、plotly 等按项目 requirements.txt 安装磁盘空间至少 20GB 可用空间包括 Hadoop 数据目录、Spark 临时目录、爬虫数据端口9870HDFS WebUI、8088YARN、8501Streamlit注意避免端口冲突3.1 安装 Python 和依赖库如果你还没有装过 Python先去官网下载安装包。安装时勾选“Add Python to PATH”避免后面命令行找不到 python。# 建议创建虚拟环境避免污染全局环境 python -m venv venv # Windows 激活虚拟环境 venv\Scripts\activate # Linux/macOS 激活虚拟环境 source venv/bin/activate # 安装项目依赖按实际 requirements.txt 安装 pip install -r requirements.txt如果项目没有提供 requirements.txt通用核心依赖可以这样装pip install streamlit pyspark requests pandas plotly beautifulsoup43.2 安装和配置 HadoopHadoop 在这里主要充当分布式文件存储层。毕业设计场景建议用单机伪分布式模式不需要搭多节点集群也能演示 HDFS 的上传、下载和目录管理。从 Apache 官网或镜像站下载 Hadoop 二进制包解压到一个没有空格的路径例如/opt/hadoop或D:\hadoop。需要配置的环境变量主要包含export HADOOP_HOME/opt/hadoop export PATH$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64然后修改 HDFS 核心配置文件让 NameNode 和 DataNode 使用本地目录。伪分布式模式最少要改core-site.xml和hdfs-site.xml。!-- core-site.xml 示例 -- configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property /configuration!-- hdfs-site.xml 示例请按实际路径替换 -- configuration property namedfs.replication/name value1/value /property property namedfs.namenode.name.dir/name value/opt/hadoop/data/namenode/value /property property namedfs.datanode.data.dir/name value/opt/hadoop/data/datanode/value /property /configuration配置完之后格式化 NameNodehdfs namenode -format然后启动 HDFSstart-dfs.sh启动后访问http://localhost:9870能看到 HDFS 文件系统界面就说明 Hadoop 存储层正常。3.3 安装 Spark 和 PySparkSpark 负责对爬虫落地的数据做清洗和分析。同样是单机模式不需要配置集群。下载 Spark 二进制包解压后配置环境变量export SPARK_HOME/opt/spark export PATH$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin安装 PySparkpip install pyspark验证是否可用python -c from pyspark.sql import SparkSession; print(pyspark ok)4. 一键启动服务流程环境准备好之后整套系统的运行流程通常是先启动 HDFS再跑爬虫采集数据接着把数据写入 HDFS然后用 Spark 读取 HDFS 数据完成分析最后通过 Streamlit 展示分析结果。下面给出一套通用启动示例实际路径需要按项目结构替换。4.1 启动 HDFSstart-dfs.sh4.2 启动爬虫采集任务假设项目里的爬虫脚本为crawler/sales_crawler.py运行采集任务python crawler/sales_crawler.py爬虫会生成 CSV 或 JSON 文件保存原始数据。为了保证采集合规和稳定性建议在爬虫脚本里加上请求间隔、超时重试和 User-Agent 伪装。# 示例基于 requests 的通用爬虫框架具体站点需按实际规则修改 import time import random import requests import pandas as pd def fetch_page(url): headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) } try: resp requests.get(url, headersheaders, timeout10) resp.raise_for_status() return resp.text except requests.RequestException as e: print(f请求失败: {e}) return None def fetch_sales_data(urls): data [] for url in urls: html fetch_page(url) # 此处根据目标页面结构解析数据示例直接构造测试数据 if html: row { brand: 示例品牌, model: 示例车型, price: 15.0, sales_volume: 10000, month: 2025-01 } data.append(row) time.sleep(random.uniform(1, 3)) return pd.DataFrame(data) if __name__ __main__: urls [https://example.com/sales] df fetch_sales_data(urls) df.to_csv(data/sales.csv, indexFalse, encodingutf-8) print(爬虫采集完成)4.3 上传数据到 HDFS原始数据落地后把 CSV 上传到 HDFS形成“数据湖”目录。hdfs dfs -mkdir -p /car_sales/raw hdfs dfs -put data/sales.csv /car_sales/raw/sales.csv可以用以下命令确认上传结果hdfs dfs -ls /car_sales/raw如果看到文件列表说明数据已经成功写入 HDFS。4.4 运行 Spark 分析任务项目里通常会有一个analysis/sales_analysis.py脚本用 Spark 读取 HDFS 文件完成清洗、聚合、排名等操作并把结果写回 HDFS 或本地。# 示例PySpark 分析流程实际业务按项目逻辑扩展 from pyspark.sql import SparkSession from pyspark.sql.functions import col, sum, desc spark SparkSession.builder.appName(CarSalesAnalysis).getOrCreate() df spark.read.option(header, True).csv(hdfs://localhost:9000/car_sales/raw/sales.csv) # 简单清洗 df_clean df.dropDuplicates([model, month]).dropna(subset[sales_volume]) # 按品牌聚合销量 brand_sales df_clean.groupBy(brand).agg( sum(col(sales_volume).cast(double)).alias(total_sales) ).orderBy(desc(total_sales)) brand_sales.show() # 写入分析结果 brand_sales.write.mode(overwrite).csv(hdfs://localhost:9000/car_sales/analysis/brand_sales) spark.stop()运行脚本python analysis/sales_analysis.py如果 Spark 任务正常完成控制台会打印品牌销量的聚合结果同时 HDFS 上会生成brand_sales输出目录。4.5 启动 Streamlit 可视化页面Spark 分析结果落盘后启动 Streamlit 应用streamlit run app.py --server.port 8501看到本地地址后在浏览器打开http://localhost:8501即可访问分析看板。如果页面能正常显示说明整套链路已经跑通爬虫采集 → HDFS 存储 → Spark 分析 → Streamlit 展示。这也是这个项目最核心的成果演示路径。5. 功能测试与效果验证项目跑通后还需要逐项验证功能是否正常。下面给出一套测试清单覆盖采集、存储、分析和可视化四个阶段。5.1 爬虫采集功能测试测试目的确认能够抓取到国内汽车销量数据并保存为结构化文件。测试步骤运行爬虫脚本。检查data/sales.csv文件是否生成。用 pandas 读取文件查看字段是否完整。import pandas as pd df pd.read_csv(data/sales.csv) print(df.head()) print(df.shape)判断标准数据行数大于 0字段数量大于 3没有大量空值。常见问题页面结构变化导致解析失败。需要定期更新选择器。请求被目标网站拦截。降低请求频率更换 User-Agent或使用代理池前先确认合规性。编码问题。写入 CSV 时使用encodingutf-8避免中文乱码。5.2 HDFS 存储功能测试测试目的确认数据可以稳定写入和读取 HDFS。测试步骤hdfs dfs -ls /car_sales/raw hdfs dfs -cat /car_sales/raw/sales.csv | head -20判断标准能列出文件能正常输出文件内容。常见问题未启动 HDFS 导致连接失败。运行jps查看 NameNode 和 DataNode 进程是否在。5.3 Spark 分析功能测试测试目的确认 Spark 能从 HDFS 读取数据并完成聚合分析。测试方式先跑一个小的测试数据集确认统计逻辑正确。再跑全量数据观察执行时间。判断标准聚合结果符合预期TopN 排名合理Spark 任务状态显示成功。常见问题内存不足在启动 Spark 任务时通过--driver-memory 2g调整内存。数据类型转换失败原始 CSV 中销量字段可能是字符串需要 cast 成 double。HDFS 路径写错统一使用hdfs://localhost:9000/前缀。5.4 Streamlit 可视化功能测试测试目的验证看板交互、图表展示和筛选功能。测试维度页面是否正常打开。品牌、车型、价格区间等筛选条件是否生效。图表是否随筛选条件联动更新。是否包含销量趋势、品牌占比、价格分布等核心图表。判断标准所有图表正常渲染没有报错日志交互响应快。如果 Streamlit 页面提示找不到数据优先检查 Spark 分析结果是否写入到 Streamlit 预期的读取路径。6. 接口 API 与批量任务这个项目以 Streamlit 可视化为主但可以在 Streamlit 后端封装分析接口或单独起一个 FastAPI/Flask 服务让其他系统也能调用分析结果。6.1 Streamlit 页面加载分析结果Streamlit 页面里通常用 pandas 读取分析结果然后渲染图表和表格。import pandas as pd import plotly.express as px import streamlit as st st.set_page_config(page_title国内汽车销售分析系统, layoutwide) df pd.read_csv(output/brand_sales.csv) brand st.selectbox(选择品牌, df[brand].unique()) filtered df[df[brand] brand] st.subheader(f{brand} 销量趋势) fig px.line(filtered, xmonth, ysales_volume, title月度销量趋势) st.plotly_chart(fig, use_container_widthTrue) st.subheader(品牌销量 Top10) fig_bar px.bar(df.head(10), xbrand, ytotal_sales, title品牌销量排行) st.plotly_chart(fig_bar, use_container_widthTrue)6.2 独立 API 服务示例如果需要把分析结果提供给小程序、App 或第三方系统可以用 FastAPI 包一层 API 服务。pip install fastapi uvicorn# api_server.py 示例 from fastapi import FastAPI import pandas as pd app FastAPI() app.get(/api/brand_sales) def get_brand_sales(): df pd.read_csv(output/brand_sales.csv) return df.to_dict(orientrecords) if __name__ __main__: import uvicorn uvicorn.run(app, host127.0.0.1, port8000)启动python api_server.py测试接口curl http://127.0.0.1:8000/api/brand_salesPython 请求示例import requests url http://127.0.0.1:8000/api/brand_sales response requests.get(url, timeout10) print(response.status_code) print(response.json()[:2])这个能力属于扩展项。如果你想把项目从“演示系统”升级为“可被外部系统调用的分析平台”加上 API 层会很有说服力。6.3 批量任务设计爬虫和 Spark 分析都可以设计成批量任务。爬虫批量策略按月份循环抓取历史数据。使用定时任务crontab 或 Windows 任务计划程序每天执行增量抓取。每次抓取前检查去重字段避免重复数据入库。Spark 批量处理建议将分析逻辑写成函数接收日期参数。通过--date 2025-01这样的参数控制分析范围。输出结果按日期分区写入 HDFS。# 批量任务伪代码框架 import sys date_arg sys.argv[1] if len(sys.argv) 1 else 2025-01 def run_analysis(date_str): print(f开始分析 {date_str} 数据) # 读取指定日期数据 # 执行清洗和聚合 # 写入分区目录批量任务加入日志和失败重试机制后就可以放到后台长期运行。7. 资源占用与性能观察这套系统对硬件的要求不高但还是要知道各个模块大概消耗什么资源方便排查瓶颈。7.1 各模块资源特征模块资源消耗特征观察方式Python 爬虫CPU、网络带宽、少量内存观察任务执行时间和成功率Hadoop HDFS磁盘 IO、内存jps查看进程HDFS WebUI 查看容量Spark 分析内存、CPUSpark WebUI 查看执行计划、Stage 耗时StreamlitCPU、内存页面响应时间、后端日志7.2 内存和 CPU 观察在 Linux 下可以用top或htop查看内存占用top -o %MEM如果内存不足优先调整 Spark 相关参数spark-submit --driver-memory 2g --executor-memory 2g analysis/sales_analysis.pyStreamlit 通常只占几百 MB 内存不同环境和数据量会有差别。启动后可以从任务管理器或系统监视器里观察进程内存变化。7.3 如何降低资源占用爬虫使用单线程加定时器不开高并发。Spark 处理小数据集时可以调小分区数减少任务碎片。HDFS 文件块副本数设置为 1避免副本同步开销。定期清理过期的中间结果文件。7.4 端口和进程管理启动多个服务时端口冲突很常见。可以这样检查端口占用lsof -i :8501 netstat -ano | findstr 8501如果端口被占用Streamlit 启动时更换端口streamlit run app.py --server.port 8502Spark 和 Hadoop 服务如果异常退出会出现进程残留。可用jps查看 Java 进程必要时手动清理残留进程。8. 常见问题与排查方法问题现象可能原因排查方式解决方案HDFS 格式化失败JAVA_HOME 没配置检查java -version和echo $JAVA_HOME正确设置 JDK 路径并重新加载环境变量start-dfs.sh启动后没有 NameNode数据目录损坏jps查看进程查看 Hadoop 日志备份数据后格式化 NameNode爬虫抓取不到数据页面结构变化、请求被拦截打印返回 HTML 前 500 字符更新解析逻辑降低请求频率测试前确认目标站点的访问规则Spark 读取 CSV 数字字段报错字段类型是字符串打印 schema 查看类型使用.cast(double)转换类型Streamlit 页面没有数据Spark 输出路径不对检查页面日志和读取路径确认分析结果写入到 Streamlit 读取的目录Streamlit 启动端口被占用8501 端口被其他进程占用lsof -i :8501更换端口启动pip 安装 pyspark 缓慢包体积大、网络原因换国内镜像源pip install pyspark -i https://pypi.tuna.tsinghua.edu.cn/simpleSpark 任务内存溢出driver/executor 内存不足查看 Spark WebUI 的 Executor 信息增加内存参数调小分区数Hadoop 启动后 WebUI 打不开端口未监听或防火墙限制检查 9870 端口确认服务启动关闭防火墙或放行端口中文乱码编码格式不一致检查文件编码CSV 统一使用utf-8JSON 使用ensure_asciiFalse9. 最佳实践与使用建议9.1 目录结构建议一个清晰的目录能让你在做毕设答辩时更容易讲清楚模块边界。下面是推荐结构car_sales_analysis/ ├── app.py # Streamlit 主应用 ├── crawler/ │ └── sales_crawler.py # 爬虫采集脚本 ├── analysis/ │ └── sales_analysis.py # Spark 分析脚本 ├── data/ │ ├── raw/ # 原始爬虫数据 │ └── output/ # 分析结果输出 ├── config/ │ └── config.yaml # 统一配置文件 ├── requirements.txt └── README.md9.2 开发顺序建议第一次接触这个项目先不要急着跑完整流程。建议按下面的顺序递进先跑通 Streamlit 页面用本地 CSV 假数据渲染图表。再写爬虫把真实数据保存为 CSV。然后接入 Spark用本地文件代替 HDFS跑出聚合结果。最后接入 HDFS验证分布式存储层。这样可以避免一开始就被 Hadoop 环境问题卡住导致挫败感太强。谁都不希望折腾两天连页面都打不开。9.3 数据合规和授权爬虫部分务必注意合规问题。采集公开数据时遵守目标网站的 robots.txt 和服务条款不抓取个人隐私信息不用于商业用途侵犯版权。如果是毕业设计演示建议对数据进行脱敏尤其是涉及经销商、车主等敏感字段时只保留品牌、车型、销量、价格等公开维度的统计信息。9.4 答辩展示建议答辩现场最容易出问题的是网络、环境和演示顺序。提前准备本机保存好完整的虚拟环境和依赖包避免现场重新安装。录制一条完整演示视频作为备用防止现场环境崩溃。先展示 Streamlit 看板再切到命令行展示爬虫和 Spark 任务。准备数据分析结论比如“哪些品牌销量增长最快”“哪个价格区间销量最高”让评委看到你不只是会跑通流程还能解释结果。9.5 批量任务工程化如果想把项目从毕设升级成可以长期运行的 demo建议加上日志系统记录每次爬虫抓取数量、Spark 任务耗时、Streamlit 访问情况。定时调度用 cron 或 APScheduler 定时执行爬虫和分析任务。数据版本管理每次分析结果按日期命名方便回溯。失败告警把异常推送到企业微信、钉钉或邮箱。10. 总结与下一步这个项目最值得尝试的点是把“Python 爬虫 Hadoop Spark Streamlit”完整串成一条数据链路。你不需要一台高配 GPU 服务器也不需要在生产环境里搞复杂集群只要一台普通电脑就能演示一个具有“数据采集、分布式存储、离线计算、交互展示”完整流程的汽车销售分析系统。最先应该验证的功能是把 Streamlit 页面跑起来确认图表能正常显示。然后跑一遍爬虫看看能不能抓到真实数据。接着用 Spark 做一次品牌销量聚合最后把数据落到 HDFS。这四个步骤逐个完成整套系统就具备演示和答辩的完整度了。最容易踩的坑是 Hadoop 环境的搭建和端口冲突。Java 版本不匹配、HDFS 格式化不成功、Spark 读取 HDFS 路径带不带前缀这些细节在实际操作中非常容易出现建议严格按照前面的排查表格逐项核对。后续可以继续扩展的方向包括接入更多数据源比如新能源车销量、乘联会月度数据、各城市上牌量增加预测算法比如用时间序列模型预测下个月销量把 Streamlit 应用部署到服务器上配合 Nginx 提供长期访问服务。这样这套系统就不再只是一个毕业设计而是一个可以持续迭代的数据分析产品原型。
返回列表