[免费]基于Python豆瓣电影数据分析及可视化系统(Flask+echarts+pandas)【论文+源码+SQL脚本】

发布于:2025-07-09 ⋅ 阅读:(17) ⋅ 点赞:(0)

大家好,我是java1234_小锋老师,看到一个不错的于Python豆瓣电影数据分析及可视化系统(Flask+echart+pandas)【论文+源码+SQL脚本】,分享下哈。

项目介绍

随着如今电影越来越多,各种各样的烂片和捞钱的商业片也层出不穷,而有意义的电影慢慢的变得很少。本项目是基于对豆瓣网的子网站豆瓣电影的网络爬虫技术到数据可视化分析的实现,从Pycharm的环境搭建到数据爬取,再数据处理,最后数据的可视化。该项目通过爬虫爬取目标网站,获取数据,在数据可视化的过程中,使用ECharts对做出的图表进行可视化处理,可以提高用户在需要时查找所需要信息的识别率,通过图表让人一目了然,比如一些多角度动态视图,解决了用户首次了解解决率如何,从而显著提高用户对电影的满意程度。

系统展示

部分代码

import json
from flask import Flask,request,render_template,session,redirect
import re
from myutils.query import querys
from myutils.homeData import *
from myutils.timeData import *
from myutils.rateData import *
from myutils.addressData import *
from myutils.typeData import *
from myutils.tablesData import *
from myutils.actor import *
from word_cloud_picture import get_img

import random
app = Flask(__name__)
app.secret_key = 'This is a app.secret_Key , You Know ?'

@app.route('/')
def every():
    return render_template('login.html')

@app.route("/home")
def home():
    email = session['email']
    allData = getAllData()
    maxRate = getMaxRate()
    maxCast = getMaxCast()
    typesAll = getTypesAll()
    maxLang = getMaxLang()
    types = getType_t()
    row,column = getRate_t()
    tablelist = getTableList()
    return render_template(
        "index.html",
        email=email,
        dataLen = len(allData),
        maxRate=maxRate,
        maxCast=maxCast,
        typeLen = len(typesAll),
        maxLang = maxLang,
        types=types,
        row=list(row),
        column=list(column),
        tablelist=tablelist
    )

@app.route("/login",methods=['GET','POST'])
def login():
    if request.method == 'POST':
        request.form = dict(request.form)

        def filter_fns(item):
            return request.form['email'] in item and request.form['password'] in item

        users = querys('select * from user', [], 'select')
        print(users)
        login_success = 0
        for item in users:
            if item[1] == request.form['email'] and item[2] == request.form['password']:
                login_success = 1
        if login_success == 0:
            return '账号或密码错误'
        # login_success = list(filter(filter_fns, users))
        # print(login_success)
        # if not len(login_success):
        #     return '账号或密码错误'

        session['email'] = request.form['email']
        return redirect('/home', 301)

    else:
        return render_template('./login.html')

@app.route("/registry",methods=['GET','POST'])
def registry():
    if request.method == 'POST':
        request.form = dict(request.form)
        if request.form['password'] != request.form['passwordCheked']:
            return '两次密码不符'
        else:
            def filter_fn(item):
                return request.form['email'] in item

            users = querys('select * from user', [], 'select')
            filter_list = list(filter(filter_fn, users))
            if len(filter_list):
                return '该用户名已被注册'
            else:
                querys('insert into user(email,password) values(%s,%s)',
                       [request.form['email'], request.form['password']])

        session['email'] = request.form['email']
        return redirect('/home', 301)

    else:
        return render_template('./register.html')

@app.route("/search/<int:searchId>",methods=['GET','POST'])
def search(searchId):
    email = session['email']
    allData = getAllData()
    data = []
    if request.method == 'GET':
        if searchId == 0:
            return render_template(
                'search.html',
                idData=data,
                email=email
            )

        for i in allData:
            if i[0] == searchId:
                data.append(i)
        return render_template(
                'search.html',
                data=data,
                email=email
            )
    else:
        searchWord = dict(request.form)['searchIpt']
        def filter_fn(item):
            if item[3].find(searchWord) == -1:
                return False
            else:
                return True
        data = list(filter(filter_fn,allData))
        return render_template(
            'search.html',
            data=data,
            email=email
        )

@app.route("/time_t",methods=['GET','POST'])
def time_t():
    email = session['email']
    row,column = getTimeList()
    moveTimeData = getMovieTimeList()
    return render_template(
        'time_t.html',
        email=email,
        row=list(row),
        column=list(column),
        moveTimeData=moveTimeData
    )

