ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python+MySQL实战:泡泡玛特评论数据分析项目全解析

Python+MySQL实战:泡泡玛特评论数据分析项目全解析 如果你正在学 Python 和 MySQL想找一个“能写进简历、又不烂大街”的数据分析入门项目这次的泡泡玛特热搜评论数据分析项目是一个很值得跟练的完整案例。它不只是一次爬虫实验而是一条覆盖“数据采集 → 数据清洗 → MySQL 存储 → 数据分析 → 可视化”的完整链路。练完之后你简历上的项目描述不会是“熟悉 Python 基础”而是“能独立完成数据采集、入库、分析和可视化的数据处理项目”。这个项目的核心价值在于数据对象明确泡泡玛特热搜与评论业务问题清楚用户都在讨论什么、情绪是正面的还是负面的、热度什么时候最高技术栈又正好命中招聘 JD 里最高频的 Python MySQL 组合。整条链路跑通之后你既能说清楚数据表怎么设计也能应付面试官关于“爬虫反爬、数据清洗、SQL 去重、情感分析”的连环追问。下面我会从项目设计开始按真实开发顺序把每个模块的代码、表结构、实现思路和验证方式都展开。你可以把它当教程跟做也可以直接把它拆成简历里的项目素材。1. 项目能给你带来什么先说结论这个项目的完成度是“小但完整”。它不依赖大数据平台不依赖高配置服务器一台普通 Windows 笔记本就能跑。用到的核心技能点如下能力模块涉及技术简历呈现点数据采集Python requests、正则表达式、JSON 解析能编写爬虫脚本采集公开网页数据数据清洗Pandas、NumPy能处理缺失值、去重、文本规范化数据存储MySQL、PyMySQL、SQL 建表能设计关系型数据表并完成数据持久化数据分析Jieba 分词、SnowNLP、统计分组能做词频统计、情感倾向分析和趋势分析数据可视化Pyecharts、WordCloud能输出柱状图、折线图、词云等可视化结果工程规范模块化、日志、异常处理、限速能写出结构清晰、可维护的脚本对你来说最大的收获是简历上可以写出一条非常具体的项目经验“采集某品牌热搜评论数据 X 条完成清洗入库分析用户关注点与情感倾向产出可视化报告”。这句话对应的正是招聘要求里常见的“熟悉 Python、MySQL有数据分析经验”。2. 项目整体设计项目启动前先想清楚数据从哪来、存到哪、分析什么、输出什么。2.1 数据流设计热搜数据采集 → 评论数据采集 → Pandas 数据清洗 → MySQL 入库 → 数据分析 → 可视化报告流程拆开看采集热搜词列表和热度值。根据热搜词去采集对应的评论内容、发布时间、点赞数。用 Pandas 做去重、空值处理、时间格式统一。把清洗后的数据写入 MySQL。对 MySQL 中的数据做分组统计、情感分析、分词提取关键词。用 Pyecharts 生成图表形成一份完整分析结论。2.2 目录结构建议把项目按模块拆分方便维护和后期扩展popmart-analysis/ ├── config.py # 数据库配置、请求配置 ├── database.py # MySQL 连接与建表逻辑 ├── crawler_hot.py # 热搜词采集 ├── crawler_comment.py # 评论数据采集 ├── clean_data.py # 数据清洗 ├── analysis.py # 数据分析逻辑 ├── visualize.py # 可视化图表输出 ├── sql/ │ └── init.sql # 手动初始化建库脚本 ├── data/ │ ├── raw/ # 原始数据 CSV │ └── cleaned/ # 清洗后数据 CSV └── output/ # 图表输出目录模块化之后每个文件职责单一后期改清洗逻辑不用动爬虫代码也能在简历里写上“按模块化思路组织项目代码”。3. 技术栈与环境准备这是一个纯 Python MySQL 的项目不依赖 GPU普通办公电脑都可以跑。你只需要准备三样东西Python 环境、MySQL 数据库、代码编辑器。3.1 Python 版本与依赖库推荐 Python 3.9 及以上版本。安装依赖库pip install requests pandas pymysql jieba snownlp pyecharts wordcloud matplotlib如果只是先跑通流程也可以按需安装。下面简单说明每个库的用途库用途requests发送 HTTP 请求获取网页或接口数据pandas数据清洗、去重、透视统计pymysqlPython 连接并操作 MySQLjieba中文分词提取评论关键词snownlp中文文本情感倾向分析pyecharts生成交互式图表wordcloud生成词云图matplotlib生成基础统计图3.2 MySQL 环境准备你需要一个本机 MySQL 服务。如果没有安装可以参考 MySQL 8.x 安装教程完成安装安装后记住 root 密码。为了不让数据库配置信息散落在代码里单独建立一个config.py文件# config.py DB_CONFIG { host: 127.0.0.1, port: 3306, user: root, password: your_password, charset: utf8mb4 } DB_NAME popmart_analysis REQUEST_HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Accept: application/json, text/plain, */* } REQUEST_INTERVAL 2 # 请求间隔单位秒降低对方服务器压力这里有一个容易被忽略的点数据库字符集要使用utf8mb4因为评论内容可能包含 emoji 和特殊符号老版本utf8字符集会报错或丢失字符。3.3 编辑器推荐VS Code 或 PyCharm 都可以。用 VS Code 的话安装 Python 插件后可以直接在终端里运行脚本调试断点也很方便。启动脚本时注意先在终端激活虚拟环境python -m venv venv venv\Scripts\activate # Windows source venv/bin/activate # macOS / Linux4. MySQL 数据库与表结构设计先启动 MySQL然后建库。可以在命令行工具中执行也可以用 Navicat 等客户端执行。下面给出完整的初始化 SQL。4.1 创建数据库CREATE DATABASE IF NOT EXISTS popmart_analysis DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE popmart_analysis;4.2 热搜表热搜表保存采集到的热搜词和热度值。核心字段包括热搜词、热度、排名、采集时间。CREATE TABLE hot_topics ( id INT AUTO_INCREMENT PRIMARY KEY, topic_name VARCHAR(255) NOT NULL COMMENT 热搜词, heat_value VARCHAR(64) COMMENT 热度值, rank_no INT COMMENT 当时排名, crawl_time DATETIME COMMENT 采集时间, UNIQUE KEY uk_topic_time (topic_name, crawl_time) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT热搜记录表;这里对(topic_name, crawl_time)加唯一索引是为了避免同一次采集任务重复运行产生重复记录。4.3 评论表评论表需要保存评论正文、发布时间、点赞数、回复数以及从属于哪个热搜主题。CREATE TABLE topic_comments ( id INT AUTO_INCREMENT PRIMARY KEY, topic_id INT NOT NULL COMMENT 关联热搜ID, comment_id VARCHAR(128) COMMENT 评论唯一ID, nickname VARCHAR(128) COMMENT 用户昵称入库前脱敏, content TEXT COMMENT 评论正文, comment_time DATETIME COMMENT 评论发布时间, like_count INT DEFAULT 0 COMMENT 点赞数, reply_count INT DEFAULT 0 COMMENT 回复数, crawl_time DATETIME COMMENT 采集时间, UNIQUE KEY uk_comment (comment_id), KEY idx_topic (topic_id), KEY idx_time (comment_time), CONSTRAINT fk_topic FOREIGN KEY (topic_id) REFERENCES hot_topics(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT评论数据表;唯一约束放在comment_id上这样重复执行采集脚本不会把同一条评论插入两遍。topic_id外键用来关联热搜词方便之后按主题维度做分析。5. 数据采集模块数据采集是这个项目最先执行的模块。在写爬虫前必须明确一个原则只采集公开可访问的数据并设置合理请求间隔。不要在短时间内高频请求不要尝试绕过对方的风控机制。本文演示的是学习环境下的通用采集思路具体平台页面结构可能变化代码需要按实际响应结果调整。5.1 请求工具函数为了让代码更健壮先封装一个带超时和重试的请求函数。采集评论这类动态页面时通常需要通过网页后台接口请求数据。下面的代码演示了通用请求流程# database.py 先给出数据库连接便于后续入库 import pymysql from config import DB_CONFIG, DB_NAME def get_connection(): conn pymysql.connect( hostDB_CONFIG[host], portDB_CONFIG[port], userDB_CONFIG[user], passwordDB_CONFIG[password], databaseDB_NAME, charsetDB_CONFIG[charset], cursorclasspymysql.cursors.DictCursor ) return conn def init_database(): conn pymysql.connect( hostDB_CONFIG[host], portDB_CONFIG[port], userDB_CONFIG[user], passwordDB_CONFIG[password], charsetDB_CONFIG[charset] ) try: with conn.cursor() as cursor: cursor.execute( fCREATE DATABASE IF NOT EXISTS {DB_NAME} DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ) conn.commit() print(数据库初始化成功) finally: conn.close()这里把连接和初始化分开后续清洗入库时直接调用get_connection()即可。5.2 热搜词采集热搜数据的采集核心是从热搜页面或接口解析出“关键词 热度”列表。不同平台的热搜页面结构不同可能是 HTML也可能是 JSON 接口。通用策略是先请求页面再用正则或 JSON 提取。下面给出一段通用示例用于说明采集逻辑并预留解析函数位置。实际写代码时你需要根据页面结构调整parse_hot_data内的解析规则。import requests import time import json from config import REQUEST_HEADERS, REQUEST_INTERVAL def fetch_hot_topics(): url https://example.com/api/hot # 示例接口按实际修改 resp requests.get(url, headersREQUEST_HEADERS, timeout10) resp.raise_for_status() data resp.json() return parse_hot_data(data) def parse_hot_data(data): topics [] # 此处根据实际返回结构编写解析逻辑 # 以下仅为格式示例字段名需按真实接口调整 for item in data.get(data, []): topics.append({ topic_name: item.get(word), heat_value: item.get(heat), rank_no: item.get(rank) }) return topics def save_hot_topics(topics): from database import get_connection conn get_connection() try: with conn.cursor() as cursor: sql INSERT INTO hot_topics (topic_name, heat_value, rank_no, crawl_time) VALUES (%s, %s, %s, NOW()) for topic in topics: cursor.execute(sql, ( topic[topic_name], topic[heat_value], topic[rank_no] )) conn.commit() print(f热搜入库成功共 {len(topics)} 条) except Exception as e: print(热搜入库失败, e) conn.rollback() finally: conn.close() if __name__ __main__: topics fetch_hot_topics() save_hot_topics(topics)在写真实爬虫时热搜接口的返回字段名需要通过浏览器开发者工具去确认。打开开发者工具的网络面板刷新页面找到返回热搜数据的请求在响应里查看字段结构即可。5.3 评论数据采集评论采集比热搜采集更依赖接口参数一般需要关注三个信息主题标识、分页参数、评论排序方式。每条评论通常包含评论 ID、用户昵称、评论正文、发布时间、点赞数和回复数。这里要特别注意用户隐私。昵称和评论内容属于个人信息项目练习阶段应做脱敏处理。比较稳妥的方式是只保存分析需要的字段不保存与话题无关的个人隐私。下面的代码在存储前会对 nickname 做脱敏import requests import time from config import REQUEST_HEADERS, REQUEST_INTERVAL def mask_nickname(nickname): if not nickname: return if len(nickname) 1: return * return nickname[0] * * (len(nickname) - 1) def fetch_comments(topic_id, page1): url https://example.com/api/comments # 示例接口按实际修改 params { topic_id: topic_id, page: page, page_size: 20 } resp requests.get(url, headersREQUEST_HEADERS, paramsparams, timeout10) resp.raise_for_status() data resp.json() results [] for item in data.get(comments, []): results.append({ topic_id: topic_id, comment_id: str(item.get(comment_id)), nickname: mask_nickname(item.get(nickname, )), content: item.get(content, ).strip(), comment_time: item.get(time), like_count: int(item.get(like_count, 0)), reply_count: int(item.get(reply_count, 0)) }) return results def save_comments(comments): from database import get_connection conn get_connection() try: with conn.cursor() as cursor: sql INSERT IGNORE INTO topic_comments (topic_id, comment_id, nickname, content, comment_time, like_count, reply_count, crawl_time) VALUES (%s, %s, %s, %s, %s, %s, %s, NOW()) for c in comments: cursor.execute(sql, ( c[topic_id], c[comment_id], c[nickname], c[content], c[comment_time], c[like_count], c[reply_count] )) conn.commit() print(f评论入库成功共 {len(comments)} 条) except Exception as e: print(评论入库失败, e) conn.rollback() finally: conn.close() if __name__ __main__: # 示例抓取第1页 comments fetch_comments(topic_id1, page1) save_comments(comments) time.sleep(REQUEST_INTERVAL)INSERT IGNORE配合comment_id的唯一索引可以在重复采集时自动忽略已存在的记录。这是爬虫脚本重复运行时非常实用的设计。6. 数据清洗与预处理爬下来的数据往往存在重复、空值、乱码、时间格式不一致等问题。如果直接分析结果会有偏差所以要先做清洗。清洗模块使用 Pandas 完成。清洗任务主要有四步读取数据。删除重复评论。删除空评论或无效评论。统一时间格式并生成日期和小时字段。6.1 MySQL 数据读取import pandas as pd from database import get_connection def load_data_from_mysql(): conn get_connection() sql SELECT t.topic_name, c.content, c.comment_time, c.like_count FROM topic_comments c JOIN hot_topics t ON c.topic_id t.id df pd.read_sql(sql, conn) conn.close() return df使用pd.read_sql可以把 SQL 查询结果直接变成 DataFrame后续清洗很方便。6.2 清洗逻辑def clean_data(df): df df.drop_duplicates(subset[content, comment_time], keepfirst) df df.dropna(subset[content]) df df[df[content].str.strip() ! ] df df[df[content].str.len() 2] df[comment_time] pd.to_datetime(df[comment_time], errorscoerce) df df.dropna(subset[comment_time]) df[date] df[comment_time].dt.date df[hour] df[comment_time].dt.hour df[like_count] pd.to_numeric(df[like_count], errorscoerce).fillna(0) df df[df[content].str.contains(回复|举报|转发, naFalse) False] return df if __name__ __main__: df load_data_from_mysql() print(清洗前数据量, len(df)) df clean_data(df) print(清洗后数据量, len(df)) df.to_csv(data/cleaned/comments_clean.csv, indexFalse, encodingutf-8-sig)清洗完以后导出为utf-8-sig编码的 CSV可以避免 Excel 打开中文乱码的问题。6.3 手动验证清洗结果清洗完成后可以随机打印几条数据确认内容没有明显问题df pd.read_csv(data/cleaned/comments_clean.csv) print(df.head(10)) print(评论总数, len(df)) print(点赞数最高top5) print(df.nlargest(5, like_count)[[content, like_count]])这里如果没有报错、字段完整、时间能正常解析说明清洗环节过关。最容易出现的问题是时间字段格式混杂碰到这种情况可以用errorscoerce把非法时间转成NaT再统一删除。7. 数据分析与可视化数据清洗和入库都完成后进入分析阶段。分析的方向不需要太复杂但一定要能回答业务问题。围绕泡泡玛特热搜评论我建议从四个角度展开。7.1 高频关键词分析先使用 Jieba 分词把所有评论内容拆成词再用停用词过滤掉“的、了、就是、这个”等无意义词最后统计出现次数。import jieba from collections import Counter def get_top_keywords(text_list, top_n30): stopwords set() with open(stopwords.txt, r, encodingutf-8) as f: for line in f: stopwords.add(line.strip()) counter Counter() for text in text_list: words jieba.lcut(text) for word in words: word word.strip() if len(word) 2: continue if word in stopwords: continue counter[word] 1 return counter.most_common(top_n) if __name__ __main__: df pd.read_csv(data/cleaned/comments_clean.csv) keywords get_top_keywords(df[content].tolist()) for word, count in keywords: print(word, count)运行后你会看到类似“盲盒、隐藏款、手感、端盒、联名、品控、发货、退换”这类词。这些词就是用户讨论的核心焦点也是后续生成词云的数据来源。分析结论可以直接写成“评论中高频出现盲盒、隐藏款、手感、品控等关键词说明用户最关注抽盒体验与产品质量。”7.2 词云可视化词云图适合展示关键词分布。使用 WordCloud 库可以直接把分词结果可视化。from wordcloud import WordCloud import matplotlib.pyplot as plt from collections import Counter def generate_wordcloud(df, output_pathoutput/comments_wordcloud.png): text .join(df[content].tolist()) wordcloud WordCloud( font_pathmsyh.ttc, # Windows 可用微软雅黑macOS 需要换成中文字体路径 width1200, height800, background_colorwhite, max_words200 ).generate(text) plt.figure(figsize(12, 8)) plt.imshow(wordcloud, interpolationbilinear) plt.axis(off) plt.savefig(output_path, dpi150) print(词云已保存到, output_path) if __name__ __main__: df pd.read_csv(data/cleaned/comments_clean.csv) generate_wordcloud(df)注意中文字体路径。Windows 系统常用msyh.ttcmacOS 可以尝试/System/Library/Fonts/PingFang.ttc或STHeiti Medium.ttc。如果词云出现方块乱码几乎都是字体路径问题。7.3 评论时间趋势分析把评论按日期分组统计每天评论数量可以看讨论热度的变化趋势。这个指标适合配合热搜事件一起看。import pandas as pd from pyecharts.charts import Line from pyecharts import options as opts def trend_analysis(df, output_pathoutput/comment_trend.html): trend df.groupby(date).size().reset_index(namecount) trend[date] trend[date].astype(str) line ( Line() .add_xaxis(trend[date].tolist()) .add_yaxis(评论数量, trend[count].tolist(), is_smoothTrue) .set_global_opts( title_optsopts.TitleOpts(title评论数量时间趋势), xaxis_optsopts.AxisOpts(axislabel_optsopts.LabelOpts(rotate45)), yaxis_optsopts.AxisOpts(name评论数) ) ) line.render(output_path) print(趋势图已保存到, output_path) if __name__ __main__: df pd.read_csv(data/cleaned/comments_clean.csv, parse_dates[comment_time]) trend_analysis(df)如果发现某一天评论数量出现明显峰值可以回到 MySQL 里查当天热搜词看看是哪个具体话题带动了讨论。这种关联分析在面试中很加分能体现你从数据到业务的理解能力。7.4 点赞数分布与高赞评论点赞数能从侧面反映评论质量。分析点赞数最高的一批评论能帮你判断用户认同什么样的观点。可以用 Pyecharts 生成柱状图展示 Top 20 高赞评论的关键词或主题。from pyecharts.charts import Bar def like_top_analysis(df, output_pathoutput/top_like_comments.html): top_df df.nlargest(20, like_count)[[content, like_count, topic_name]] top_df top_df.sort_values(like_count) bar ( Bar() .add_xaxis(top_df[content].str[:12].tolist()) .add_yaxis(点赞数, top_df[like_count].tolist()) .set_global_opts( title_optsopts.TitleOpts(title高赞评论 Top20), xaxis_optsopts.AxisOpts(axislabel_optsopts.LabelOpts(rotate30)) ) ) bar.render(output_path) print(高赞评论图已保存到, output_path)高赞评论内容往往更典型。比如“蹲一个手感分享”“今天端盒出了隐藏款”“品控真的要加强”这几类评论点赞高说明社区关注点集中在攻略分享、抽盒体验和产品质量反馈上。7.5 情感倾向分析情感分析可以用 SnowNLP 完成。SnowNLP 的默认模型偏向电商评论语料对泡泡玛特这类潮玩评论的效果不一定很精准但作为整体情绪分布参考是够用的。使用方法如下from snownlp import SnowNLP def sentiment_analysis(df, output_pathoutput/sentiment.html): def get_sentiment(text): try: return SnowNLP(text).sentiments except Exception: return 0.5 df[sentiment_score] df[content].apply(get_sentiment) df[sentiment_type] pd.cut( df[sentiment_score], bins[0, 0.4, 0.6, 1.0], labels[负面, 中性, 正面] ) senti_count df[sentiment_type].value_counts() print(senti_count) # 输出正负样本各5条方便人工核对 print(正面评论示例) print(df[df[sentiment_type] 正面][content].head(5)) print(负面评论示例) print(df[df[sentiment_type] 负面][content].head(5)) df.to_csv(data/cleaned/comments_sentiment.csv, indexFalse, encodingutf-8-sig)运行结果可以写入项目报告例如“抽取 N 条评论进行情感分析正面与中性评论占比约 X%负面评论主要围绕品控、缺货、难抽等话题”。如果数据量有限不建议用百分比下太绝对的结论建议带上样本数量和采集时间段。8. 把项目写进简历做完项目只是第一步写好简历同样重要。建议不要直接在简历里写“做过泡泡玛特数据分析”而是用 STAR 结构把项目背景、动作和成果量化出来。8.1 项目描述模板项目名称基于 Python MySQL 的社交媒体评论数据分析 项目背景 以潮玩品牌相关热搜评论为分析对象研究用户关注话题与情绪倾向形成可读的数据分析报告。 技术栈 Python、Requests、Pandas、PyMySQL、Jieba、SnowNLP、Pyecharts 个人职责 1. 编写爬虫脚本采集热搜词和评论数据设计请求间隔与异常重试机制完成 X 条有效评论的采集与入库 2. 设计 MySQL 数据库表结构通过唯一索引与 INSERT IGNORE 避免重复数据 3. 使用 Pandas 完成缺失值处理、评论去重、时间规范化等清洗工作形成可复用清洗脚本 4. 基于清洗数据完成高频关键词、评论时间趋势、情感倾向分析 5. 使用 Pyecharts 与 WordCloud 输出词云、折线图、柱状图等可视化结果。 项目成果 1. 沉淀一套从采集、清洗到入库分析的完整 Python 脚本 2. 形成一份包含趋势图、词云、高赞评论和情感分布的总结报告 3. 掌握 MySQL 表设计、去重策略和 SQL 联表查询的工程实践。写简历时把X替换成实际采集到的有效评论数量。数据量不用担心500 条以上的样本足以支撑一次课程级别的分析项目。8.2 面试官可能追问的问题面试官看到这个项目后大概率会追问这些问题你需要提前准备好答案。问题 1你在爬虫过程中遇到反爬虫怎么办这是一个开放性问题回答要点是思路清晰。你可以说首先控制请求频率设置合理的time.sleep其次在请求头中携带完整的 User-Agent如果遇到验证码或登录限制优先评估数据是否可以替换为公开接口或静态页面数据。核心是遵循平台规则合理、适度地采集公开数据。问题 2为什么评论表要设置 comment_id 唯一索引因为爬虫脚本可能因为中断、重试等原因重复执行。如果没有唯一索引同一条评论会被插入多次导致后续统计数量虚高。设置唯一索引后配合INSERT IGNORE重复数据会被数据库直接拒绝。问题 3你如何处理评论中的脏数据可以从三个层面回答内容层面删除空字符串、长度不足的文本和包含“转发”“回复”的无效内容结构层面统一时间格式、把点赞数转成数值类型删除缺失时间的记录重复层面用内容和时间字段组合去重。问题 4情感分析评分准不准说实话。可以说 SnowNLP 默认模型存在一定误差尤其是对“端盒”“隐藏款”这类潮玩黑话不敏感。但作为整体情绪倾向的参考是够用的。如果后续需要更高精度可以人工标注几百条评论用微调或规则补充的方式优化。问题 5如果数据量从几千条变成几千万条你的方案要做什么调整可以回答采集层引入代理池和分布式任务队列存储层把单表改成按时间分表或引入数仓工具分析层把 Pandas 改成 Spark 或 ClickHouse调度层增加 airflow 等任务编排工具。并不要求你真的搭过这些系统但能说清楚改造方向会显得你有架构意识。9. 项目运行流程与验证方式为了确认整条链路能顺畅跑通这里给出一整套运行顺序。建议第一次运行时每一步都打印日志确认结果再进下一步。9.1 完整运行流程# 第1步初始化数据库 python database.py # 第2步采集热搜词 python crawler_hot.py # 第3步根据热搜词采集评论 python crawler_comment.py # 第4步读取 MySQL 数据并清洗 python clean_data.py # 第5步运行分析与可视化 python analysis.py python visualize.py如果是完整的自动化任务还可以用一个run.py把以上脚本串起来并增加日志记录功能。9.2 成功标准运行结束之后用下面几条标准检查项目是否成功hot_topics表中有热搜记录且没有重复。topic_comments表中有评论记录content字段不为空。清洗脚本能正常读取 MySQL 数据输出去重后的 CSV 文件。词云和折线图能正常打开且中文显示正常。情感分析能输出“正面、中性、负面”的比例分布。如果以上都能满足这个项目就可以作为一份完整的作品集内容。10. 常见问题与排查方法项目运行过程中最容易踩坑的地方集中在数据库连接、编码、依赖缺失和中文显示上。问题现象可能原因排查方式解决方案ModuleNotFoundError: No module named pymysql依赖库未安装检查 pip listpip install pymysqlAccess denied for user rootlocalhostMySQL 账号密码错误在命令行测试登录修改 config.py 中密码Unknown database popmart_analysis未执行初始化脚本查询数据库列表先执行CREATE DATABASE中文乱码表字符集不是 utf8mb4查看建表 SQL重建表并设置utf8mb4Incorrect string value评论包含 emoji检查连接字符集确保连接使用utf8mb4爬虫请求超时网络异常或被限制查看异常堆栈增加超时时间和重试降低请求频率Excel 打开 CSV 中文乱码CSV 编码问题查看文件编码导出时使用utf-8-sig词云中文显示为方块字体路径问题查看程序日志改成系统存在的正确中文字体评论数据始终为 0页面结构变化或解析字段不对打印接口原始 JSON通过浏览器开发者工具确认字段名情感分析结果全部为 0.5文本为空或模块捕获异常检查异常处理逻辑打印每一条文本的 sentiment 值如果运行过程中出现其他报错建议把完整堆栈信息复制到搜索引擎里搜索。不要只看最后一行提示往上翻几行找到根源报错通常会更快。这个项目真正值得花时间的部分不在跑通脚本而在理解每一个设计决策背后的原因。为什么表结构要加唯一索引为什么要做文本脱敏为什么清洗时不能只 dropna这些问题想清楚之后你写进简历的项目经验才经得起面试官追问。建议第一次做的时候数据量不要贪大。先跑通 100 条评论的完整流程确认从采集、入库到图表展示全链路正常再扩大采集范围。跑通之后再考虑把项目扩展成定时任务比如每天早上自动采集前一天的数据并更新图表这也是一个可以写进简历的加分亮点。
返回列表