基于spark分析以springboot为后段vue为前端的大学生就业管理系统

基于spark分析以springboot为后段vue为前端的大学生就业管理系统

大学生就业管理系统是一个针对高校毕业生就业信息管理的有效工具,它能够帮助学校和学生更好地管理就业数据,提供数据驱动的决策支持。本文将介绍如何通过爬虫采集数据,利用Spark进行数据分析处理,再结合Spring Boot后端服务和Vue前端技术,搭建一个功能全面的大学生就业管理系统。

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

1. 数据采集

1.1 爬虫设计
首先,我们需要设计一个爬虫程序来从猎聘网采集数据。爬虫程序应该具备以下功能:
**数据提取:**精确提取职位描述、要求、薪资等关键信息。
**异常处理:**能够处理网络请求失败、页面结构变化等异常情况。

import csv
import time

import requests
import execjs

from csv2mysql import sync_data2db


# f = open('../storage/data.csv', mode='a', encoding='utf-8')
# csv_writer = csv.DictWriter(f,fieldnames=[
#         '职位',
#         '城市',
#         '薪资',
#         '经验',
#         '标签',
#         '公司',
#         '公司领域',
#         '公司规模'])
# csv_writer.writeheader()

def read_js_code():
    f = open('demo.js', encoding='utf-8')
    txt = f.read()
    js_code = execjs.compile(txt)
    ckId = js_code.call('r', 32)
    return ckId


def post_data():
    read_js_code()
    url = "https://api-c.liepin.com/api/com.liepin.searchfront4c.pc-search-job"
    headers = {
   
        'Accept': 'application/json, text/plain, */*',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Sec-Ch-Ua-Platform': 'macOS',
        'Content-Length': '398',
        'Content-Type': 'application/json;charset=UTF-8;',
        'Host': 'api-c.liepin.com',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
        'Origin': 'https://www.liepin.com',
        'Referer': 'https://www.liepin.com/',
        'Sec-Ch-Ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"',
        'Sec-Ch-Ua-Mobile': '?0',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-site',
        'X-Client-Type': 'web',
        'X-Fscp-Bi-Stat': '{"location": "https://www.liepin.com/zhaopin"}',
        'X-Fscp-Fe-Version': '',
        'X-Fscp-Std-Info': '{"client_id": "40108"}',
        'X-Fscp-Trace-Id': '52262313-e6ca-4cfd-bb67-41b4a32b8bb5',
        'X-Fscp-Version': '1.1',
        'X-Requested-With': 'XMLHttpRequest',
    }
    list = ["H01$H0001", "H01$H0002",
            "H01$H0003", "H01$H0004", "H01$H0005",
            "H01$H0006", "H01$H0007", "H01$H0008",
            "H01$H0009", "H01$H00010", "H02$H0018", "H02$H0019", "H03$H0022",
            "H03$H0023", "H03$H0024", "H03$H0025", "H04$H0030", "H04$H0031",
            "H04$H0032", "H05$H05", "H06$H06", "H07$H07", "H08$H08"]
    for name in list:
        print("-------{}---------".format(name))
        for i in range(10):
            print("------------第{}页-----------".format(i))
            data = {
   "data": {
   "mainSearchPcConditionForm":
                                 {
   "city": "410", "dq": "410", "pubTime": "", "currentPage": i, "pageSize": 40,
                                  "key": "",
                                  "suggestTag": "", "workYearCode": "1", "compId": "", "compName": "", "compTag": "",
                                  "industry": name, "salary": "", "jobKind": "", "compScale": "", "compKind": "",
                                  "compStage": "",
                                  "eduLevel": ""},
                             "passThroughForm":
                                 {
   "scene": "page", "skId": "z33lm3jhwza7k1xjvcyn8lb8e9ghxx1b",
                                  "fkId": "z33lm3jhwza7k1xjvcyn8lb8e9ghxx1b",
                                  "ckId": read_js_code(),
                                  'sfrom': 'search_job_pc'}}}
            response = requests.post(url=url, json=data, headers=headers)
            time.sleep(2)
            parse_data(response)


