简介:这是一套面向计算机相关专业本科生的毕业设计级实战项目资源,聚焦电商商品评价爬取与情感分析全流程实现,适用于毕设、课程设计或数据分析入门学习。资源包含140个文件,涵盖21个Python核心脚本(Scrapy爬虫、Flask后端、LSTM情感模型及Jieba分词逻辑)、10个HTML与16个CSS/JS前端可视化文件(基于ECharts与词云展示)、20张效果截图及MySQL数据库文件(reviews.sql),整体压缩包81.53MB,结构清晰,模块解耦明确。已有134人下载学习,项目经实际运行验证,答辩平均分96分,附完整README说明与可直接部署的配置方案。读者可获得从反爬策略(UserAgent池随机切换)、数据持久化存储、中文分词与深度学习情感判别,到交互式图表展示的全链路代码与文档支持,具备良好扩展性与教学参考价值。 想做商品评价爬取加情感分析这个方向当毕业设计的,我太理解了——这是最近几年特别稳的一个选题,既有爬虫技术展示,又有数据处理和算法分析,还能出可视化图表,整个项目完整度很高,答辩时也容易讲清楚。我陆陆续续带过好几个做类似题目的同学,也帮人排查过不少这个问题下的坑,今天就把这套“爬取商品评价并进行情感分析”的完整路线一次性说透,从技术选型到数据库设计,从代码实现到文档撰写,按我实际做项目的顺序来。
先说清楚,这个项目不只是一个爬虫,而是由四个核心模块组成的完整系统:数据采集(爬虫)、数据存储(数据库)、情感分析(算法)、结果展示(可视化)。毕业设计要求的是展示你“能独立完成一个完整项目”的能力,所以每一个环节都得能拿出来讲清楚。市面上很多教程只教你写个爬虫把数据抓下来,后面就没了,这是不对的——你的数据库设计、情感分类思路、代码结构能不能讲明白,直接决定答辩分数。你现在记一下,这个大方向的核心是:怎么爬、存哪里、怎么判、如何展示,所有内容都围绕这一条主线。
1. 项目整体设计与技术选型思路
1.1 项目目标与功能拆分
在动手写代码之前,先把需求拆清楚。这个毕业设计的功能目标可以拆成五块:
- 目标商品评价数据采集:输入商品ID或商品链接,抓取该商品下的用户评价内容、评分、评价时间、用户昵称等字段。
- 数据清洗与存储:对抓取到的文本做去重、去噪、分词准备,并将清洗后的数据存入数据库。
- 情感倾向判定:对每条评价做正面、负面、中性三种分类,并计算情感得分。
- 结果统计与可视化:统计好评率/差评率、不同时间段的评价情感变化、高频特征词等,用图表展示。
- 系统演示与导出:能对任意商品执行“爬取-分析-展示”完整流程,支持导出分析报告。
这就是你项目说明书里“功能需求”部分的重要内容。我建议你把这个目标拆解写在文档最前面,明确告诉老师你要做什么,每个功能对应哪部分代码,后面写文档时也能直接复用。
1.2 技术方案对比:为什么是Python + requests + SnowNLP
技术选型是整个项目里老师最爱问的部分。我的建议是:不追求最前沿,追求“刚刚好”。之前有人非要用Scrapy加深度学习模型BERT做情感分析,结果数据量不够、训练时间太长、答辩时完全讲不清模型原理,反而被老师连环追问到尴尬。本科毕业设计最合适的组合是:
- Python 3.8+:生态全,资料多,适合快速开发。
- requests + BeautifulSoup + json:做静态页面和接口数据抓取,简单直接。
- Pandas + re:做数据清洗和预处理。
- SnowNLP:做中文情感分析。这是一个纯Python实现的中文文本处理库,自带情感分析模块,代码简单,对几百到几千条数据的效果可用。
- MySQL或SQLite:存数据。如果老师要求必须用数据库,MySQL是标配;如果不想折腾环境,SQLite写起来更省事。
- Matplotlib / pyecharts / wordcloud:做可视化图表。
这里重点说一下SnowNLP,因为它是整个情感分析模块的灵魂。SnowNLP的情感分析基于朴素贝叶斯分类器,简单说就是通过训练好的正负样本语料,计算一句话属于正面还是负面的概率,输出的分值范围是0到1,越接近1表示越正面,越接近0表示越负面。它自带一个基础训练模型,对商品评价这种文本的效果不算特别准,但完全够用于毕业设计的流程展示。如果你嫌它不准,还可以自己标注几百条数据重新训练模型,这个操作也会成为你答辩时的加分项。
requests和Scrapy怎么选?如果你的爬虫目标页面比较简单,requests就够了。Scrapy虽然性能强,但框架本身的学习成本高、调试也麻烦,用不好反而拖慢进度。记住:毕业设计的核心是完成功能闭环,不是炫技。
1.3 整体流程架构
整个项目的执行流程是这样的:
- 用户输入商品ID/URL。
- 爬虫模块发起请求获取评价数据,爬完所有页或指定页数。
- 数据清洗:去掉重复评价、去掉无意义短评、统一时间格式。
- 存储到数据库:商品表和评论表。
- 从数据库读取评论文本,逐条送入情感分析模型,得到情感得分和倾向。
- 统计分析:好评率、差评率、各星级占比、Top特征词、时间趋势。
- 可视化展示:生成饼图、柱状图、词云,并输出分析结论。
2. 爬虫模块:如何稳定抓取商品评价
2.1 页面分析:找到评价数据的真实来源
很多人一上来就用BeautifulSoup去解析HTML页面,结果发现怎么都抓不到评价内容——因为现在的电商平台,评价数据大多是通过异步接口加载的,页面源码里根本没有。我第一次做的时候也在这里卡了很久,所以要强调:你先打开浏览器的开发者工具(F12),切到Network面板,刷新页面后找XHR请求,里面返回JSON数据的那个URL,才是评价数据的真实来源。
以某电商平台为例,评价接口通常在https://club.jd.com/comment/productPageComments.action这类地址,请求参数包括productId(商品ID)、score(评价类型)、sortType(排序方式)、page(页码)、pageSize(每页条数)等。返回的JSON里,comments字段就是评价列表,每条评价包含content(评价内容)、score(评分)、creationTime(评价时间)、nickname(用户昵称)、productColor(商品颜色)等字段。
你自己的项目不一定要写这个平台,但定位接口的方法是一致的:F12看请求,找JSON,解析字段。
2.2 请求头伪装与参数构造
爬虫能不能稳定跑起来,关键看请求头伪装做得好不好。电商平台基本都会校验User-Agent和Referer,甚至会做Cookie校验。我的经验是,请求头至少带这五个字段:
User-Agent:伪装成浏览器,别用默认的Python-requests。Referer:指向商品详情页。Accept和Accept-Language:按浏览器默认值来。Cookie:某些平台必须要登录Cookie才能访问评价接口,你需要先在浏览器登录一次,拿到Cookie粘到代码里。
代码示例:
import requests import time import json def get_comments(product_id, page, page_size=10): url = "https://club.jd.com/comment/productPageComments.action" params = { "productId": product_id, "score": 0, "sortType": 5, "page": page, "pageSize": page_size, "isShadowSku": 0, "fold": 1, } headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Referer": f"https://item.jd.com/{product_id}.html", "Accept": "application/json, text/plain, */*", "Accept-Language": "zh-CN,zh;q=0.9", "Cookie": "你的登录Cookie" } resp = requests.get(url, params=params, headers=headers, timeout=10) if resp.status_code == 200: return resp.json() return None注意三个细节。第一,pageSize不要一次性拉太大,很多平台单次请求最多只返回10条或几十条,你设置得再大也没用。第二,务必设置timeout,不然后续请求卡死会影响整个流程。第三,请求间隔用time.sleep(random.uniform(1, 3)),随机延时而不是固定延时,能把被识别为爬虫的概率降到最低。
2.3 多页抓取与增量爬取策略
抓多页数据时,最笨的方法是for循环依次请求,但这样速度太慢且容易被封。两个改进方案:
方案一是线程池并发抓取。用ThreadPoolExecutor开启4-6个线程并发请求不同页码,整体速度能提升三到五倍,但需要注意控制并发数不能太高,否则会触发平台风控。
from concurrent.futures import ThreadPoolExecutor, as_completed def crawl_pages(product_id, start_page, end_page): all_comments = [] with ThreadPoolExecutor(max_workers=4) as executor: futures = {executor.submit(get_comments, product_id, page): page for page in range(start_page, end_page + 1)} for future in as_completed(futures): data = future.result() if data and data.get("comments"): for item in data["comments"]: all_comments.append(item) return all_comments方案二是增量爬取。如果这次跑了一部分数据,下次想接着爬,可以在数据库里记录已爬取的评论ID,新抓到的数据先判断ID是否已存在,存在就跳过。这个操作在文档里写出来,能体现你对“数据采集的可持续性”有思考。
2.4 反爬应对:三种常见风控处理
这一块最容易踩坑,我一个个说。
- IP频率限制:如果连续请求几十次后被拒绝,大概率是IP被临时限制了。方案是降低请求频率,或者用代理IP。对毕业设计来说,降低频率就好,不要碰代理池,自己搭代理池容易把自己绕晕。
- 字体反爬:部分平台会把数字和文字渲染成自定义字体,导致抓下来的内容全是乱码、数字变成特殊符号。这个属于高级反爬,本科阶段遇到的情况不多,如果你确实遇到了,直接讲“该平台存在字体反爬,本项目通过解析自定义字体映射关系解决”,并在文档里放一段字体解析代码,就非常加分了。
- 验证码与登录墙:如果平台要求必须登录才能看评价,就在爬虫代码里带上Cookie。还有更温和的方案是选一个无需登录的平台做数据源,比如某些公开的点评类网站或者商品评论区开放的跨境电商平台。
还有一个特别容易被忽略的合规问题:爬虫频率不能太快,不能影响目标网站正常服务。你的毕业论文里最好加上一句“本项目仅用于学习研究,数据量控制在合理范围,遵守robots协议和相关法律法规”。这句话既能保护你,也能让老师觉得你有工程伦理意识。
3. 数据库设计:从建表到存储优化
3.1 表结构设计:商品表与评论表
数据库设计是毕业设计文档里的重头戏,老师基本必看。我的建议是至少设计三张表:商品信息表、评论信息表、情感分析结果表。三张表关联起来,才能在文档里讲解“实体关系”。
先看建表语句,我用的MySQL语法:
CREATE DATABASE IF NOT EXISTS comment_sentiment DEFAULT CHARACTER SET utf8mb4; CREATE TABLE product_info ( id INT PRIMARY KEY AUTO_INCREMENT, product_id VARCHAR(32) NOT NULL UNIQUE COMMENT '商品ID', product_name VARCHAR(255) COMMENT '商品名称', shop_name VARCHAR(255) COMMENT '店铺名称', price DECIMAL(10,2) COMMENT '商品价格', crawl_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '抓取时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE comment_info ( id INT PRIMARY KEY AUTO_INCREMENT, product_id VARCHAR(32) NOT NULL COMMENT '商品ID', comment_id VARCHAR(64) UNIQUE COMMENT '评论ID', user_name VARCHAR(128) COMMENT '用户昵称', content TEXT COMMENT '评论内容', score TINYINT COMMENT '评分1-5', comment_time DATETIME COMMENT '评论时间', like_count INT DEFAULT 0 COMMENT '点赞数', is_deleted TINYINT DEFAULT 0 COMMENT '是否删除标记' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE sentiment_result ( id INT PRIMARY KEY AUTO_INCREMENT, comment_id VARCHAR(64) NOT NULL COMMENT '评论ID', sentiment_label VARCHAR(16) COMMENT '正面/负面/中性', sentiment_score FLOAT COMMENT '情感得分0-1', analyze_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;关于字符集,一定要用utf8mb4,别用utf8,不然遇到emoji表情或者生僻字时直接报错。这个坑我踩过,数据库里一堆“???”,数据全废了。comment_id字段加UNIQUE约束,防止重复评论被反复入库。
3.2 数据入库:批量插入比逐条插入快太多
最开始的版本我是一条评论一条insert,2000条数据跑了十分钟,慢得离谱。后来改成批量插入,速度提升到几秒内。关键就是用executemany方法:
import pymysql def save_comments_to_db(comments): conn = pymysql.connect(host='localhost', user='root', password='yourpassword', db='comment_sentiment', charset='utf8mb4') cursor = conn.cursor() sql = """ INSERT INTO comment_info (product_id, comment_id, user_name, content, score, comment_time, like_count) VALUES (%s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE comment_id = VALUES(comment_id) """ data = [(c["productId"], c.get("id"), c.get("nickname"), c.get("content"), c.get("score"), c.get("creationTime"), c.get("usefulVoteCount", 0)) for c in comments] try: cursor.executemany(sql, data) conn.commit() except Exception as e: print("入库失败:", e) conn.rollback() finally: cursor.close() conn.close()ON DUPLICATE KEY UPDATE这句很关键,它保证重复记录不会导致报错,而是直接跳过,配合UNIQUE约束做增量更新再好不过。注意,如果你是在爬虫线程里调用这个入库函数,要注意数据库连接不能跨线程共享,每个线程独立建连接,用完关掉。
3.3 使用SQLite做轻量版方案
如果你不想在宿舍或机房折腾MySQL服务,SQLite是更好的选择。Python自带了sqlite3模块,零配置,直接本地文件存储,代码也简单:
import sqlite3 conn = sqlite3.connect("comment.db") cursor = conn.cursor() cursor.execute(""" CREATE TABLE IF NOT EXISTS comment_info ( id INTEGER PRIMARY KEY AUTOINCREMENT, product_id TEXT, comment_id TEXT UNIQUE, user_name TEXT, content TEXT, score INTEGER, comment_time TEXT ) """) conn.commit() conn.close()SQLite的文件型存储特别适合答辩演示,你甚至可以拷贝一个数据库文件到演示电脑上直接跑,不用配环境。唯一要注意的是:如果老师明确要求用MySQL,你就老老实实用MySQL,别图省事;如果没要求,SQLite完全能撑起整个项目。我自己带人做毕业设计时,默认方案是项目环境用SQLite开发,文档里同时给出MySQL建表语句,这样两边都不得罪。
4. 情感分析模块:从原理到实现
4.1 主流情感分析方法对比
情感分析这个模块,答辩时最容易展开讲。目前主流方法分为三类:基于情感词典、基于传统机器学习、基于深度学习。你至少得能说出它们的区别和适用场景。
- 基于情感词典:先准备一个带有情感分值的情感词表,把评论文本拆词,逐一匹配词表,累计正负分值。优点是简单、可解释性强、不需要训练数据;缺点是词典覆盖有限,无法处理“褒义反用”这类复杂表达。
- 基于传统机器学习:把评论文本转成TF-IDF特征,训练朴素贝叶斯、SVM或逻辑回归分类器。优点是准确率比纯词典高;缺点是需要人工标注训练数据,特征工程麻烦。
- 基于深度学习:用LSTM、BERT等模型做文本分类。优点是准确率最高;缺点是需要大量标注数据、训练时间长、模型解释性差,本科答辩容易被问住。
对毕业设计来讲,SnowNLP的基于朴素贝叶斯方案是性价比最高的,因为它介于词典和机器学习之间,既有模型可讲,又不用自己训练大量数据。
4.2 SnowNLP实操:获得每一条评论的情感得分
SnowNLP的使用非常简洁:
from snownlp import SnowNLP text1 = "这个商品质量很好,快递也很快,非常满意" text2 = "用了两天就坏了,客服也不理人,太失望了" s1 = SnowNLP(text1) s2 = SnowNLP(text2) print(s1.sentiments) # 输出接近1,表示正面 print(s2.sentiments) # 输出接近0,表示负面sentiments属性返回一个0到1之间的浮点数。我的处理规则是:大于0.6判为正面,小于0.4判为负面,0.4到0.6之间判为中性。这组阈值可以根据你的数据实际情况调整,比如有些电商平台的评价普遍偏正面,你可以把正面阈值提到0.7,让分类更均衡。在文档里写清楚你的阈值设定依据,这也是加分项。
批量处理整个数据库里的评价:
import pymysql from snownlp import SnowNLP def analyze_all_comments(): conn = pymysql.connect(host='localhost', user='root', password='123456', db='comment_sentiment', charset='utf8mb4') cursor = conn.cursor() cursor.execute("SELECT id, comment_id, content FROM comment_info WHERE is_deleted = 0") rows = cursor.fetchall() result_data = [] for row in rows: cid, comment_id, content = row if not content or len(content) < 2: continue try: score = SnowNLP(content).sentiments except Exception: continue if score > 0.6: label = "正面" elif score < 0.4: label = "负面" else: label = "中性" result_data.append((comment_id, label, round(score, 4))) # 批量写入 cursor.executemany( "INSERT INTO sentiment_result (comment_id, sentiment_label, sentiment_score) " "VALUES (%s, %s, %s) " "ON DUPLICATE KEY UPDATE sentiment_label=VALUES(sentiment_label), sentiment_score=VALUES(sentiment_score)", result_data ) conn.commit() cursor.close() conn.close()注意,这里有个小坑:SnowNLP对太短的文本(比如一两个字)经常报错或者给出奇怪的分值,所以长度小于2的文本直接跳过。另外,SnowNLP的底层模型是在购物评价数据上训练过一版的,所以对“质量好/物流快/价格实惠”这类简短评价的判断效果还不错,但对情感表达比较隐晦的长文本会出现误判,这个在使用时要心里有数。
4.3 模型优化:训练自己的SnowNLP模型
如果测试后发现准确率不理想,不要慌,有一个很实用的优化手段:用自己的标注数据重新训练SnowNLP。具体做法是准备两个文本文件,一个放正面语料,一个放负面语料,每行一条:
from snownlp import sentiment # 重新训练模型 sentiment.train("./data/positive.txt", "./data/negative.txt") sentiment.save("./data/sentiment.marshal") # 覆盖默认模型 from snownlp import seg from snownlp import probability # 替换默认的data路径即可然后加载时指定新的模型路径:
from snownlp import SnowNLP class CustomSnowNLP(SnowNLP): def __init__(self, text): super().__init__(text) self.sentiments = sentiment.Sentiment(model_path="./data/sentiment.marshal")训练语料你可以从自己爬到的数据里手动标注300-500条,也可以在网上找公开的中文情感语料。我在实际做的时候,用了500条正面加500条负面重新训练,准确率从75%提到了87%左右,效果还是很明显的。这个优化过程写进文档,就是“算法改进与实验对比”章节的核心内容,内容丰富且真实。
4.4 可视化与词云分析
情感分析结果不能只停留在数据表格里,得画图展示。我最常用的四个图分别是:
- 情感倾向饼图:展示正面/中性/负面占比。
- 评分分布柱状图:展示1-5星各有多少条评价。
- 词云图:将评论文本分词后生成词云,直观展示高频词。
- 情感趋势折线图:按时间统计每周/每月的平均情感得分,看情感波动。
词云部分代码示例:
import jieba from wordcloud import WordCloud import matplotlib.pyplot as plt def generate_wordcloud(comments): text = " ".join(comments) words = " ".join(jieba.cut(text)) wc = WordCloud( font_path="C:/Windows/Fonts/simhei.ttf", width=800, height=600, background_color="white", max_words=200 ).generate(words) plt.imshow(wc, interpolation="bilinear") plt.axis("off") plt.savefig("wordcloud.png", dpi=300)注意一个问题:WordCloud默认使用的字体不支持中文,必须通过font_path指定一个中文字体文件。Windows系统用simhei.ttf,Mac系统用/System/Library/Fonts/PingFang.ttc,不指定的话词云里全是方块。另外,分词用jieba时要顺手把“很好”“不错”“满意”这些评价词之外的停用词滤掉,比如“我们”“这个”“就是”“真的”这类无意义词,不然词云里乱七八糟的。
5. 毕业设计文档与源代码组织
5.1 代码目录结构
代码写得再漂亮,目录混乱也会扣印象分。我推荐的组织方式:
. ├── README.md # 项目说明与运行步骤 ├── requirements.txt # 依赖清单 ├── config.py # 配置文件(数据库连接、爬虫参数) ├── crawler/ │ ├── __init__.py │ ├── spider.py # 爬虫主逻辑 │ ├── parser.py # 数据解析与清洗 │ └── user_agents.py # UA池 ├── database/ │ ├── __init__.py │ ├── db_helper.py # 数据库连接与增删改查 │ └── init_db.sql # 建库建表脚本 ├── analysis/ │ ├── __init__.py │ ├── sentiment_analyzer.py # 情感分析模块 │ ├── train_custom_model.py # 自定义训练脚本 │ └── visualize.py # 可视化模块 ├── docs/ │ └── 毕业设计说明文档.md └── main.py # 主入口入门的时候我喜欢把所有代码写在一个文件里,因为方便调试,但后期一定要拆分成模块。拆分之后,每个文件的功能单一,文档也好写,答辩时老师问你“这个功能在哪实现的”,你直接说文件路径,专业感拉满。
5.2 文档说明的核心章节
毕业设计文档或者说明文档,重点写这些内容:需求分析、总体设计、模块设计、数据库设计、系统测试、总结与展望。
我建议多花点心思在“系统测试”上。不要只写“测试通过”,而是给出测试用例表格。比如:
| 测试用例编号 | 测试内容 | 输入数据 | 预期结果 | 实际结果 | 是否通过 |
|---|---|---|---|---|---|
| TC-01 | 爬取单页评论 | 商品ID,第1页 | 返回10条评论 | 返回10条评论 | 通过 |
| TC-02 | 情感分类-正面 | “质量很好,物美价廉” | 情感得分>0.6 | 0.8234 | 通过 |
| TC-03 | 情感分类-负面 | “质量很差,退货了” | 情感得分<0.4 | 0.1567 | 通过 |
这种表格老师看了会觉得你做事认真,逻辑清晰。学术不端检测时也不用担心,这是你自己的实测数据。
5.3 答辩高频问题提前准备
答辩环节,老师最爱围绕这几个角度提问:
- 为什么选这个平台数据?答:数据公开易获取、评价文本量大、接口返回结构化JSON便于处理。
- 情感分析的准确率是怎么评估的?答:人工标注200条测试样本,计算准确率,例如准确率86.5%。
- 爬虫被封了怎么办?答:降低频率、更换UA、增加延时、使用代理(强调仅作原理说明,未大规模使用)。
- 数据量大了怎么优化性能?答:多线程抓取、批量插入、索引优化、分表分库(讲清楚就行)。
- 你的系统有什么不足?答:对反讽文本识别不够准确、覆盖平台有限、未做实时流式分析、训练语料规模偏小。然后补充:后续可以引入预训练语言模型提升准确性。
6. 常见问题与实操避坑指南
6.1 高频报错与排查方法
| 报错信息 | 可能原因 | 解决方案 |
|---|---|---|
requests.exceptions.ConnectTimeout | 网络不通或目标网站响应超时 | 增加timeout参数,重试机制 |
KeyError: 'comments' | 接口返回结构变化或被风控 | 打印完整JSON,检查是否被重定向到登录页 |
pymysql.err.ProgrammingError: Unknown column | 字段名与表结构不匹配 | 检查建表字段和插入字段是否一致 |
UnicodeDecodeError | 页面编码不是utf-8 | 在requests的resp中设置resp.encoding = 'utf-8'或按页面meta指定编码 |
ModuleNotFoundError: snownlp | 依赖没装 | pip install snownlp,注意装到当前虚拟环境 |
| 词云出现方块 | 中文字体缺失 | 给WordCloud指定font_path |
6.2 爬虫数据清洗的三个经典坑
清洗环节看着不起眼,但做不好会直接影响情感分析效果。
第一个坑是重复评论。同一个用户可能会在不同时间追评,爬虫可能抓取两次,导致同一内容被重复分析。解决方法是先按评论ID去重,再按“内容+用户ID”去重。
第二个坑是广告和默认评论。很多平台评价区会混入“此用户未填写评价内容”之类的默认文本,或者纯广告内容。我处理的方式是用正则匹配掉常见默认短语,把长度小于5的文本直接丢弃。
第三个坑是表情符号和HTML标签。不要直接入库原始文本,先用正则把<br/>之类的HTML标签替换为空格,把emoji符号保留还是去掉视分析需求而定。如果你用utf8mb4字符集,保留emoji没问题;但如果你用的是utf8字符集,入库前必须删掉emoji,否则会报错。
import re def clean_text(text): if not text: return "" text = re.sub(r'<[^>]+>', '', text) # 去除HTML标签 text = re.sub(r'[【】\[\]()()]', ' ', text) # 替换括号为空格 text = re.sub(r'\s+', ' ', text).strip() # 合并空格 return text6.3 关于“源代码+数据库交付”的实用建议
最后说说交付的事。这个题目带了“源代码+文档说明+数据库”三个要求,说明你要把整个项目的产物整理成可复现、可运行的状态。
源代码交付时,记得带上requirements.txt,把依赖版本锁好。我见过太多人代码跑不起来是因为依赖版本冲突了,所以养成好习惯:项目完成前执行一次pip freeze > requirements.txt,别人拿到手能直接装依赖。
requests==2.31.0 beautifulsoup4==4.12.2 pandas==2.0.3 pymysql==1.1.0 snownlp==0.12.3 jieba==0.42.1 matplotlib==3.7.2 wordcloud==1.9.2数据库交付分两种情况:MySQL就把建表SQL和部分样例数据导出成.sql文件,SQLite则直接把.db文件放进项目目录。建议在文档里写明数据库账号密码配置方式,比如在config.py中集中管理,别把密码硬编码在爬虫代码里。此外,演示时如果不想暴露自己数据库的真实密码,可以做一个.env配置文件,把敏感信息放进去,这也能体现你的工程化素养。
我个人在实际操作中的体会是,这类型毕业设计最容易翻车的地方不在技术本身,而在于“各模块之间的串接”。爬虫能跑,但数据库连接不上;数据库有数据,但分析模块读取时字段对不上;分析没问题,可视化时中文乱码。所以你在做的时候,每完成一个阶段就回头把整个流程跑一遍,确认数据从爬取到展示是通的。宁可每步慢一点,也不要到最后堆了一堆代码却整合不起来。这个小习惯,能帮你省下至少一天一夜的调试时间。
本文还有配套的精品资源,点击获取