这个基于大数据的电影数据分析与可视化系统,是我在指导学弟学妹完成毕业设计时开发的一个典型案例。项目源于一个很实际的需求——国内缺乏像MovieLens那样系统化的电影数据集,而现有的国外数据集又难以反映中国电影市场的真实情况。
系统通过爬取豆瓣电影数据,建立了包含电影基本信息、评分、评论等内容的本地数据库。与常见的单纯数据采集不同,我们特别注重:
提示:选择豆瓣作为数据源是因为它的用户基数大(超过2亿)、评论质量高,且电影信息更新及时,是研究中国电影市场的理想样本。
系统采用典型的三层架构:
code复制[数据层] Python爬虫 + MySQL
[业务层] Flask + SnowNLP(情感分析)
[展示层] ECharts + Ajax
豆瓣有较严格的反爬机制,我们通过以下方式解决:
python复制# 关键配置示例
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Accept-Language": "zh-CN,zh;q=0.9",
"Referer": "https://movie.douban.com/"
}
# 请求间隔控制
import time
time.sleep(random.uniform(0.5, 1.5)) # 随机延迟
使用正则表达式结合BeautifulSoup进行混合解析:
python复制# 电影评分提取
score_pattern = re.compile('rating_num" property="v:average">(.*?)</strong>')
score = re.findall(score_pattern, html)
# 导演信息提取
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
directors = [a.text for a in soup.select('a[rel="v:directedBy"]')]
采用分批写入策略,每采集20条数据写入一次Excel,避免意外中断导致数据丢失:
python复制if len(data_cache) >= 20:
with pd.ExcelWriter('movies.xlsx', mode='a') as writer:
pd.DataFrame(data_cache).to_excel(writer)
data_cache = []
code复制/movie_analysis
/static # 静态资源
/templates # HTML模板
/spiders # 爬虫代码
app.py # 主程序
config.py # 配置文件
python复制@app.route('/api/movies')
def get_movies():
# 分页查询
page = request.args.get('page', 1, type=int)
per_page = 20
pagination = Movie.query.paginate(page, per_page)
return jsonify({
'movies': [movie.to_dict() for movie in pagination.items],
'total': pagination.total
})
@app.route('/api/comments/sentiment')
def analyze_sentiment():
comments = request.json.get('comments')
scores = [SnowNLP(c).sentiments for c in comments]
return jsonify({'scores': scores})
javascript复制// 情感趋势图配置
option = {
tooltip: { trigger: 'axis' },
xAxis: { type: 'category', data: dates },
yAxis: { type: 'value', min: 0, max: 1 },
series: [{
data: scores,
type: 'line',
smooth: true,
areaStyle: {}
}]
};
使用Ajax实现无刷新数据更新:
javascript复制function loadMovieData(movieId) {
$.ajax({
url: `/api/movies/${movieId}`,
success: function(data) {
updateCharts(data);
}
});
}
通过media query和ECharts的resize方法实现响应式:
css复制@media (max-width: 768px) {
.chart-container {
width: 100%;
height: 300px;
}
}
采用SnowNLP计算评论情感值(0-1之间):
python复制from snownlp import SnowNLP
def analyze_sentiment(text):
s = SnowNLP(text)
return s.sentiments
基于TF-IDF算法提取评论关键词:
python复制from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(stop_words=stopwords)
X = tfidf.fit_transform(comments)
keywords = tfidf.get_feature_names_out()
使用Pandas进行电影评分时间趋势分析:
python复制df['date'] = pd.to_datetime(df['date'])
monthly_avg = df.groupby(df['date'].dt.to_period('M'))['score'].mean()
ini复制[mysqld]
innodb_buffer_pool_size = 1G
max_connections = 200
使用APScheduler实现定时任务:
python复制from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
scheduler.add_job(spider.run, 'cron', hour=2) # 每天凌晨2点运行
scheduler.start()
配置完整的日志记录系统:
python复制import logging
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler('app.log', maxBytes=10000, backupCount=3)
handler.setLevel(logging.INFO)
app.logger.addHandler(handler)
python复制from snownlp import sentiment
sentiment.load('my_sentiment.data')
sql复制CREATE INDEX idx_movie_date ON movies(release_date);
这个项目最让我有成就感的是,它不仅是一个技术实践,更能真实反映中国电影市场的一些有趣现象。比如我们发现周末上映的电影平均评分比工作日高0.2分左右,而某些特定类型的电影在不同地区的接受度差异很大。这些发现如果深入挖掘,对电影从业者应该会有实际参考价值。