基于Flask的岗位就业可视化系统(四)

发布于:2024-04-25 ⋅ 阅读:(16) ⋅ 点赞:(0)

前言

  • 本项目综合了基本数据分析的流程,包括数据采集(爬虫)、数据清洗、数据存储、数据前后端可视化等

  • 推荐阅读顺序为:数据采集——>数据清洗——>数据库存储——>基于Flask的前后端交互,有问题的话可以留言,有时间我会解疑~

  • 感谢阅读、点赞和关注

开发环境

  • 系统:Window 10 家庭中文版。
  • 语言:Python(3.9)、MySQL。
  • Python所需的库:pymysql、pandas、numpy、time、datetime、requests、etree、jieba、re、json、decimal、flask(没有的话pip安装一下就好)。
  • 编辑器:jupyter notebook、Pycharm、SQLyog。
    (如果下面代码在jupyter中运行不完全,建议直接使用Pycharm中运行)

文件说明

在这里插入图片描述
本项目下面有四个.ipynb的文件,下面分别阐述各个文件所对应的功能:(有py版本 可后台留言)

  • 数据采集:分别从前程无忧网站和猎聘网上以关键词数据挖掘爬取相关数据。其中,前程无忧上爬取了270页,有超过1万多条数据;而猎聘网上只爬取了400多条数据,主要为岗位要求文本数据,最后将爬取到的数据全部储存到csv文件中。

  • 数据清洗:对爬取到的数据进行清洗,包括去重去缺失值、变量重编码、特征字段创造、文本分词等。

  • 数据库存储:将清洗后的数据全部储存到MySQL中,其中对文本数据使用jieba.analyse下的extract_tags来获取文本中的关键词和权重大小,方便绘制词云。

  • 基于Flask的前后端交互:使用Python一个小型轻量的Flask框架来进行Web可视化系统的搭建,在static中有css和js文件,js中大多为百度开源的ECharts,再通过自定义controller.js来使用ajax调用flask已设定好的路由,将数据异步刷新到templates下的main.html中。

技术栈

  • Python爬虫:(requests和xpath
  • 数据清洗:详细了解项目中数据预处理的步骤,包括去重去缺失值、变量重编码、特征字段创造和文本数据预处理 (pandas、numpy
  • 数据库知识:select、insert等操作,(增删查改&pymysql) 。
  • 前后端知识:(HTML、JQuery、JavaScript、Ajax)。
  • Flask知识:一个轻量级的Web框架,利用Python实现前后端交互。(Flask

四、基于Flask的前后端交互

定义函数来获取数据库中的数据

导入模块

from flask import Flask as _Flask, jsonify, render_template
from flask.json import JSONEncoder as _JSONEncoder
import pandas as pd
import numpy as np
import pymysql, decimal, time

将清洗后的数据存储到sql中

def get_time():
    time_str = time.strftime("%Y{}%m{}%d{} %X")
    return time_str.format("年", "月", "日")


# 连接数据库
def get_con():
    con = pymysql.connect(host='localhost', user='用户名', password='密码', database='数据库名', charset='utf8')
    cursor = con.cursor()
    return con, cursor


# 关闭数据库
def con_close(con, cursor):
    if cursor:
        cursor.close()
    if con:
        con.close()


# 定义函数来执行单独一条sql语句
def query(sql):
    con, cursor = get_con()
    cursor.execute(sql)
    res = cursor.fetchall()
    con_close(con, cursor)
    return res

# 定义函数
def get_c1_data():
   ...


def get_c2_data():
    ...


def get_l1_data():
    ...


def get_l2_data():
    ...


def get_r1_data():
    ...


def get_r2_data():
    ...

...

使用flask框架进行网页的搭建

网页搭建思路:

首先,构造获取数据库特定数据的函数;

接着,在flask中设置相关路由,调用该函数,并return获取的数据;

然后,在main.html页面导入设定好的javascript脚本,脚本中使用ajax来接收路由的数据;

最后便将数据通过jquery来映射到html页面中,总体上实现了前后端交互的功能。

class JSONEncoder(_JSONEncoder):
    def default(self, o):
        if isinstance(o, decimal.Decimal):
            return float(o)
        super(_JSONEncoder, self).default(o)


class Flask(_Flask):
    json_encoder = JSONEncoder


app = Flask(__name__)


# 路由解析
@app.route('/')
def index():
    return render_template("main.html")


# 获取系统当前时间
@app.route('/time')
def get_time1():
    return get_time()


# 对数据库中的数据进行计数、薪资取平均值、省份和学历取众数
@app.route('/c1')
def get_c1_data1():
    data = get_c1_data()
    return jsonify({"employ": data[0], "avg_salary": data[1], "province": data[2], "edu": data[3]})


# 对省份进行分组,之后统计其个数
@app.route('/c2')
def get_c2_data1():
    res = []
    for tup in get_c2_data():
        res.append({"name": tup[0], "value": int(tup[1])})
    return jsonify({"data": res})


# 统计每个学历下公司数量和平均薪资(上下坐标折线图)
@app.route('/l1')
def get_l1_data1():
    data = get_l1_data()
    edu, sum_company, avg_salary = [], [], []
    for s in data:
        edu.append(s[0])
        sum_company.append(int(s[1]))
        avg_salary.append(float(s[2]))
    return jsonify({"edu": edu, "sum_company": sum_company, "avg_salary": avg_salary})


# 统计不同学历下公司所招人数和平均经验(折线混柱图)
@app.route('/l2')
def get_l2_data1():
    data = get_l2_data()
    edu, num, exp = [], [], []
    for s in data:
        edu.append(s[0])
        num.append(float(s[1]))
        exp.append(float(s[2]))
    return jsonify({'edu': edu, 'num': num, 'exp': exp})


# 统计不同类型公司所占的数量(饼图)
@app.route('/r1')
def get_r1_data1():
    res = []
    for tup in get_r1_data():
        res.append({"name": tup[0], "value": int(tup[1])})
    return jsonify({"data": res})


# 可视化词云
@app.route('/r2')
def get_r2_data1():
    d = []
    text, weight = get_r2_data()
    for i in range(len(text)):
        d.append({'name': text[i], 'value': weight[i]})
    return jsonify({"kws": d})


if __name__ == '__main__':
    app.run()

未加数据库效果图

在这里插入图片描述

添加加数据库效果图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述