开心麻花影视作品分析系统:Python数据采集与可视化实战
发布时间:2026/10/1 2:45:52来源:尧图网络
简介本资源是一套基于Python开发的开心麻花影视作品分析系统面向计算机相关专业做毕设的学生以及需要项目实战练习的Python学习者帮助其快速获得可运行、可参考的完整项目方案。资源包共33个文件约158MB涵盖py源码、ui界面文件、exe可执行程序、html可视化页面、json与xlsx数据文件、ttf字体、stopwords停用词表以及doc说明文档等类型齐全兼顾开发与部署。系统围绕电影分析展开支持选择影片后查看评论数与平均分、生成评论词云图、绘制评论分布热力图并内置城市坐标与地区数据库等数据支撑。项目经过严格调试附带程序配置说明书与使用说明书源码结构清晰便于二次开发与论文撰写。目前已有251人学习下载适合作为毕设参考或Python数据分析实战练手项目。1. 开心麻花影视作品分析系统从零搭一套能跑起来的 Python 数据分析项目开心麻花出品的电影豆瓣评分和票房之间经常出现一种“反着走”的现象——评分不算顶尖票房却能冲到几十亿。这个现象背后藏着大量可量化的数据规律演员组合、上映档期、口碑走势、短评情感倾向。基于 Python 开发的开心麻花影视作品分析系统做的就是把这些散落在豆瓣、猫眼、灯塔等平台上的公开数据采集下来清洗入库再用可视化图表和统计模型把规律呈现出来。这套系统适合两类人一是正在找 Python 数据分析完整项目练手的入门者二是想拿它改造成其他导演或厂牌作品分析工具的开发者。源码、可执行程序、配置说明书和使用说明书四件套齐全意味着拿到手就能跑不用从环境搭建开始折腾。2. 数据采集与清洗从豆瓣短评到结构化表格的完整链路2.1 为什么选 requests BeautifulSoup 而不是 Scrapy做影视作品分析数据源无非几类豆瓣电影页面的评分、评价人数、短评列表猫眼或灯塔的票房日榜百度指数的搜索热度。这些页面结构相对稳定数据量级在几千到几万条之间用 Scrapy 属于杀鸡用牛刀。我一般会选 requests 负责请求BeautifulSoup 负责解析pandas 负责落表。这套组合的优势是调试直观——打开浏览器开发者工具找到目标元素的 CSS 选择器直接写进代码就能验证不需要理解 Scrapy 的中间件和管道机制。豆瓣的反爬策略不算激进但有几个点必须注意。第一请求头里的 User-Agent 要伪装成正常浏览器不能裸奔。第二短评页面默认只展示前 220 条左右要拿到更多数据需要处理“展开更多”的交互逻辑或者改用移动端接口。第三请求间隔不能太短我一般设 1.5 到 2.5 秒的随机延迟避免触发频率限制。import requests from bs4 import BeautifulSoup import pandas as pd import time import random 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: https://movie.douban.com/ } def fetch_comments(movie_id, start0, limit20): 抓取指定电影的单页短评返回结构化列表 url fhttps://movie.douban.com/subject/{movie_id}/comments params {start: start, limit: limit, status: P, sort: new_score} resp requests.get(url, headersHEADERS, paramsparams, timeout10) if resp.status_code ! 200: print(f请求失败状态码{resp.status_code}) return [] soup BeautifulSoup(resp.text, html.parser) items soup.select(.comment-item) records [] for item in items: try: user item.select_one(.comment-info a).text.strip() rating_tag item.select_one(.rating) rating rating_tag[title] if rating_tag else 未评分 comment item.select_one(.short).text.strip() vote_count item.select_one(.votes).text.strip() records.append({ user: user, rating: rating, comment: comment, votes: vote_count }) except AttributeError: continue return records def crawl_all(movie_id, total_pages10): 分页抓取每页间隔随机延迟 all_data [] for page in range(total_pages): start page * 20 batch fetch_comments(movie_id, startstart) all_data.extend(batch) print(f已抓取第 {page1} 页累计 {len(all_data)} 条) time.sleep(random.uniform(1.5, 2.5)) return pd.DataFrame(all_data) if __name__ __main__: df crawl_all(27619748, total_pages5) df.to_csv(xika_maohua_comments.csv, indexFalse, encodingutf-8-sig) print(f数据已保存共 {len(df)} 条记录)这段代码的核心逻辑分三层请求层负责构造 URL 和伪装请求头解析层用 CSS 选择器提取用户名、评分、短评内容和点赞数存储层用 pandas 统一落成 CSV。参数方面movie_id是豆瓣电影详情页 URL 里的数字 ID比如《西虹市首富》是 27619748total_pages控制抓取页数每页 20 条5 页就是 100 条短评。time.sleep里的随机区间可以根据实际被封情况调整如果连续请求失败把下限提到 3 秒以上。2.2 数据清洗的四个关键动作原始短评数据拿到手不能直接扔进分析模型。我一般会做四件事去重、去空、评分归一化、短评分词。去重按用户 ID 和评论内容双重判断因为同一个用户可能在不同时间发了多条。去空主要处理“该用户未评分”的情况把评分字段统一成数值型未评分的填 NaN。评分归一化是把“力荐”“推荐”“还行”这类文字映射成 5 分制数值。短评分词用 jieba为后续情感分析和词云做准备。import jieba import re def clean_data(df): 对原始短评数据做清洗和特征提取 # 去重 df df.drop_duplicates(subset[user, comment], keepfirst) # 评分映射 rating_map { 力荐: 5, 推荐: 4, 还行: 3, 较差: 2, 很差: 1 } df[rating_num] df[rating].map(rating_map) # 点赞数转数值 df[votes_num] df[votes].str.extract(r(\d)).astype(float).fillna(0) # 短评分词 def cut_text(text): text re.sub(r[^\u4e00-\u9fa5a-zA-Z0-9], , str(text)) return .join(jieba.cut(text)) df[comment_cut] df[comment].apply(cut_text) # 评论长度 df[comment_len] df[comment].str.len() return df cleaned clean_data(df) cleaned.to_csv(xika_maohua_cleaned.csv, indexFalse, encodingutf-8-sig) print(cleaned[[user, rating_num, comment_len]].describe())清洗后的数据多了四个字段rating_num是数值化评分votes_num是点赞数comment_cut是分词结果comment_len是评论长度。这四个字段直接决定了后续能做什么分析——评分分布看口碑点赞数看热度分词结果做词云和情感倾向评论长度辅助判断用户参与度。注意str.extract里的正则要跟实际页面结构匹配如果豆瓣改版把点赞数格式换了这里要同步调整。3. 分析模型与可视化评分、票房、情感三维度拆解3.1 评分分布与票房关联的统计口径拿到清洗后的数据第一个要回答的问题是开心麻花电影的豆瓣评分到底集中在哪个区间跟票房有没有相关性这里有个统计口径的坑——豆瓣评分是动态变化的上映首周和上映三个月后的分数可能差 0.5 到 1 分。我一般会固定一个时间截面比如统一取上映后第 30 天的评分保证可比性。票房数据从猫眼专业版或灯塔专业版获取单位统一成“亿元”。把每部电影的评分、票房、上映年份、导演、主演列表整理成一张主表然后用 pandas 做相关性分析。注意样本量的问题——开心麻花主控出品的电影也就十几部做回归分析时自由度很低所以更适合做描述性统计和分组对比而不是硬套复杂的机器学习模型。import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 主表手动整理或从数据库读取 movies pd.DataFrame({ title: [夏洛特烦恼, 西虹市首富, 羞羞的铁拳, 李茶的姑妈, 半个喜剧, 温暖的抱抱, 这个杀手不太冷静, 独行月球], year: [2015, 2018, 2017, 2018, 2019, 2020, 2022, 2022], douban_score: [7.8, 6.6, 6.8, 4.6, 7.3, 5.2, 6.7, 6.6], box_office: [14.4, 25.5, 22.1, 6.0, 1.9, 8.6, 26.3, 31.0] }) # 评分与票房的散点图 plt.figure(figsize(10, 6)) sns.scatterplot(datamovies, xdouban_score, ybox_office, s120) for _, row in movies.iterrows(): plt.annotate(row[title], (row[douban_score], row[box_office]), fontsize9, xytext(5, 5), textcoordsoffset points) plt.xlabel(豆瓣评分) plt.ylabel(票房亿元) plt.title(开心麻花电影评分与票房分布) plt.tight_layout() plt.savefig(score_vs_boxoffice.png, dpi150) plt.show() # 相关系数 corr movies[douban_score].corr(movies[box_office]) print(f评分与票房的皮尔逊相关系数{corr:.3f})这段代码做了两件事画散点图看分布算皮尔逊相关系数看线性关系。从数据能看出一个反直觉的结论——评分和票房的相关性并不强甚至在某些年份出现负相关。《李茶的姑妈》评分 4.6 但票房 6 亿《独行月球》评分 6.6 票房却冲到 31 亿。这说明开心麻花的票房驱动力更多来自演员阵容和档期选择而不是口碑本身。参数方面s120控制散点大小dpi150保证图片清晰度corr()默认算皮尔逊系数如果想看秩相关可以换成spearman。3.2 短评情感分析用 SnowNLP 做倾向判断短评文本的情感倾向是另一个分析维度。SnowNLP 是一个轻量级的中文情感分析库对影视短评这种口语化文本的准确率大概在 70% 到 80% 之间够用但不完美。我一般会用它给每条短评打一个 0 到 1 的情感分大于 0.6 算正面小于 0.4 算负面中间算中性。然后按电影分组看正面评价占比跟评分的关系。from snownlp import SnowNLP def sentiment_score(text): 返回 0-1 的情感分越接近 1 越正面 try: return SnowNLP(str(text)).sentiments except Exception: return 0.5 cleaned[sentiment] cleaned[comment].apply(sentiment_score) cleaned[sentiment_label] pd.cut( cleaned[sentiment], bins[0, 0.4, 0.6, 1.0], labels[负面, 中性, 正面] ) # 按电影分组统计情感分布 sentiment_dist cleaned.groupby(sentiment_label).size() print(sentiment_dist) print(f正面评价占比{(sentiment_dist.get(正面, 0) / len(cleaned)) * 100:.1f}%)SnowNLP 的sentiments属性直接返回情感概率值不需要额外训练。pd.cut把连续值切成三个区间方便做分组统计。这里有个血泪经验——SnowNLP 对反讽和网络梗的识别很差比如“真是太好看了呢”这种反话会被判成正面。所以情感分析的结果只能作为参考不能当作唯一结论。如果要做更准的分析可以换成基于 BERT 的预训练模型但那就需要 GPU 环境和额外的模型文件部署复杂度会上升一个量级。3.3 词云与关键词提取谁在反复被提及词云是影视分析里最直观的展示方式。把分词后的短评汇总用 wordcloud 库生成词云图能一眼看出观众讨论的焦点是演员、剧情还是导演。我一般会先过滤掉停用词再把“开心麻花”“电影”“好看”这类高频但无信息量的词去掉剩下的才是真正有分析价值的关键词。from wordcloud import WordCloud from collections import Counter # 自定义停用词 stop_words {开心麻花, 电影, 好看, 一部, 真的, 就是, 这个, 什么} all_words [] for text in cleaned[comment_cut]: for word in text.split(): if word not in stop_words and len(word) 1: all_words.append(word) word_freq Counter(all_words) print(Top 20 高频词, word_freq.most_common(20)) wc WordCloud( font_pathsimhei.ttf, width800, height400, background_colorwhite, max_words100 ) wc.generate_from_frequencies(word_freq) wc.to_file(comment_wordcloud.png)font_path必须指定中文字体文件否则生成的词云全是方块。max_words100控制显示词数太多会显得杂乱。Counter统计词频后most_common(20)能快速看到排名前 20 的关键词。从实际跑出来的结果看沈腾、马丽、搞笑、剧情、失望这几个词出现频率最高说明观众的核心关注点集中在演员和喜剧效果上而“失望”的高频出现也印证了部分作品口碑下滑的事实。4. 避坑与排查这套系统最容易翻车的五个地方4.1 抓取时请求被拒或返回空列表现象代码跑起来后fetch_comments返回空列表或者状态码直接是 403。原因通常是请求头不够完整或者请求频率太高被临时限制。解决方法是补全Accept、Accept-Language、Connection等头部字段把time.sleep的下限提到 3 秒以上必要时在请求之间加入更长的冷却时间。如果持续被拒可以换一个网络环境再试但不要用任何自动化工具高频轰炸。4.2 中文字体缺失导致词云全是方块现象词云图生成成功但打开一看全是方框一个汉字都看不清。原因是WordCloud默认字体不支持中文。解决办法是下载一个中文字体文件比如 simhei.ttf 或 SourceHanSans.ttf放在项目目录下在WordCloud初始化时用font_path参数指定绝对路径或相对路径。注意路径里不要有中文目录名否则在某些操作系统上会读取失败。4.3 pandas 读取 CSV 后中文乱码现象用pd.read_csv读之前保存的文件中文列名或内容变成乱码。原因是保存时用的编码和读取时不一致。解决方法是保存时统一用encodingutf-8-sig读取时也用同样的编码。如果文件是别人给的不确定编码可以先用chardet检测或者用encodinggbk试一次。这个坑在 Windows 环境下尤其常见因为 Excel 默认用 GBK 打开 CSV。4.4 SnowNLP 情感分析结果偏差过大现象明明是很明显的差评SnowNLP 却给出 0.8 的高分。原因是 SnowNLP 的训练语料以电商评论为主对影视短评里的反讽、网络梗、方言表达识别能力有限。解决办法是不要把它当作唯一判断依据可以结合评分字段做交叉验证——如果用户打了 1 星但情感分很高这条记录大概率是误判可以在后续分析中标记出来或剔除。更彻底的办法是换用预训练模型但部署成本会明显增加。4.5 可执行程序在别人电脑上跑不起来现象自己电脑上双击 exe 正常运行发给别人就报错或闪退。原因通常是打包时没有把依赖库和字体文件一起打进去或者目标电脑缺少 Visual C 运行库。解决办法是用 PyInstaller 打包时加--add-data参数把字体和配置文件一起打包同时在说明书里注明需要安装 VC 运行库。如果目标电脑是 32 位系统而打包环境是 64 位也会导致无法运行需要在对应架构的环境下重新打包。5. 从能跑到好用配置说明书里没写的调优技巧配置说明书通常只告诉你“怎么让程序跑起来”但不会告诉你“怎么让它跑得更好”。我在这套系统上踩过几次坑之后总结出三个调优方向。第一个是抓取策略的优化。默认的固定延迟改成自适应延迟——如果连续三次请求都成功延迟降到 1 秒一旦出现失败延迟翻倍。这样在稳定期能提高效率在风控期能自动降速。实现方式很简单用一个变量记录连续成功次数在循环里动态调整time.sleep的参数。第二个是分析结果的缓存。每次跑完整流程都要重新抓数据、重新分词、重新算情感分耗时很长。我一般会在清洗完成后把 DataFrame 存成 pickle 文件下次分析时直接读取跳过抓取和清洗步骤。pickle 的读写速度比 CSV 快很多而且能保留数据类型。注意 pickle 文件在不同 Python 版本之间可能不兼容所以要在说明书里注明运行环境。第三个是可视化图表的交互化。静态的 matplotlib 图片适合放进报告但如果你想在演示时动态查看数据可以换成 plotly 或 pyecharts。这两个库生成的 HTML 文件可以直接在浏览器里打开支持缩放、悬停查看数值、筛选数据系列。代价是文件体积会大一些而且需要额外的依赖库。调优方向默认方案优化方案适用场景抓取延迟固定 2 秒自适应 1-8 秒数据量大、风控严格数据缓存每次重新抓pickle 缓存反复调试分析逻辑图表展示matplotlib 静态图plotly 交互图演示汇报、探索性分析情感分析SnowNLPBERT 预训练模型对准确率要求高最后说一个我自己的习惯每次改完代码先拿一部电影的少量数据跑通全流程确认没问题再放大到全量数据。这样万一中间某一步出错排查范围小不至于等半小时才发现是某个字段名写错了。这套系统本身不复杂但数据抓取和分析的链路比较长耐心和细致比技术本身更重要。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网