ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Python爬虫+Flask+ECharts评论数据分析可视化完整教程

Python爬虫+Flask+ECharts评论数据分析可视化完整教程 如果你正在找 Python 爬虫 Flask ECharts 的组合项目这篇可以直接收藏。这次我们来看一个非常适合毕设、课设、简历项目使用的完整案例以泡泡玛特热搜评论数据为分析对象用 Python3 做数据采集与清洗用 Flask 搭建后端数据接口用 ECharts 在前端做可视化展示。项目不大但把爬虫、数据处理、Web 接口、图表展示整条链路全串起来了适合刚入门数据分析又想出完整作品的同学。先说这个项目最核心的几个特点技术栈轻、启动简单、结构清晰、适合演示。没有复杂分布式依赖不需要高配 GPU在一台普通 Windows 或 macOS 笔记本上就能跑起来。开发环境只需要 Python3、Flask、pandas、requests 这几个基础组件前端用 ECharts 的 CDN 文件即可。从数据采集到页面展示整个闭环一次跑通放在简历里可以直接说明“我独立完成了从爬虫采集到可视化展示的完整数据分析项目”。下面我会按实际开发顺序来拆解这个项目先看核心能力与架构再讲环境准备、数据采集、数据清洗、Flask 接口、ECharts 页面最后给出启动验证流程、常见问题排查和合规提醒。阅读完这篇文章你能独立复刻一个“爬虫 Flask ECharts”的数据分析项目也能把里面的思路迁移到其他品牌数据或商品评论分析场景中。1. 核心能力速览先把项目的核心能力列一个表格方便你快速判断这个项目值不值得做。能力项说明项目类型Python 数据分析 Web 可视化 爬虫教学案例技术栈Python3、requests、pandas、Flask、ECharts主要功能爬取热搜评论数据、清洗统计、接口返回、图表可视化硬件要求普通笔记本即可无 GPU 依赖运行环境Windows / macOS / Linux启动方式命令行启动 Flask 服务是否支持 API支持接口返回 JSON是否支持批量任务支持按相同数据结构批量采集与批量生成统计结果数据存储CSV JSON免去数据库配置适合场景毕业设计、课程设计、数据分析初学、简历项目从技术选型来看这个项目最大的优势是“每个环节都看得见”。Flask 只负责提供数据和页面ECharts 只负责图表渲染pandas 只负责数据处理。模块边界非常清晰也非常适合口述项目原理。2. 项目架构与数据流整个项目的数据流可以拆成四个阶段数据采集使用 Python3 编写采集脚本对目标数据源发起请求获取热搜评论相关的原始数据。数据清洗把采集到的数据用 pandas 做去重、缺失值处理、时间格式化、关键词提取等操作生成一份可用的结构化数据。后端接口Flask 读取清洗后的数据通过路由暴露 JSON 接口同时渲染 HTML 页面。前端展示ECharts 从接口拉取数据生成柱状图、饼图、折线图等可视化结果。用一句话概括爬虫负责把数据拿下来pandas 负责把数据变得干净Flask 负责把数据传出去ECharts 负责把数据画出来。从这个流程可以看出项目中每个知识点都能独立面试爬虫如何控制请求频率pandas 如何处理脏数据Flask 如何设计 RESTful 接口ECharts 如何动态加载数据。即使面试官追问细节你也能展开讲清楚。3. 适用场景与合规边界这个项目的默认定位是学习项目不是生产级采集系统。它适合这几类人准备毕业设计或课程设计的学生需要一套完整可演示的数据分析案例。想转行数据分析岗位需要一个能体现“数据采集 清洗 可视化”能力的简历项目。Python 初学者想在学完基础语法后做一个小而完整的综合练习。前端开发者想了解 Flask 如何提供数据接口可以只关注后端部分。不适合的场景也很明确不要拿它去高频抓取非授权数据不要采集涉及个人隐私、账号信息、未公开接口的内容不要用项目里的爬虫逻辑做商业数据监控。数据合规是现在做爬虫项目最需要注意的部分。如果你要把这个项目用在毕设答辩或公司内部一定要提前确认数据来源是否合法。常见的合规要求包括遵守目标网站的 robots 协议、控制请求频率避免影响对方服务、不采集个人敏感信息、只做个人学习研究使用。在演示阶段建议先用公开数据集或手动构造的模拟数据把全流程跑通需要真实数据时先取得授权再动手。本文下面所有代码只做技术流程演示实际采集请根据你的目标数据源调整并确保已获得授权。4. 环境准备与依赖安装这个项目对环境的依赖非常轻核心要求是安装好 Python3。建议使用 3.8 或更高版本方便 pip 安装依赖。4.1 创建虚拟环境推荐在项目目录下创建独立虚拟环境避免把系统 Python 环境搞乱。mkdir popmart-analysis cd popmart-analysis python -m venv venv激活虚拟环境# Windows venv\Scripts\activate # macOS / Linux source venv/bin/activate看到命令行前面出现(venv)前缀说明虚拟环境已经激活。4.2 安装依赖包项目主要依赖四个库pip install flask pandas requests beautifulsoup4如果你只需要解析 JSON 接口返回的数据不涉及 HTML 解析beautifulsoup4可以省略。但加上它可以让爬虫模块更通用因为很多评论数据并不直接返回 JSON而是藏在 HTML 结构中。安装完成后可以导出依赖清单pip freeze requirements.txt后续换机器部署时用pip install -r requirements.txt就能安装完整环境。4.3 推荐开发工具开发阶段推荐使用 VS Code打开项目目录后可以直接集成终端运行 Python 脚本。Flask 的 debug 模式支持代码修改后自动重启非常适合边写边调试。5. 项目目录设计与数据模型一个清晰的项目目录能让最终效果提升不少。推荐按下面这种方式组织文件popmart-analysis/ ├── venv/ # 虚拟环境 ├── crawler/ │ ├── spider.py # 数据采集脚本 │ └── config.py # 请求头、限速配置 ├── data/ │ ├── raw_comments.csv # 原始采集数据 │ └── processed_comments.csv # 清洗后数据 ├── app.py # Flask 入口 ├── templates/ │ └── index.html # ECharts 可视化页面 ├── requirements.txt └── README.md目录划分原则是爬虫、数据、Web 三层独立。这样后续无论替换数据源还是改前端页面都不会影响其他模块。5.1 示例数据模型为了教学演示我们定义一个通用的评论数据模型。以下字段是教学示例不是真实平台的结构实际开发时需要根据授权数据源做映射调整。字段名含义示例comment_id评论唯一标识C1001user_name用户昵称用户Acomment_text评论内容这个系列颜值很高comment_time评论时间2026-01-15 20:30:00like_count点赞数128topic_name所属热搜话题#泡泡玛特新品#在这个模型基础上后续可以继续扩展情感倾向、评论来源、地区等字段。6. 数据采集模块设计爬虫部分爬虫是整个项目的数据入口。这一段我会给出一套通用采集流程并明确说明在哪里替换成你授权的目标数据源。6.1 通用爬虫流程编写爬虫时的标准动作大致如下设定目标 URL 和请求参数。构造请求头特别是 User-Agent避免被服务端识别为非浏览器请求。发起请求并判断返回状态码。如果返回的是 JSON直接解析如果返回的是 HTML用 BeautifulSoup 提取评论节点。把结果逐条写入 DataFrame并保存为 CSV。6.2 示例代码通用评论采集模板import time import requests import pandas as pd def fetch_comments(api_url, headers, params): 通用评论采集模板实际接口字段需要按数据源调整 try: resp requests.get(api_url, headersheaders, paramsparams, timeout10) resp.raise_for_status() return resp.json() except requests.RequestException as e: print(f请求失败: {e}) return None def save_raw_data(records, file_pathdata/raw_comments.csv): df pd.DataFrame(records) df.to_csv(file_path, indexFalse, encodingutf-8-sig) print(f已保存 {len(df)} 条原始数据到 {file_path}) if __name__ __main__: # 这里替换为已授权的数据源接口 url https://example.com/api/comments headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) } params { keyword: 泡泡玛特, page: 1, page_size: 50 } data fetch_comments(url, headers, params) if data and data in data: save_raw_data(data[data]) else: print(未获取到有效数据)这段代码只演示请求、解析、保存的完整流程。实际使用时需要把https://example.com/api/comments换成你拥有合法授权、且明确了解接口结构的地址。6.3 爬虫限速与重试不要让爬虫以最高速度连续请求。每个请求之间增加 1 到 3 秒随机延时既能降低对方服务器压力也能降低被封风险。import random import time # 每次请求前随机等待 1-3 秒 time.sleep(random.uniform(1, 3))对于失败请求建议做最多 3 次重试。如果连续失败可以先打印日志不要无限重试。7. 数据清洗与特征处理采集到的原始数据通常不会很干净。比如评论时间为空、点赞数不是数字、评论内容里有大量换行和表情符号。这些都需要在分析前处理掉。7.1 基础清洗import pandas as pd def clean_raw_data(raw_path, processed_path): df pd.read_csv(raw_path) # 删除关键字段为空的记录 df.dropna(subset[comment_text, comment_time], inplaceTrue) # 评论时间去重保留最晚的一条 df.drop_duplicates(subset[comment_id], keeplast, inplaceTrue) # 时间字段统一格式 df[comment_time] pd.to_datetime(df[comment_time]) # 点赞数转数值 df[like_count] pd.to_numeric(df[like_count], errorscoerce).fillna(0) # 新增日期字段方便后续按天聚合 df[comment_date] df[comment_time].dt.strftime(%Y-%m-%d) df.to_csv(processed_path, indexFalse, encodingutf-8-sig) print(f清洗完成剩余 {len(df)} 条数据)这里的重点是处理“脏数据”删除空值、去重、类型转换、新增聚合字段。四个操作覆盖了绝大多数数据分析项目里的清洗任务。7.2 统计维度设计完成基础清洗后可以设计几个统计维度供 Flask 接口和 ECharts 使用按日期的评论数量分布用折线图展示。按话题的评论数量排名用柱状图展示。热门评论关键词排行用饼图或词云展示。评论点赞数 Top10用横向柱状图展示。这些统计可以直接用 pandas 的groupby实现date_stats df.groupby(comment_date).size().reset_index(namecomment_count) topic_stats df.groupby(topic_name).size().reset_index(namecomment_count).sort_values(comment_count, ascendingFalse)8. Flask 后端接口设计数据清洗完成后就该让 Flask 把数据“端”出来了。Flask 在项目里承担两个职责渲染 HTML 页面以及提供 JSON 数据接口。8.1 初始化 Flask 项目from flask import Flask, render_template, jsonify import pandas as pd app Flask(__name__) # 启动时加载清洗后的数据 df pd.read_csv(data/processed_comments.csv) app.route(/) def index(): return render_template(index.html) app.route(/api/comments) def comments_api(): records df.head(100).to_dict(orientrecords) return jsonify({ code: 0, message: success, data: records }) app.route(/api/stats/date) def date_stats_api(): result df.groupby(comment_date).size().reset_index(namecomment_count) return jsonify({ code: 0, data: result.to_dict(orientrecords) }) if __name__ __main__: app.run(host127.0.0.1, port5001, debugTrue)注意端口用了 5001。如果你本机的 5000 端口被其他服务占用换成 5001 或 5002 都能避免冲突。8.2 接口设计思路接口设计遵循两个原则返回统一结构code表示状态message表示错误信息data是具体数据。前端拿到后只需要判断code是否为 0。聚合统计在服务端完成前端不需要关心 pandas 逻辑只需要接收已经处理好的统计结果这样 ECharts 的配置会简单很多。8.3 API 调用测试在终端里直接用curl测试接口是否正常curl http://127.0.0.1:5001/api/stats/date正常时你会看到类似下面的 JSON 输出{ code: 0, data: [ { comment_date: 2026-01-15, comment_count: 120 } ] }这说明 Flask 已经把统计数据正确返回给前端。9. ECharts 可视化页面与前后端联动ECharts 负责把统计数据变成图表。这一部分只需要一个 HTML 文件放在templates/index.html中。9.1 页面基础结构!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title泡泡玛特热搜评论数据分析/title script srchttps://cdn.jsdelivr.net/npm/echarts5/script style .chart-box { width: 45%; height: 400px; display: inline-block; margin: 10px; border: 1px solid #f0f0f0; } /style /head body h2泡泡玛特热搜评论数据分析/h2 div iddateChart classchart-box/div div idtopicChart classchart-box/div /body /html9.2 图表渲染逻辑在页面底部加入脚本用fetch从 Flask 接口加载数据再渲染图表。script function initDateChart(containerId, data) { const chart echarts.init(document.getElementById(containerId)); chart.setOption({ title: { text: 评论数量按日期分布 }, tooltip: {}, xAxis: { type: category, data: data.map(item item.comment_date) }, yAxis: { type: value }, series: [{ name: 评论数, type: line, data: data.map(item item.comment_count) }] }); return chart; } fetch(/api/stats/date) .then(res res.json()) .then(res { if (res.code 0) { initDateChart(dateChart, res.data); } }); /script这段代码做了三件事从 Flask 接口拉数据、解析 JSON、把数据映射到 ECharts 的xAxis和series中。只要接口返回结构稳定前端就可以复用这套代码扩展到饼图、柱状图和折线图。9.3 添加饼图如果需要展示话题评论占比可以用type: piescript fetch(/api/stats/topic) .then(res res.json()) .then(res { if (res.code ! 0) return; const chart echarts.init(document.getElementById(topicChart)); chart.setOption({ title: { text: 话题评论占比 }, tooltip: { trigger: item }, series: [{ type: pie, radius: 60%, data: res.data.map(item ({ name: item.topic_name, value: item.comment_count })) }] }); }); /script这里需要 Flask 再提供一个/api/stats/topic接口返回各话题的统计数据。运行后出现饼图和折线图说明前后端已经完成联动。10. 启动服务与功能验证完整运行流程分三步先跑爬虫再跑清洗最后启动 Flask。10.1 启动爬虫采集数据cd popmart-analysis python crawler/spider.py运行成功后data/raw_comments.csv中会出现采集到的原始评论数据。如果只有模拟数据也足够完成后续流程验证。10.2 执行数据清洗python clean.py清洗脚本会读取原始 CSV生成data/processed_comments.csv。检查一下这个文件里是否还有空值、重复数据和错误时间格式。10.3 启动 Flaskpython app.py浏览器访问http://127.0.0.1:5001/能看到页面上的 ECharts 图表。再访问http://127.0.0.1:5001/api/stats/date能直接看到 JSON 数据说明接口服务正常。10.4 验证清单验证项操作预期结果爬虫模块运行crawler/spider.py生成原始 CSV 文件清洗模块运行clean.py生成清洗后 CSV 文件Flask 启动运行app.py控制台显示监听 127.0.0.1:5001页面访问打开http://127.0.0.1:5001/页面出现 ECharts 图表接口测试访问/api/stats/date返回 JSON 统计结果11. 批量处理与接口扩展思路这个项目天然适合扩展批量处理。比如把单次采集改成循环采集多页把单天统计改成多天区间统计。批量处理的关键是要有日志和失败重试机制。for page in range(1, 6): params[page] page try: data fetch_comments(url, headers, params) save_raw_data(data) except Exception as e: print(f第 {page} 页采集失败: {e}) time.sleep(random.uniform(1, 3))接口扩展也很容易。继续在app.py中增加路由即可例如/api/top返回点赞数 Top10/api/sentiment返回情感分析统计。每增加一个接口前端就能多渲染一种图表项目内容就多一层完整度。12. 常见问题与排查方法问题现象可能原因排查方式解决方案启动后页面打不开Flask 未启动或端口被占用检查终端日志、查看端口更换端口重新启动pip install安装失败网络问题或 Python 版本过低查看报错信息更换 pip 镜像源、升级 Python爬虫返回空数据请求头不完整或数据源结构变化打印返回内容调整请求头或解析字段数据清洗后记录数骤减去重或空值删除导致查看原始 CSV 统计调整清洗逻辑ECharts 图表不显示接口数据格式不匹配打开浏览器控制台查看报错打印返回 JSON 并检查字段名fetch跨域报错前端页面跨域请求接口检查 URL 前缀保持前端与 Flask 同端口访问最常见的坑是 Flask 默认开发服务器只监听127.0.0.1如果前端直接打开本地 HTML 文件访问接口容易出现 CORS 或路径问题。建议始终通过http://127.0.0.1:5001/访问页面而不是直接双击 HTML 文件。另一个高频问题是 pandas 读取 CSV 时中文编码乱码。保存时使用utf-8-sig编码读取时显式指定encodingutf-8-sig可以避免大部分中文乱码问题。13. 最佳实践与合规提醒13.1 工程化建议第一次做这个项目时建议先使用模拟数据跑通全流程再考虑接入真实数据源。模拟数据虽然简单但能验证 Flask 接口、ECharts 渲染、pandas 统计这些核心逻辑没有问题。模拟数据跑通了再换成真实数据效率更高。数据文件按data/raw和data/processed分开存放方便对比前后差异。每次清洗前保留原始数据文件避免清洗逻辑写错后无法回滚。Flask 接口建议加上统一的异常处理返回错误时也能保持 JSON 结构一致。这样前端处理接口失败时会简单很多app.errorhandler(404) def not_found(e): return jsonify({code: 404, message: 接口不存在, data: None})13.2 合规提醒关于爬虫和数据使用再强调几点如果你是学生毕设中使用第三方数据前先确认学校要求和数据来源的授权情况。不采集用户姓名、手机号、地址等个人敏感信息只保留做统计分析所需的必要字段。不绕过对方反爬机制去获取非公开数据。本项目仅用于技术学习和功能演示不构成对任何数据源的采集授权建议。涉及商业使用时务必获得数据方明确授权。把项目定位成“数据分析流程演示”和“技能练习”比定位成“批量采集工具”更安全也更容易通过毕业设计审核。14. 总结与下一步这个项目最值得尝试的点是它把 Python 爬虫、pandas 清洗、Flask 后端、ECharts 可视化完整打通了。你可以先验证爬虫和清洗流程能否正常产出数据再验证 Flask 接口能否返回 JSON最后重点看 ECharts 页面能否正确渲染图表。三个环节都通过整个项目就算闭环跑通。最容易踩的坑有三个一是爬虫请求头不完整导致数据获取失败二是 CSV 中文编码乱码三是前后端不同源导致 ECharts 拿不到数据。这三个问题在本文第 12 节都有对应排查思路。后续扩展方向很多可以把 CSV 换成 MySQL 或 SQLite可以加入情感分析模块可以把单页面扩展成多页面的看板系统也可以把 Flask 服务用 Docker 部署。无论选择哪个方向核心流程都不变现有的模块拆分能让你快速叠加新功能。建议收藏备用下一个毕设或简历项目可以直接从这里开始。
返回列表