def parse_data(response):
    try:
        jobCardList = response.json()['data']['data']['jobCardList']
        sync_data2db(jobCardList)
    except Exception as e:
        return
def sync_data2db(jobCardList):
    try:
        with connection.cursor() as cursor:
            for job in jobCardList:
                placeholders = ', '.join(['%s'] * (8))
                insert_query = f"INSERT INTO data1 (title,city,salary,campus_job_kind,labels,compName,compIndustry,compScale) VALUES ({
     placeholders})"
                print(job['job']['title'], job['job']['dq'].split("-")[0], process_salary(job['job']['salary']),
                                    job['job']['campusJobKind'] if 'campusJobKind' in job['job'] else '应届'
                                    , job['job']['labels'], job['comp']['compName'], job['comp']['compIndustry'], job['comp']['compScale'])
                cursor.execute(insert_query,
                                   (job['job']['title'], job['job']['dq'].split("-")[0], process_salary(job['job']['salary']),
                                    job['job']['campusJobKind'] if 'campusJobKind' in job['job'] else '应届'
                                    , job['job']['labels'], job['comp']['compName'], job['comp']['compIndustry'], job['comp']['compScale']))
        connection.commit()
    finally:
        connection.close()


if __name__ == '__main__':
    post_data()

在这里插入图片描述

2. 数据处理

2.1 数据清洗
采集到的数据可能包含噪声、缺失值或不一致的格式,需要进行数据清洗。使用Apache Spark进行数据处理,它能够高效地处理大规模数据集。这个过程主要通过spark将数据分析处理后的数据写入mysql。
**去除无用信息:**如广告、版权声明等。
**缺失值处理:**填充或删除缺失的数据。

from pyspark.sql import SparkSession
from pyspark.sql.types import StringType, StructType


def read_data_from_csv(path):

    schema = StructType() \
          .add("recruitment_positions",StringType(),True) \
          .add("recruitment_city",StringType(),True) \
          .add("recruitment_salary",StringType(),True) \
          .add("recruitment_experience",StringType(),True) \
          .add("recruitment_skills",StringType(),True) \
          .add("recruitment_company",StringType(),True) \
          .add("recruitment_industry",StringType(),True) \
          .add("recruitment_scale",StringType(),True)

    df = spark.read\
          .option("header", True)\
          .schema(schema)\
          .csv(path)

    return df

def data_ana(df):

    df.createTempView("job")

    df = spark.sql("""
    select 
    recruitment_positions,
    recruitment_salary,
    recruitment_skills as recruitment_requirements,
    recruitment_experience,
    '本科' as recruiting_educational_qualifications,
    recruitment_company,
    recruitment_scale as company_stage,
    recruitment_industry,
    recruitment_skills,
    recruitment_city,
    recruitment_city as recruitment_area,
    recruitment_city as recruitment_address,
    recruitment_scale
    from job
    """)

    df.show()
    return df

def write_data2mysql(df):

    df.write.format("jdbc") \
        .option("url", "jdbc:mysql://localhost:3306/project05928") \
        .option("driver", "com.mysql.jdbc.Driver") \
        .option("dbtable", "recruitment_data") \
        .option("user", "root") \
        .option("password", "12345678") \
        .mode("append") \
        .save()


if __name__ == '__main__':
    spark = SparkSession.builder \
          .enableHiveSupport()\
          .config("spark.driver.extraClassPath","../lib/mysql-connector-java-8.0.30.jar")\
          .getOrCreate()
    df = read_data_from_csv("../data_prepare/data.csv")
    df = data_ana(df)

    write_data2mysql(df)

    spark.stop()

在这里插入图片描述

  1. 数据库设计
    设计MySQL数据库表结构,存储处理后的数据。