@app.route("/rate_t/<type>",methods=['GET','POST'])
def rate_t(type):
    email = session['email']
    typeAll = getTypesAll()
    rows,columns = getMean()
    x,y,y1 = getCountryRating()
    if type == 'all':
        row, column = getRate_t()
    else:
        row,column = getRate_tType(type)
    if request.method == 'GET':
        starts,movieName = getStart('长津湖')
    else:
        searchWord = dict(request.form)['searchIpt']
        starts,movieName = getStart(searchWord)
    return render_template(
        'rate_t.html',
        email=email,
        typeAll=typeAll,
        type=type,
        row=list(row),
        column=list(column),
        starts=starts,
        movieName=movieName,
        rows = rows,
        columns = columns,
        x=x,
        y=y,
        y1=y1
    )

@app.route("/address_t",methods=['GET','POST'])
def address_t():
    email = session['email']
    row,column = getAddressData()
    rows,columns = getLangData()
    return render_template('address_t.html',row=row,column=column,rows=rows,columns=columns,email=email)

@app.route('/type_t',methods=['GET','POST'])
def type_t():
    email = session['email']
    result = getMovieTypeData()
    return render_template('type_t.html',result=result,type_t=type_t,email=email)

@app.route('/actor_t')
def actor_t():
    email = session['email']
    x,y = getAllActorMovieNum()
    x1,y1 = getAllDirectorMovieNum()
    return render_template('actor_t.html',email=email,x=x,y=y,x1=x1,y1=y1)

@app.route("/movie/<int:id>")
def movie(id):
    allData = getAllData()
    idData = {}
    for i in allData:
        if i[0] == id:
            idData = i
    return render_template('movie.html',idData=idData)

@app.route('/tables/<int:id>')
def tables(id):
    if id == 0:
        tablelist = getTableList()
    else:
        deleteTableId(id)
        tablelist = getTableList()
    return render_template('tables.html',tablelist=tablelist)

@app.route('/title_c')
def title_c():
    return render_template('title_c.html')

@app.route('/summary_c')
def summary_c():
    return render_template('summary_c.html')

@app.route('/casts_c')
def casts_c():
    return render_template('casts_c.html')

@app.route('/comments_c',methods=['GET','POST'])
def comments_c():
    email = session['email']
    if request.method == 'GET':
        return render_template('comments_c.html', email=email)
    else:
        searchWord = dict(request.form)['searchIpt']
        randomInt = random.randint(1,10000000)
        get_img('commentContent','./static/4.jpg',f'./static/{randomInt}.jpg',searchWord)
        return render_template('comments_c.html', email=email,imgSrc=f'{randomInt}.jpg')

@app.before_request
def before_requre():
    pat = re.compile(r'^/static')
    if re.search(pat,request.path):
        return
    if request.path == "/login" :
        return
    if request.path == '/registry':
        return
    uname = session.get('email')
    if uname:
        return None

    return redirect("/login")


if __name__ == '__main__':
    app.run()
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
        <meta name="description" content="" />
        <meta name="author" content="" />
        <title>登录</title>
        <link href="static/css/styles.css" rel="stylesheet" />
        <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/js/all.min.js" crossorigin="anonymous"></script>
    </head>
    <style>
        .col-lg-5{
            opacity: .8;
        }
        .bg-primary{
            background-image:url("/static/login.jpeg");
  background-size: cover;
        }
    </style>
    <body class="bg-primary">
        <div id="layoutAuthentication">
            <div id="layoutAuthentication_content">
                <main>
                    <div class="container">
                        <div class="row justify-content-center">
                            <div class="col-lg-5">
                                <div class="card shadow-lg border-0 rounded-lg mt-5">
                                    <div class="card-header"><h3 class="text-center font-weight-light my-4">登录</h3></div>
                                    <div class="card-body">
                                        <form action="/login" method="POST">
                                            <div class="form-floating mb-3">
                                                <input class="form-control" id="inputEmail" name="email" type="email" placeholder="请输入邮箱" />
                                                <label for="inputEmail">邮箱</label>
                                            </div>
                                            <div class="form-floating mb-3">
                                                <input class="form-control" id="inputPassword" name="password" type="password" placeholder="请输入密码" />
                                                <label for="inputPassword">密码</label>
                                            </div>
                                            <div class="form-check mb-3">
                                                <input class="form-check-input" id="inputRememberPassword" type="checkbox" value="" />
                                                <label class="form-check-label" for="inputRememberPassword">记住密码</label>
                                            </div>
                                            <div class="d-flex align-items-center justify-content-between mt-4 mb-0">
                                                <button style="width: 100%;" class="btn btn-primary" href="/registry">登录</button>

                                            </div>
                                        </form>
                                    </div>
                                    <div class="card-footer text-center py-3">
                                        <div class="small"><a href="/registry">还没有账号? 注册!
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </main>
            </div>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
        <script src="static/js/scripts.js"></script>
    </body>
</html>

源码下载

链接:https://pan.baidu.com/s/1c9kPOiDxXP8oAhO7sHDoTQ
提取码:1234


网站公告

今日签到

点亮在社区的每一天
去签到