✅ Python大数据招聘推荐系统 Vue+Flask+Scrapy 双协同过滤 百度OCR实名 数据大屏 深度学习 预测算法
·
博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅
1、毕业设计:2025年计算机专业毕业设计选题汇总(建议收藏)✅
2、大数据毕业设计:2025年选题大全 深度学习 python语言 JAVA语言 hadoop和spark(建议收藏)✅
🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅
毕业设计 | Python大数据招聘推荐系统
Vue + Flask + Scrapy + 双协同过滤 + 百度AI OCR + 数据大屏
1、项目介绍(技术栈与创新点)
| 模块 | 技术 |
|---|---|
| 前端 | Vue3 + Apache ECharts(地图、散点、词云、饼环图、数据大屏) |
| 后端 | Python + Flask(RESTful API) |
| 爬虫 | Scrapy框架,10城50万条智联招聘数据 → MySQL(13.4万清洗后) |
| 算法 | 双协同过滤:基于用户 + 基于物品;jieba分词 + TF-IDF关键词 |
| 接口 | 百度AI身份证OCR,实现实名认证 |
| 创新 | ① 50万→13.4万清洗pipeline ② 双推荐算法可切换 ③ 身份证OCR实名 ④ Vue-Echarts数据大屏 |
研究意义:将“大规模爬虫+推荐+可视化+实名认证”封装为全栈项目,为求职者、HR、高校毕业设计提供开箱即用的大数据招聘解决方案。
2、项目界面
① 招聘数据分析可视化大屏
② 数据分析页面(地图+散点+词云)
③ 基于物品协同过滤推荐
④ 基于用户协同过滤推荐
⑤ 薪资分析散点图
⑥ 注册登录 + 身份证OCR实名认证
3、系统功能
① 数据层
- Scrapy分布式爬取:职位、薪资、地点、学历、公司规模、福利等字段
- 清洗+去重 → MySQL,13.4万有效样本
② 推荐层
- 基于用户CF:找到相似用户,召回高评分职位
- 基于物品CF:找到相似职位,按交互历史排序
- 冷启动:热门职位补充;可手动切换算法
③ 可视化层
- 数据大屏:全国职位分布地图、TOP城市柱状图
- 薪资散点图:学历 vs 薪资
- 词云:jieba分词+TF-IDF展示热门技能
- 饼环图:学历、经验、公司规模占比
④ 安全层
- JWT登录+注册
- 百度AI身份证OCR,实名认证防刷
⑤ 管理层
- 后台管理:职位、用户、评论、推荐结果、爬虫任务监控
- 一键重新训练推荐模型,实时热更新
4、核心代码
import os
import time
from flask import Flask, send_from_directory, request
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow
from werkzeug.utils import secure_filename, redirect
from api.alipayApi import payBp
from api.baiduApi import idocr
from base.core import JSONEncoder
from base.response import ResMsg
from api.testApi import bp
import logging
app = Flask(__name__)
app.register_blueprint(bp, url_prefix='/test')
# app.register_blueprint(movieBp, url_prefix='/movie')
app.register_blueprint(payBp, url_prefix='/alipay')
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost/flask_job'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['JSON_AS_ASCII'] = False
app.config['SECRET_KEY'] = 'KJDFLSjfldskj'
UPLOAD_FOLDER="upload"
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
basedir = os.path.abspath(os.path.dirname(__file__))
ALLOWED_EXTENSIONS = set(['txt','png','jpg','xls','JPG','PNG','gif','GIF'])
# 日志系统配置
handler = logging.FileHandler('error.log', encoding='UTF-8')
logging_format = logging.Formatter(
'%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s')
handler.setFormatter(logging_format)
app.logger.addHandler(handler)
# 返回json格式转换
app.json_encoder = JSONEncoder
db = SQLAlchemy(app)
ma = Marshmallow(app)
from api.userApi import userBp
from api.jobApi import jobBp
app.register_blueprint(userBp, url_prefix='/user')
app.register_blueprint(jobBp, url_prefix='/job')
@app.route('/test')
def test(): # put application's code here
res = ResMsg()
test_dict = dict(name="zhang", age=19)
res.update(data=test_dict, code=0)
return res.data
@app.errorhandler(500)
def special_exception_handler(error):
app.logger.error(error)
return '请联系管理员', 500
#判断文件后缀
def allowed_file(filename):
return '.' in filename and filename.rsplit('.',1)[1] in ALLOWED_EXTENSIONS
@app.route('/file/upload', methods=['POST'], strict_slashes=False)
def api_upload():
res = ResMsg()
file_dir=os.path.join(basedir, app.config['UPLOAD_FOLDER'])
if not os.path.exists(file_dir):
os.makedirs(file_dir)
f = request.files['myfile']
if f and allowed_file(f.filename):
fname = f.filename
# fname = secure_filename(f.filename)
print(fname)
ext = fname.rsplit('.', 1)[1]
unix_time = int(time.time())
new_filename = str(unix_time)+'.'+ext
f.save(os.path.join(file_dir, new_filename))
res.update(data=new_filename, code=0)
return res.data
@app.route('/file/idocr', methods=['POST'], strict_slashes=False)
def api_id_ocr():
res = ResMsg()
file_dir=os.path.join(basedir, app.config['UPLOAD_FOLDER'])
if not os.path.exists(file_dir):
os.makedirs(file_dir)
f = request.files['myfile']
if f and allowed_file(f.filename):
fname = f.filename
# fname = secure_filename(f.filename) 有中文这个会有问题
# print(fname)
ext = fname.rsplit('.', 1)[1]
unix_time = int(time.time())
new_filename = str(unix_time)+'.'+ext
f.save(os.path.join(file_dir, new_filename))
idno = idocr(new_filename)[0]
name = idocr(new_filename)[1]
res.update(data=dict(idno=idno,pic=new_filename,name=name), code=0)
return res.data
@app.route('/file/download/<filename>/')
def api_download(filename):
# print('下载..' + filename)
return send_from_directory('upload', filename, as_attachment=False)
if __name__ == '__main__':
# app.run(debug=True,host='0.0.0.0',port=5000)
app.run()
5、源码获取方式
🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看【用户名】、【专栏名称】就可以找到我啦🍅
感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻
更多推荐


所有评论(0)