DROP TABLE IF EXISTS `slides`;
CREATE TABLE `slides` (
  `slides_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '轮播图ID:',
  `title` varchar(64) DEFAULT NULL COMMENT '标题:',
  `content` varchar(255) DEFAULT NULL COMMENT '内容:',
  `url` varchar(255) DEFAULT NULL COMMENT '链接:',
  `img` varchar(255) DEFAULT NULL COMMENT '轮播图:',
  `hits` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '点击量:',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间:',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间:',
  PRIMARY KEY (`slides_id`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='轮播图';
DROP TABLE IF EXISTS `auth`;
CREATE TABLE `auth` (
  `auth_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '授权ID:',
  `user_group` varchar(64) DEFAULT NULL COMMENT '用户组:',
  `mod_name` varchar(64) DEFAULT NULL COMMENT '模块名:',
  `table_name` varchar(64) DEFAULT NULL COMMENT '表名:',
  `page_title` varchar(255) DEFAULT NULL COMMENT '页面标题:',
  `path` varchar

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/520268.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【cpp】快速排序优化

标题:【cpp】快速排序 水墨不写bug 正文开始: 快速排序的局限性: 虽然快速排序是一种高效的排序算法,但也存在一些局限性: 最坏情况下的时间复杂度:如果选择的基准元素不合适,或者数组中存在大…

【C++】c++11新特性(一)

目录 { }列表初始化 内置类型---对单值变量及数组的初始化 列表初始化时进行的类型转换 自定义类型---对类对象或结构的初始化 initializer_list 1. 定义接受 initializer_list 参数的构造函数 2. 在函数中使用 initializer_list 参数 3. 使用 initializer_list 与 vect…

教你网络安全

如今,组织的信息系统和数据面临着许多威胁。而人们了解网络安全的所有基本要素是应对这些威胁的第一步。 网络安全是确保信息完整性、机密性和可用性(ICA)的做法。它代表了应对硬盘故障、断电事故,以及来自黑客或竞争对手攻击等防御和恢复能力。而后者包…

Android14应用启动流程(源码+Trace)

1.简介 应用启动过程快的都不需要一秒钟,但这整个过程的执行是比较复杂的,无论是对手机厂商、应用开发来说启动速度也是核心用户体验指标之一,本文采用Android14源码与perfetto工具进行解析。 源码参考地址:Search trace分析工…

基于单片机多功能MP3播放器系统设计

**单片机设计介绍,基于单片机多功能MP3播放器系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机多功能MP3播放器系统设计是一个结合了硬件和软件设计的复杂项目。以下是对该系统设计的概要描述&#…

初识二叉树和二叉树的基本操作

目录 一、树 1.什么是树 2. 与树相关的概念 二、二叉树 1.什么是二叉树 2.二叉树特点 3.满二叉树与完全二叉树 4.二叉树性质 相关题目: 5.二叉树的存储 6.二叉树的遍历和基本操作 二叉树的遍历 二叉树的基本操作 一、树 1.什么是树 子树是不相交的;…

Github 2024-04-06Rust开源项目日报Top10

根据Github Trendings的统计,今日(2024-04-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10HTML项目1Dart项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero General …

docker + miniconda + python 环境安装与迁移(详细版)

本文主要列出从安装dockerpython环境到迁移环境的整体步骤。windows与linux之间进行测试。 简化版可以参考:docker miniconda python 环境安装与迁移(简化版)-CSDN博客 目录 一、docker 安装和测试 二、docker中拉取miniconda&#xff…

C语言--指针终章

目录 1. sizeof和strlen的对⽐ 1.1 sizeof 1.2 strlen 1.3 sizeof 和 strlen的对⽐ 2. 数组和指针的理解——题目理解 2.1.sizeof 代码1: 代码2: 代码3: 代码4: 代码5(二维数组): 2.2…

【蓝桥杯-单链表-网络寻路】

蓝桥杯-单链表-网络寻路 单链表基本操作操作一:向链表头插入一个数操作二:在第 k个插入的数后插入一个数操作三:删除第 k个插入的数后面的一个数; P8605 [蓝桥杯 2013 国 AC] 网络寻路 单链表基本操作 初始化有关操作 // head 表示头结点的…

Debian12 使用 nginx 与 php8.2 使用 Nextcloud

最近将小服务器升级了下系统,使用了 debian12 的版本,正好试试 nginx 和 php-fpm 这种方式运行 Nextcloud 这个私有云的配置。 一、基本系统及应用安装 系统:debian12 x86_64 位版本最小安装,安装后可根据自己需求安装一些工具&…

如何优化TCP?TCP的可靠传输机制是什么?

在网络世界中,传输层协议扮演着至关重要的角色,特别是TCP协议,以其可靠的数据传输特性而广受青睐。然而,随着网络的发展和数据量的激增,传统的TCP协议在效率方面遭遇了挑战。小编将深入分析TCP的可靠性传输机制&#x…

【C++初阶】 vector 在OJ中的使用

前言: 🎯个人博客:Dream_Chaser 🎈博客专栏:C 📚本篇内容:只出现一次的数字 和 杨辉三角 OJ 目录 一、只出现一次的数字 题目描述: 二、杨辉三角OJ 题目描述: 一、只…

vue快速入门(七)内联语句

注释很详细&#xff0c;直接上代码 上一篇 新增内容 button点击事件绑定内联语句写法与要求 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

phpstorm设置头部注释和自定义注释内容

先说设置位置&#xff1a; PhpStorm中文件、类、函数等注释的设置在&#xff1a;setting-》Editor-》FIle and Code Template-》Includes-》PHP Function Doc Comment下设置即可&#xff0c;其中方法的默认是这样的&#xff1a; /** ${PARAM_DOC} #if (${TYPE_HINT} ! "…

【第九篇】使用BurpSuite进行编码与解码

Burp存在一个功能&#xff0c;可以识别包含不透明数据&#xff08;例如会话令牌&#xff09;的消息。 如图&#xff1a;如果 Burp 识别所选内容的编码格式&#xff0c;它会自动解码数据。解码后的文本显示在 Inspector面板中。 在编码工具模块中&#xff0c;可对数据进行重复解…

C. MEX Game 1

本题如果我们去模拟这个算法的话会很麻烦&#xff0c;也会TLE&#xff0c;首先我们想 1&#xff0c;对于alice来说&#xff0c;先取小的&#xff0c;对于bob来说先删除alic想取的下一个小的 2&#xff0c;那如果这个数多于两个&#xff0c;那也就是说&#xff0c;alice肯定能…

电工技术学习笔记——正弦交流电路

一、正弦交流电路 1. 正弦量的向量表示法 向量表示方法&#xff1a;正弦交流电路中&#xff0c;相量表示法是一种常用的方法&#xff0c;用于描述电压、电流及其相位关系。相量表示法将正弦交流信号表示为复数&#xff0c;通过复数的运算来描述电路中各种参数的相互关系 …

C/C++预处理过程

目录 前言&#xff1a; 1. 预定义符号 2. #define定义常量 3. #define定义宏 4. 带有副作用的宏参数 5. 宏替换的规则 6. 宏和函数的对比 7. #和## 8. 命名约定 9. #undef 10. 命令行定义 11. 条件编译 12. 头文件的包含 13. 其他预处理指令 总结&#x…

IP地址:是给主机配置的,还是给网卡配置的?

在探索网络的奥秘时&#xff0c;我们经常会遇到一个看似简单但又复杂的问题&#xff1a;IP地址到底是配置在主机上&#xff0c;还是配置在网卡上&#xff1f;为什么我们通常说的是“主机IP地址”呢&#xff1f;让我们一起深入探讨。 1. 网卡与IP地址 &#x1f5a5;️&#x1f…