尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Python与MySQL联动的数据分析实战:从热搜评论到可视化全流程

发布时间:2026/9/4 19:45:20

资讯中心
01
ARTICLE

Python与MySQL联动的数据分析实战:从热搜评论到可视化全流程

Python与MySQL联动的数据分析实战:从热搜评论到可视化全流程
这次我们来看一个很适合练手的数据分析实战项目基于 Python MySQL 的泡泡玛特热搜评论数据分析。这类项目的重点不是概念多复杂而是能不能把“数据采集 → 清洗 → 入库 → SQL 分析 → 可视化 → 简历呈现”整条链路跑通。不需要 GPU普通 Windows 笔记本就能完成对正在学 Python 和 MySQL 的同学来说是一个性价比很高的综合练习。先回答最直接的问题这个项目能做什么它通过公开渠道获取泡泡玛特相关热搜词、话题评论等公开数据然后用 Python 做清洗和处理把结构化结果写入 MySQL再通过 SQL 查询不同城市、不同时间、不同话题下的评论分布和情感倾向最终用图表输出分析结论。练完以后你可以把它写进简历“爬虫 数据清洗 MySQL 存储 统计分析 可视化”这套词都能落地不再只是简历上的技术名词。这篇文章会按实际动手的顺序展开先给核心能力速览再说环境准备和 MySQL 建表然后给出 Python 数据清洗入库代码再做 SQL 分析和可视化最后补充简历项目描述怎么写、常见报错怎么排查。文章里的代码和流程不需要你改造太多但数据库密码、文件路径、爬虫采集地址这类信息需要按你自己电脑的环境替换。1. 核心能力速览在动手之前先用一张表把项目底牌看清。能力项说明项目类型Python MySQL 数据分析实战项目技术栈Python 3.8、Requests、Pandas、SQLAlchemy / PyMySQL、Matplotlib / Pyecharts、MySQL 5.7 或 8.0启动方式命令行脚本分步执行不需要 Web 界面也可以完成全流程数据来源公开平台评论、热搜话题等公开数据采集前需确认平台协议和授权范围硬件要求普通笔记本即可CPU 8 核以下不影响学习无需 GPU内存 8G 足够数据库MySQL字符集建议 utf8mb4避免中文乱码接口 API项目核心不强依赖外部 API但可把清洗和分析逻辑封装成 Python 函数批量任务支持多关键词、多页评论循环采集也可以定时批跑主要分析维度评论数量分布、城市分布、时间趋势、Top 话题、简单情感正负判断、关键词词频适合场景Python 入门项目、MySQL 实践、数据分析课程设计、简历项目积累从这张表可以看出它不是重模型、重 GPU 的 AI 项目而是典型的数据分析全流程项目。它的优势在覆盖面广一次练习能把 Python 语法、第三方库安装、文件读写、MySQL 操作、SQL 和可视化全部串起来。2. 项目拆解与简历价值很多同学学完 Python 基础后最困惑的问题是我能做什么MySQL 学了一堆增删改查但不知道在真实项目里怎么用。这个项目刚好把两个问题一起解决。从功能拆分来看整个项目可以分成五个子任务。第一是数据准备。需要确定分析对象例如“泡泡玛特 热搜”“SKULLPANDA 新品”“MOLLY 联名”这类话题下的公开评论。注意我们讨论的是公开数据和个人学习场景不建议大规模爬取、不建议绕过反爬措施、更不建议采集用户手机号等敏感字段。第二是数据清洗。这部分工作量大也是数据分析项目里最容易出细节问题的地方。评论时间去重、空值处理、文本去空格、字段统一格式都是常规操作。第三是数据入库。把清洗后的结果写入 MySQL。这里要重点验证字符集避免中文乱码同时设计好主键和索引。第四是分析取数。通过 SQL 完成分类汇总例如按省份统计评论数、按时间统计评论趋势。第五是结果可视化。用 Matplotlib 或 Pyecharts 做柱状图、折线图和词云把数据库里看起来枯燥的数字变成能直接放进简历或答辩 PPT 的图。从简历价值来说这个项目最大的优点是“可解释性很强”。面试官问你的任何一个点都有实际代码和运行结果可以对应问 Requests 怎么处理反爬你可以说设置了请求头、控制请求频率、用会话保持。问 Pandas 处理过哪些脏数据你可以说评论字段里混有表情符号、缺失省份、异常时间你会统一清洗。问 MySQL 为什么设计这些索引你可以说查询按城市、时间、关键词分组所以给这三个字段建了普通索引。问结果怎么验证你可以说用 SQL 和 Python 分别跑同一统计逻辑结果一致再出图。这套问答逻辑比单纯写一个“学生管理系统”或者“电商订单表”要自然得多也更接近真实业务里数据分析岗的工作方式。3. 适用场景与使用边界这个项目适合四类人。第一类是正在学 Python 基础、想找第一个完整项目的初学者。它的难度曲线比较可控代码量不算大但覆盖的知识面很广。第二类是学完 MySQL 基础、但没做过完整业务表的数据库学习者。通过这个项目可以理解“表结构为什么这么设计”“索引有什么用”“为什么评论内容要用 TEXT”。第三类是准备暑期实习或秋招的数据分析方向同学。它适合作为简历上的“个人项目”因为数据来源有话题性聊起来不会太枯燥。第四类是需要完成 Python 或数据库课程设计的学生。即使不直接使用这个项目也可以把它当作结构参考替换成奶茶店评论、旅游景点评价等主题。使用边界必须说清楚泡泡玛特是真实品牌相关平台数据也有版权和用户隐私属性。做个人学习项目时建议只保留评论正文、城市、时间、话题等非敏感信息不要保存用户真实 ID、手机号、地址等个人字段。公开采集也应当遵守目标平台的 robots 协议、频率限制和用户协议。如果打算发布爬虫代码或分析报告最好把品牌名和数据平台打码处理避免侵权风险。更稳妥的学习方式是自己构造一份模拟评论 CSV 文件先跑通流程再考虑真实数据。4. 环境准备与前置条件这一步不讲虚的先保证所有工具可用。4.1 安装 Python建议使用 Python 3.8 及以上版本。打开命令行输入python --version如果提示找不到命令需要先安装 Python并在安装时勾选“Add Python to PATH”。推荐用虚拟环境隔离项目依赖。不建议把一堆库直接装进全局 Python。mkdir popmart-analysis cd popmart-analysis python -m venv venvWindows 激活虚拟环境venv\Scripts\activatemacOS 或 Linux 激活虚拟环境source venv/bin/activate激活后命令行前缀会出现(venv)后面安装的包只会进入当前环境。4.2 安装 MySQL如果还没有安装 MySQL需要先去官网下载对应系统的 MySQL Community Server。安装时注意三件事记住 root 用户的密码后面 Python 连接数据库要用。端口默认 3306如果被占用可以改成 3307。字符集建议选择 utf8mb4避免后面中文乱码。安装完成后可以用命令行测试是否连接成功mysql -u root -p也可以在 Navicat、DBeaver 或 MySQL Workbench 里连接测试。后面我们用 Python 操作数据库界面工具主要用于检查数据是否入库成功。4.3 安装 Python 依赖创建虚拟环境后执行pip install -U pip pip install pymysql sqlalchemy pandas openpyxl requests beautifulsoup4 python-dotenv matplotlib pyecharts说明一下每个库的用途pymysql纯 Python 实现的 MySQL 驱动用于连接数据库。sqlalchemyORM 工具配合 to_sql 可以把 DataFrame 快速写入数据库。pandas数据清洗核心框架。openpyxl如果数据源是 Excel 文件需要这个库。requests请求公开页面或接口数据。beautifulsoup4解析网页 HTML 文本。python-dotenv读取 .env 配置文件避免把数据库密码写在代码里。matplotlib 和 pyecharts结果可视化。如果公司网络环境慢可以用国内镜像源安装pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple4.4 准备项目目录建议按功能分目录管理别把所有脚本堆在一个文件里。实际维护的时候会清晰很多。popmart-analysis/ ├── venv/ # 虚拟环境 ├── data/ # 原始数据和中间数据 │ ├── raw/ # 采集到的原始 csv / json │ └── cleaned/ # 清洗后的最终 csv ├── scripts/ # Python 脚本 │ ├── config.py # 配置信息 │ ├── 01_fetch_data.py # 采集或生成数据 │ ├── 02_clean_data.py # 数据清洗 │ ├── 03_save_to_mysql.py# 写入 MySQL │ ├── 04_analysis_sql.py # 调用 SQL 分析 │ └── 05_visualize.py # 可视化图表 ├── sql/ # SQL 脚本 │ ├── create_table.sql # 建库建表 │ └── analysis_queries.sql # 分析 SQL ├── output/ # 生成的图片 └── requirements.txt # 依赖清单5. MySQL 建库建表设计数据分析项目里建表不是随便把字段堆进去就行。你需要考虑数据量、查询维度和扩展性。5.1 建库用命令行登录 MySQL 后执行CREATE DATABASE IF NOT EXISTS popmart_analysis DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE popmart_analysis;utf8mb4可以在 MySQL 中正确存储 emoji 表情符号。评论内容里经常有表情使用utf8mb4而不是utf8能省去很多录入报错。5.2 评论数据表设计先设计一张评论明细表。设计时遵守一个原则每行只存事实不存汇总结果。统计结果应该通过 SQL 实时计算而不是单独建一张统计表。CREATE TABLE IF NOT EXISTS hot_comments ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT 主键ID, comment_id VARCHAR(64) DEFAULT NULL COMMENT 平台侧评论ID可能没有, platform VARCHAR(32) DEFAULT NULL COMMENT 来源平台, keyword VARCHAR(64) DEFAULT NULL COMMENT 搜索关键词/话题名, user_nickname VARCHAR(64) DEFAULT NULL COMMENT 用户昵称非敏感字段, province VARCHAR(32) DEFAULT NULL COMMENT 省, city VARCHAR(32) DEFAULT NULL COMMENT 市, comment_time DATETIME DEFAULT NULL COMMENT 评论发布时间, rating DECIMAL(3,1) DEFAULT NULL COMMENT 评分可能为空, comment_content TEXT COMMENT 评论文本, like_num INT DEFAULT 0 COMMENT 点赞数, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 数据入库时间, KEY idx_keyword (keyword), KEY idx_comment_time (comment_time), KEY idx_province (province), KEY idx_city (city) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT泡泡玛特相关话题公开评论表;这里有几个设计点可以写进简历或答辩说明首先comment_content使用 TEXT 类型而不是 VARCHAR(255)。因为一条真实评论可能超过 255 个字符。其次comment_time使用 DATETIME 而不是字符串。这样可以直接用日期函数做趋势分析比如按小时、按天、按月分组。第三索引不是越多越好。这里对 keyword、comment_time、province、city 建普通索引是为了覆盖后续最常见的 group by 查询。id是主键索引自增可以保证插入顺序。第四rating字段设计成 DECIMAL(3,1)可以保存类似 4.5、5.0 的评分。如果来源数据没有评分就留 NULL。5.3 热搜词兴趣表设计除了评论明细通常还需要一张“热搜词表”。它用于记录分析时采集了哪些关键词、热度值多少、出现在什么时间。有了这张表才能在简历里说“我不仅分析评论还维护了一个关键词维度表支持多关键词对比。”CREATE TABLE IF NOT EXISTS hot_search_keywords ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT 主键ID, keyword VARCHAR(64) NOT NULL COMMENT 热搜词, heat_value INT DEFAULT 0 COMMENT 热度值可能没有, query_date DATE DEFAULT NULL COMMENT 查询日期, platform VARCHAR(32) DEFAULT NULL COMMENT 平台, UNIQUE KEY uniq_keyword_date (keyword, query_date) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT热搜词记录表;把关键词和日期做成联合唯一索引是为了避免重复写入同一天同一条热搜数据。批处理重复执行时不会产生重复记录。6. 数据采集与数据文件准备真实企业项目里数据采集会耗费大量时间。这里给出两条路径你可以根据自己情况选择。6.1 路径一直接使用公开 CSV 数据练习如果你是第一次做这个项目不建议一上来就和网站的反爬机制搏斗。可以先构造一份干净的公开评论数据集把重点放在数据清洗、入库和分析上。这里给出一个生成模拟数据的 Python 脚本示例它生成的不是真实评论而是供个人学习测试用import random import pandas as pd from datetime import datetime, timedelta cities [(广东, 深圳), (北京, 北京), (上海, 上海), (浙江, 杭州), (四川, 成都), (湖北, 武汉), (江苏, 南京), (陕西, 西安)] keywords [泡泡玛特, SKULLPANDA, MOLLY, LABUBU] platforms [小红书, 微博, 抖音, 什么值得买] def generate_comments(n300): rows [] base_time datetime.now() - timedelta(days30) for i in range(n): province, city random.choice(cities) content_list [ 这款隐藏款太好看了比预期惊喜, 手感一般不过娃的做工还是不错的, 直播间抽到的感觉很值, 等了一个月才发货体验有点失望, 脸有点瑕疵换了一次货, 盲盒有趣的地方就是拆开之前不知道是什么, 这个系列设计很高级盒子也有质感, 非酋体质抽到重复了伤心, 黄牛太多热门款根本抢不到, 送给朋友的礼物她特别喜欢这款, 收纳盒里又多了一个入坑到现在根本停不下来, 配件容易松动希望能改进一下品控, ] rows.append({ comment_id: fdemo_{i:05d}, platform: random.choice(platforms), keyword: random.choice(keywords), province: province, city: city, comment_time: (base_time timedelta(hoursi * 3)).strftime(%Y-%m-%d %H:%M:%S), rating: random.choice([None, 3.0, 3.5, 4.0, 4.5, 5.0, 5.0]), comment_content: random.choice(content_list), like_num: random.randint(0, 5000), }) return pd.DataFrame(rows) if __name__ __main__: df generate_comments(500) df.to_csv(../data/comment_sample.csv, indexFalse, encodingutf-8-sig) print(df.head())这里没有使用真实用户数据。utf-8-sig编码会让 CSV 在 Excel 打开时不乱码适合后面人工检查数据。6.2 路径二采集公开网页或接口数据如果坚持要完整训练 Requests 技能也可以编写一个基础采集脚本。核心代码模板如下import time import requests import pandas as pd HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36 } def fetch_public_comments(keyword: str, page: int 1): # 注意这里只是示例 URL 结构实际地址需要根据目标平台公开规则确认 url https://example.com/api/public/comments params {keyword: keyword, page: page} resp requests.get(url, paramsparams, headersHEADERS, timeout10) if resp.status_code ! 200: print(f请求失败: {resp.status_code}) return [] data resp.json() return data.get(list, []) if __name__ __main__: result [] for kw in [泡泡玛特, LABUBU 新品]: for p in range(1, 3): items fetch_public_comments(kw, p) result.extend(items) time.sleep(2) # 控制频率避免给对方服务器造成压力 df pd.DataFrame(result) df.to_csv(../data/raw/comments_raw.csv, indexFalse, encodingutf-8-sig)采集时必须注意三点只请求公开接口不绕过登录鉴权。控制频率设置 sleep。只保留分析需要的非敏感字段不保存用户隐私字段。7. Python 数据清洗与入库这一部分是重点也是简历里最好写的内容。因为真实数据往往很脏并不是直接就能入库。7.1 读取数据假设你已经把数据放到了data/comment_sample.csv读取并预览import pandas as pd df pd.read_csv(../data/comment_sample.csv, encodingutf-8-sig) print(df.shape) print(df.info()) print(df.head())代码执行后可以看到 500 行10 列。如果发现列名是英文的后续字段映射需要按实际调整。7.2 数据清洗清洗规则按真实评论场景设计。主要处理空值、重复值、时间格式和文本格式。import pandas as pd df pd.read_csv(../data/comment_sample.csv, encodingutf-8-sig) # 1. 删除完全重复的行 df df.drop_duplicates() # 2. comment_id 为空的行如果也没有正文直接删除 df df.dropna(subset[comment_content]) # 3. 删除评论内容只有空格的假数据 df df[df[comment_content].str.strip() ! ] # 4. 对省份、城市做空值填充 df[province] df[province].fillna(未知) df[city] df[city].fillna(未知) # 5. 时间字段统一格式异常时间置空 df[comment_time] pd.to_datetime(df[comment_time], errorscoerce).dt.strftime(%Y-%m-%d %H:%M:%S) # 6. 点赞数转为数值缺失值填 0 df[like_num] pd.to_numeric(df[like_num], errorscoerce).fillna(0).astype(int) # 7. 去掉评论内容前后空白字符 df[comment_content] df[comment_content].str.strip() print(df.isnull().sum()) print(df.head())需要注意嵌套中的几个点直接用pd.to_datetime时会报错或产生 NaT所以用errorscoerce把无法解析的时间变成空值。str.strip()只能去除首尾空格不会删除中间内容所以相对安全。如果希望代码更规范可以把清洗函数独立出来方便复用和测试。这里提供一个函数版本def clean_comments(df: pd.DataFrame) - pd.DataFrame: df df.drop_duplicates() df df.dropna(subset[comment_content]) df df[df[comment_content].str.strip() ! ] df[province] df[province].fillna(未知) df[city] df[city].fillna(未知) df[comment_time] pd.to_datetime(df[comment_time], errorscoerce).dt.strftime(%Y-%m-%d %H:%M:%S) df[like_num] pd.to_numeric(df[like_num], errorscoerce).fillna(0).astype(int) df[comment_content] df[comment_content].str.strip() return df7.3 使用 SQLAlchemy 写入 MySQL入库之前先检查数据库服务是否启动。如果 MySQL 没有启动Python 连接会报错Cant connect。在项目根目录创建.env文件保存本地数据库连接配置。DB_HOST127.0.0.1 DB_PORT3306 DB_USERroot DB_PASSWORD你的数据库密码 DB_NAMEpopmart_analysis再创建scripts/config.pyimport os from dotenv import load_dotenv load_dotenv() DB_CONFIG { host: os.getenv(DB_HOST, 127.0.0.1), port: int(os.getenv(DB_PORT, 3306)), user: os.getenv(DB_USER, root), password: os.getenv(DB_PASSWORD, ), database: os.getenv(DB_NAME, popmart_analysis), } DB_URL ( fmysqlpymysql://{DB_CONFIG[user]}:{DB_CONFIG[password]} f{DB_CONFIG[host]}:{DB_CONFIG[port]}/{DB_CONFIG[database]} ?charsetutf8mb4 )然后执行写库脚本import pandas as pd from sqlalchemy import create_engine from config import DB_URL df pd.read_csv(../data/comment_sample.csv, encodingutf-8-sig) df clean_comments(df) engine create_engine(DB_URL, echoFalse, pool_size5, pool_recycle3600) df.to_sql( namehot_comments, conengine, if_existsappend, indexFalse, methodmulti, chunksize200, ) print(写入完成)这里if_existsappend表示追加写入不会清空刚才建好的空表。如果希望每次跑项目都从零开始可以把参数改成replace但要注意 replace 会先删表再建表之后注释会丢失。写入完成后在 MySQL 命令行或 Navicat 中执行SELECT COUNT(*) FROM hot_comments;如果返回 500说明入库成功。8. SQL 分析与 Python 可视化写入只是前半段真正能在简历上展示的是分析结果。先设计几个有价值的分析问题哪些话题/关键词讨论量最高评论集中在哪些省份、城市评论时间有没有明显的周内、日内规律评论内容里高频出现哪些词能看出用户关注点简单判断正面、中性、负面的分布情况。8.1 SQL 查询示例8.1.1 关键词热度分布SELECT keyword, COUNT(*) AS comment_cnt FROM hot_comments GROUP BY keyword ORDER BY comment_cnt DESC LIMIT 20;8.1.2 省份评论分布SELECT province, COUNT(*) AS comment_cnt FROM hot_comments GROUP BY province ORDER BY comment_cnt DESC LIMIT 15;8.1.3 评论日期趋势SELECT DATE(comment_time) AS comment_date, COUNT(*) AS comment_cnt FROM hot_comments WHERE comment_time IS NOT NULL GROUP BY DATE(comment_time) ORDER BY comment_date ASC;8.1.4 点赞数 Top 10 评论内容SELECT comment_content, province, city, like_num FROM hot_comments ORDER BY like_num DESC LIMIT 10;这里需要注意WHERE comment_time IS NOT NULL。清洗阶段只是把格式统一如果原始时间本身为空DATE()函数返回 NULL不筛选会导致 NULL 也成为一个分组。8.2 Python 调用 SQL 并出统计表在 Python 里执行 SQL并把结果变成 DataFrameimport pandas as pd from sqlalchemy import create_engine from config import DB_URL engine create_engine(DB_URL) query SELECT province, COUNT(*) AS comment_cnt FROM hot_comments GROUP BY province ORDER BY comment_cnt DESC LIMIT 15; province_stats pd.read_sql(query, conengine) print(province_stats)8.3 简单情感判断与词频统计由于没有复杂标注数据可以在代码里做规则版正负情感判断。这个方法适合学习也方便在简历中说明“用规则字典做情感初筛后续可接大模型优化”。def simple_sentiment(text: str) - int: if not isinstance(text, str): return 0 pos_words [好看, 喜欢, 可爱, 惊喜, 高级, 好抽, 回购, 推荐, 精致, 划算, 满意, 开心, 可爱死了] neg_words [失望, 雷, 差, 重复, 瑕疵, 不值, 翻车, 退坑, 丑, 伤心, 难抽, 后悔, 稀烂] score 0 for w in pos_words: score text.count(w) for w in neg_words: score - text.count(w) if score 0: return 1 if score 0: return -1 return 0 df[sentiment] df[comment_content].apply(simple_sentiment) print(df[sentiment].value_counts())把这列写回 MySQL重新追加一张“评论情感结果表”或者更新原表情感字段都可以。8.4 可视化输出用 matplotlib 出柱状图import matplotlib.pyplot as plt import pandas as pd from sqlalchemy import create_engine from config import DB_URL engine create_engine(DB_URL) df pd.read_sql( SELECT province, COUNT(*) AS comment_cnt FROM hot_comments GROUP BY province ORDER BY comment_cnt DESC LIMIT 10; , conengine) plt.rcParams[font.sans-serif] [SimHei] # 解决中文显示问题 plt.rcParams[axes.unicode_minus] False plt.figure(figsize(10, 6)) plt.bar(df[province], df[comment_cnt], color#FF8C00) plt.title(泡泡玛特相关话题评论省份分布 Top10) plt.xlabel(省份) plt.ylabel(评论数量) plt.tight_layout() plt.savefig(../output/province_top10.png, dpi200) print(图片保存成功)在 Windows 本地画图时中文乱码很常见。SimHei字体一般在 Windows 可用。macOS 上可以改为Arial Unicode MS或PingFang SC。如果中文还乱码需要先查一下本地有哪些中文字体。时间趋势折线图df_trend pd.read_sql( SELECT DATE(comment_time) AS comment_date, COUNT(*) AS comment_cnt FROM hot_comments WHERE comment_time IS NOT NULL GROUP BY DATE(comment_time) ORDER BY comment_date ASC; , conengine) plt.figure(figsize(12, 5)) plt.plot(pd.to_datetime(df_trend[comment_date]), df_trend[comment_cnt], markero) plt.title(评论数量时间趋势) plt.xlabel(日期) plt.ylabel(评论数量) plt.tight_layout() plt.savefig(../output/time_trend.png, dpi200)实战中还可以做词云。需要安装wordcloud和jiebapip install jieba wordcloud词云代码示例import jieba import pandas as pd from wordcloud import WordCloud from sqlalchemy import create_engine from config import DB_URL engine create_engine(DB_URL) df pd.read_sql(SELECT comment_content FROM hot_comments, conengine) text .join(df[comment_content].dropna().astype(str).tolist()) words .join(jieba.lcut(text)) wc WordCloud(font_pathC:/Windows/Fonts/simhei.ttf, width1600, height900, background_colorwhite).generate(words) wc.to_file(../output/comment_wordcloud.png)句子里你会看到simhei.ttf是 Windows 黑体路径。如果你用 macOS需要替换字体路径否则会报错。9. 批量任务与持续更新数据分析项目如果没有批处理能力会显得价值不高。这里加入一个简单的批处理设计。9.1 核心思想让脚本支持从命令行传入关键词和页数每次运行只处理本次任务并将状态写入日志。例如python 01_fetch_comments.py --keywords 泡泡玛特,LABUBU,SKULLPANDA --pages 3Python 侧用argparse接收参数import argparse parser argparse.ArgumentParser(description批量获取公开评论) parser.add_argument(--keywords, typestr, default泡泡玛特, help多个关键词用逗号分隔) parser.add_argument(--pages, typeint, default3, help每个关键词抓取页数) args parser.parse_args() keyword_list [k.strip() for k in args.keywords.split(,) if k.strip()]9.2 批处理执行流程整体流程可以合并成一个run_pipeline.pyfrom 02_clean_data import clean_comments from 03_save_to_mysql import save_to_mysql RAW_PATH data/raw/comments_raw.csv CLEAN_PATH data/cleaned/comments_clean.csv if __name__ __main__: # 假设 01_step 已生成 raw 数据 df pd.read_csv(RAW_PATH, encodingutf-8-sig) df_clean clean_comments(df) df_clean.to_csv(CLEAN_PATH, indexFalse, encodingutf-8-sig) save_to_mysql(df_clean) print(pipeline finished)9.3 定时执行Windows 可以用“任务计划程序”定时跑macOS 或 Linux 可以用 crontab# 每天凌晨 2 点运行项目脚本覆盖当天数据分析 0 2 * * * cd /path/to/popmart-analysis /path/to/venv/bin/python scripts/run_pipeline.py logs/pipeline.log 21对于入门项目定时任务不是必选项但“支持批量关键词、支持计划任务”这一点写到简历里就是加分项。9.4 任务日志和失败重试批量采集时很容易因为网络波动导致某个页失败因此要设计失败重试。通用方式写一个 retry 装饰器。import time from functools import wraps def retry(times: int 3, sleep_seconds: int 2): def decorator(func): wraps(func) def wrapper(*args, **kwargs): for i in range(times): try: return func(*args, **kwargs) except Exception as e: print(f第 {i 1} 次执行失败: {e}) if i times - 1: time.sleep(sleep_seconds) return None return wrapper return decorator retry(times3, sleep_seconds2) def fetch_page(keyword: str, page: int): # 模拟请求逻辑 pass10. 资源占用与性能观察这里的“资源占用”主要指 CPU、内存和磁盘而不是 GPU。这个项目对硬件要求不高但仍建议用系统资源管理器观察三个指标。第一个是 Python 进程的内存占用。pandas 读取大数据量时内存上升会比较明显。学习方法阶段的数据在几百条到几千条基本没有压力。第二个是 MySQL 服务的内存占用。MySQL 默认配置往往偏大在 8G 内存笔记本上可以接受。如果明显卡顿可以看任务管理器里的 mysqld 进程但不要在生产机随便调参。第三个是网络请求的耗时。批量采集时sleep(2)意味着每个页面至少间隔 2 秒这个过程会比较慢。测试时可以先只跑 1 页确认逻辑无误再放开。11. 常见问题与排查方法把最容易踩的坑整理成一张排查表。出问题先看表不要盲目重装。问题现象可能原因排查方式解决方案python命令找不到Python 未加入 PATH在命令行输入where python重新安装 Python 并勾选 Add to PATHpip install超时网络波动或镜像源慢观察报错提示使用清华源或阿里源MySQL 连接失败Cant connectMySQL 服务未启动、端口不对检查服务状态和 3306 端口是否监听启动 MySQL 服务或修改 config 端口Access denied for user rootlocalhost密码错误或用户权限不对在 MySQL 命令行用 root 登录测试确认密码必要时重置密码评论内容中文乱码数据写入时字符集不是 utf8mb4查看表字符集和连接 URL建表时使用 utf8mb4URL 加?charsetutf8mb4DataFrame 写入 MySQL 报错DataError文本超长或类型不兼容查看字段最大长度comment_content用 TEXT连接用 utf8mb4pd.to_datetime报错时间字段包含非法值打印前几行时间列使用errorscoerce将非法值转为 NaT再过滤Matplotlib 中文乱码系统缺少匹配中文字体打印当前字体列表指定SimHei或本机可用中文字体df.to_sql很慢单条插入或网络延迟查看日志和表数据量使用methodmulti和chunksize批量插入频繁跑采集被封请求频率过高、无请求头查看响应码 403/429增大 sleep设置 retry降低并发批处理结果重复没有幂等设计查看数据库中关键词和时间设置唯一索引使用INSERT IGNORE或先删后插额外提醒一个真实项目常见问题用 SQLAlchemy 写入时如果表中已有唯一索引重复数据会触发IntegrityError。简单做法是先查询关键词和日期是否存在再决定 insert 还是 update。12. 简历项目描述怎么写项目做完后简历描述直接影响面试官会不会追问。建议用 STAR 法写包含项目背景、数据规模、操作动作、结果产出。不要造假数据规模写自己实际跑过的数量500 条、5000 条都可以。下面给一个可直接参考的模板。项目名称泡泡玛特相关热搜评论分析系统技术栈Python、Requests、Pandas、PyMySQL、SQLAlchemy、MySQL、Matplotlib/Pyecharts项目描述通过公开渠道采集泡泡玛特相关话题热搜与评论数据使用 Requests 与简洁反爬策略完成多关键词、多页数据获取累计获取公开评论数据 X 条。数据经 Pandas 清洗后写入 MySQL 数据库完成去重、缺失值处理、时间格式统一等操作设计评论明细表与热搜关键词表并建立合适索引。基于 SQL 完成省份分布、时间趋势、关键词热度等分析使用规则字典进行简单情感判断通过 Matplotlib/Pyecharts 输出可视化图表形成可直接阅读的数据分析报告。个人职责负责数据采集模块开发通过配置关键词和分页参数实现批量采集加入请求频率控制与失败重试。负责数据分析全流程脚本封装通用clean_comments()清洗函数支持后续修改字段规则。负责 MySQL 数据表结构设计使用 utf8mb4 字符集存储中文与表情文本建立联合索引控制重复数据。负责输出省份分布图、时间趋势图和词云等可视化结果并将 SQL 分析结果与 Python 统计结果交叉验证。这样写面试官能从中找到无数可以追问的技术点。你需要确保能在本机重跑一遍脚本并解释每一段逻辑。比起只写“熟练使用 Python 和 MySQL”这样一份项目经历要真实、具体得多。13. 一个完整的演练闭环下面给一个最小闭环脚本方便你检查环境是否全部跑通。把下面内容保存为quick_test.py在项目根目录运行。import pandas as pd from sqlalchemy import create_engine # 假设 config.py 在同一目录 from config import DB_URL test_df pd.DataFrame([ { comment_id: test_001, platform: 测试平台, keyword: 泡泡玛特, province: 北京, city: 北京, comment_time: 2024-01-01 10:00:00, rating: 5.0, comment_content: 这是一条测试评论用于验证写入流程, like_num: 10, } ]) engine create_engine(DB_URL) try: test_df.to_sql(hot_comments, conengine, if_existsappend, indexFalse) count_sql SELECT COUNT(*) AS cnt FROM hot_comments WHERE comment_id test_001 result pd.read_sql(count_sql, conengine) print(写入结果:, result[cnt].iloc[0]) except Exception as e: print(写入失败:, e)如果运行后能看到“写入结果: 1”说明 Python 到 MySQL 的连接没问题。接下来再去处理真实数据或业务扩充就有底气了。14. 常见问题之外的边界意识这类项目流行程度很高但做的时候务必守住底线。数据自动化绝不能用来做这些事采集非公开、需要登录权限才能访问的数据抓取用户个人隐私内容并用于二次传播绕过平台验证码或访问频率限制去大规模抓取数据。如果你只是练习 Python 和 MySQL 技术最安全的方式是自己构造一份模拟评论数据或者使用公开而且允许下载的数据集。等整套流程跑熟之后再考虑替换成自己真正能合法获取的数据源。这个顺序既能保证学习效果也能避免技术练习变成侵权事故。15. 下一步可以怎么扩展第一接入可视化大屏。如果把分析结果用 Pyecharts 做成一个简单的 HTML 页面支持数据更新时间项目完整性会更强。第二加入大模型摘要。清洗完评论文本后调用大模型接口对某一批次评论做自动总结和关键词挖掘会让分析结论更有业务价值但要注意文本脱敏和内容合规。第三改成定时增量消费。公司内部做舆情分析一般不是只跑一次可以加一张任务状态表记录每个关键词、每页、每次拉取的状态。第四把清洗和入库逻辑封装成服务。用 FastAPI 写一个 POST 接口内部调用clean_comments和save_to_mysql再统一返回入库数量。这一步可以让项目从“脚本”变成“服务”。如果要写进简历推荐的扩展点是第一和第三。视频直播看板、榜单监控这类关键词在外行眼里会更像真实业务面试时讲起来也更有层次感。总的来说这个项目没有特别难的技术点但胜在完整。从数据到数据库再到图表每一环都真实可验证。卡在环境安装的先解决 Python 和 MySQL卡在入库的先看字符集和连接串卡在分析的多想想你想回答什么问题。把这个项目完整跑通比照着视频敲十遍无关代码有用得多。建议收藏备用动手的时候直接按章节把每一段脚本吃透再改写成自己的版本。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。