大家好,我是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_imgimport 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 itemusers = querys('select * from user', [], 'select')print(users)login_success = 0for item in users:if item[1] == request.form['email'] and item[2] == request.form['password']:login_success = 1if 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 itemusers = 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 Falseelse:return Truedata = 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 = ireturn 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):returnif request.path == "/login" :returnif request.path == '/registry':returnuname = session.get('email')if uname:return Nonereturn 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?