基于Python+Flask+MySQL+HTML的爬取豆瓣电影top-250数据并进行可视化的数据可视化平台和数据预测
时间: 2025-03-23 10:16:29 浏览: 45
### 构建基于Python Flask MySQL HTML的豆瓣电影Top-250数据爬取与可视化Web应用
#### 数据采集部分
为了完成数据采集,可以采用`requests`库发送HTTP请求,并通过`BeautifulSoup`解析HTML页面结构。具体来说,可以从豆瓣电影Top-250首页抓取基本信息(如名称、评分等),并通过进一步访问每部电影详情页来获取更详细的属性。
以下是基本的数据采集流程代码示例:
```python
import requests
from bs4 import BeautifulSoup
import re
def fetch_movie_data(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
movies = []
for item in soup.select('div.item'):
title = item.find('span', class_='title').get_text()
rating = float(item.find('span', class_='rating_num').get_text())
link = item.a['href']
detail_response = requests.get(link, headers=headers)
detail_soup = BeautifulSoup(detail_response.text, 'html.parser')
director = detail_soup.find('a', rel='v:directedBy').get_text() if detail_soup.find('a', rel='v:directedBy') else ''
year = int(re.search(r'(\d{4})', detail_soup.find('span', property="v:initialReleaseDate").get_text()).group(1))
movie_info = {
'title': title,
'rating': rating,
'director': director,
'year': year,
'link': link
}
movies.append(movie_info)
return movies
```
上述代码实现了从豆瓣Top-250页面提取电影标题、评分以及导演和年份等信息[^1]。
---
#### 数据存储部分
将收集到的数据保存至MySQL数据库中以便后续查询和分析。可以通过SQLAlchemy简化ORM操作过程。
安装依赖包:
```bash
pip install sqlalchemy pymysql
```
定义模型类并与表映射关联:
```python
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Movie(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(255), nullable=False)
rating = db.Column(db.Float, nullable=False)
director = db.Column(db.String(255), nullable=True)
year = db.Column(db.Integer, nullable=False)
link = db.Column(db.Text, nullable=False)
def __repr__(self):
return f'<Movie {self.title}>'
```
初始化数据库连接配置:
```python
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/db_name'
db.init_app(app)
with app.app_context():
db.create_all()
```
批量插入数据方法:
```python
movies = fetch_movie_data('https://movie.douban.com/top250')
for movie in movies:
new_movie = Movie(
title=movie['title'],
rating=movie['rating'],
director=movie['director'],
year=movie['year'],
link=movie['link']
)
db.session.add(new_movie)
db.session.commit()
```
以上步骤完成了数据持久化工作[^3]。
---
#### Web界面开发
使用Flask框架搭建前端交互环境,结合HTML模板渲染动态内容。同时引入PyECharts生成图表组件嵌入页面之中。
安装所需工具链:
```bash
pip install pyecharts flask-bootstrap
```
编写路由逻辑处理函数:
```python
@app.route('/')
def index():
movies = Movie.query.all()
ratings = [m.rating for m in movies]
years = [m.year for m in movies]
bar_chart = (
Bar(init_opts=opts.InitOpts(width="800px", height="400px"))
.add_xaxis(list(set(years)))
.add_yaxis("数量统计", [years.count(y) for y in set(years)])
.set_global_opts(title_opts=opts.TitleOpts(title="年度影片分布"))
)
pie_chart = (
Pie(init_opts=opts.InitOpts(width="800px", height="400px"))
.add("", [(str(m.rating), 1) for m in movies])
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
return render_template('index.html', bar_chart=bar_chart.render_embed(), pie_chart=pie_chart.render_embed())
```
创建视图文件`templates/index.html`布局样式:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>豆瓣Top250数据分析</title>
{{ include_pyecharts_js }}
</head>
<body>
<h1>豆瓣Top250电影数据概览</h1>
<!-- 条形图 -->
<div>{{ bar_chart | safe }}</div>
<!-- 饼状图 -->
<div>{{ pie_chart | safe }}</div>
</body>
</html>
```
这样便能直观展现各类维度下的趋势变化情况[^4]。
---
#### 数据预测模块
针对历史记录中的数值型字段尝试建立回归模型或者时间序列算法来进行未来可能走向推测;而对于分类标签则可选用决策树之类的监督学习手段加以辅助判断。
例如利用Scikit-Learn训练线性拟合关系:
```python
from sklearn.linear_model import LinearRegression
X = [[m.year] for m in movies[:20]] # 取前若干样本作为特征输入
y = [m.rating for m in movies[:20]]
model = LinearRegression().fit(X, y)
predicted_rating = model.predict([[2025]]) # 对指定年份做出估值猜测
print(f"预计2025年的平均评分为:{predicted_rating}")
```
此处仅为简单示范说明思路而已,在实际应用场景下还需考虑更多因素影响权重分配等问题[^2]。
---
阅读全文
相关推荐

















