基于Python Flask物流行业招聘可视化分析系统(获取方式访问文末官网)
一、项目简介
本系统是一款基于Python Flask的IT行业招聘可视化分析平台,旨在为行业用户提供全面的招聘市场分析支持。通过爬虫技术采集国内IT行业的招聘信息,系统将实时的岗位数据存储于数据库中,并利用Echarts进行可视化呈现。系统的可视化模块包括城市招聘岗位数量统计、学历要求分析、公司规模分析、岗位轮播表、整体岗位数据统计、城市平均薪资、经验与薪资关系、招聘要求词云以及薪资范围分析等,帮助用户深入了解IT行业的招聘状况和市场需求。
后台系统支持用户登录、注册、公告管理、岗位数据管理等功能,确保用户能在一个安全、便捷的平台上进行数据操作和分析。系统不仅适用于企业招聘人员,也可为行业分析师提供决策支持。该平台结合大数据采集与可视化分析的技术优势,为IT行业的招聘市场洞察提供了准确且易于理解的数据分析工具。
二、开发环境
开发环境 | 版本/工具 |
---|---|
PYTHON | 3.10.9 |
开发工具 | PyCharm |
操作系统 | Windows 10 |
内存要求 | 8GB 以上 |
浏览器 | Firefox (推荐)、Google Chrome (推荐)、Edge |
数据库 | MySQL 8.0 (推荐) |
数据库工具 | Navicat Premium 15 (推荐) |
项目框架 | FLASK |
三、项目技术
Python: 作为开发语言,用于编写后端逻辑和数据处理。
Flask: Python的Web框架,用于搭建后端数据接口和处理HTTP请求。
PyMySQL: 用于Python与MySQL数据库的交互,实现数据的存储和读取。
Echarts: JavaScript的数据可视化库,将数据转化为图表形式展示给用户。
LAYUI: 轻量级前端UI框架,用于构建用户友好的交互界面。
JavaScript: 用于实现前端交互和处理用户输入。
HTML和CSS: 用于构建前端界面和样式设计。
pandas和numpy: Python的数据处理和分析。
AJAX: 用于实现前后端数据交互,异步请求后端数据接口。
MySQL: 数据库管理系统,用于持久化数据。
四、功能结构
该本系统的功能模块涵盖数据采集与入库、前台数据展示与后台管理三部分:
数据采集与入库:通过爬虫技术实时采集IT行业的招聘信息,并将数据清洗、处理后存储到数据库中,为后续分析提供数据支撑。
数据可视化分析:使用Echarts进行多维度的招聘数据展示,包括:
-
城市招聘岗位数量统计:展示各城市的岗位数量分布,方便了解区域招聘热度。
-
学历要求分析:统计各岗位的学历需求情况,帮助企业和求职者了解学历对招聘的影响。
-
公司规模分析:分析不同公司规模的岗位数量,为人才市场提供行业需求洞察。
-
岗位轮播表格:动态展示最新岗位信息。
-
城市平均薪资与年限薪资分析:统计各城市薪资水平及经验与薪资的关系。
-
招聘要求词云与薪资范围分析:通过词云和薪资区间分析,展示常见招聘要求和薪资分布。
后台管理系统:包括用户登录、注册、公告管理、岗位数据管理等功能,确保用户在系统中的数据操作安全便捷。
五、运行截图
可视化页面
登录页面
注册页面
后台首页
用户管理
公告管理
数据管理模块页面
六、数据库设计
表名:job
字段名 | 数据类型 | 长度 | 允许为空 | 默认值 | 描述 |
---|---|---|---|---|---|
id | int | None | NO | None | 编号 |
job_name | varchar | 255 | YES | None | 职位名称 |
start_year | char | 2 | YES | None | 起始经验年限 |
end_year | char | 2 | YES | None | 结束经验年限 |
edu | varchar | 255 | YES | None | 学历 |
start_sal | varchar | 10 | YES | None | 起始薪水 |
end_sal | varchar | 10 | YES | None | 上限薪水 |
company | varchar | 255 | YES | None | 招聘公司 |
tag | varchar | 255 | YES | None | 标签(融资等) |
peoples | varchar | 255 | YES | None | 人数规模 |
loc | varchar | 255 | YES | None | 地区 |
req | longtext | 4294967295 | YES | None | 要求 |
表名:notice
字段名 | 数据类型 | 长度 | 允许为空 | 默认值 | 描述 |
---|---|---|---|---|---|
id | int | None | NO | None | |
title | varchar | 255 | YES | None | 公告标题 |
content | longtext | 4294967295 | YES | None | 公告内容 |
user_name | varchar | 50 | YES | None | 发布人 |
create_time | datetime | None | YES | CURRENT_TIMESTAMP | 发布时间 |
表名:user
字段名 | 数据类型 | 长度 | 允许为空 | 默认值 | 描述 |
---|---|---|---|---|---|
id | int | None | NO | None | |
name | varchar | 255 | YES | None | 用户名称(供应商名称) |
account | varchar | 255 | YES | None | 用户账号 |
password | varchar | 255 | YES | None | 用户密码 |
company | varchar | 255 | YES | None | 企业名称 |
varchar | 255 | YES | None | 邮箱 | |
type | int | None | YES | None | 0管理员,1普通用户 |
status | int | None | YES | None | 0禁用1启用 |
七、功能实现
爬虫解析职位数据核心代码
def parse_html(self, html,filename):
li_list = html.xpath('//div[@class="search-job-result"]//ul[@class="job-list-box"]/li') # 获取职位列表
for li in li_list:
job_name = li.xpath('.//span[@class="job-name"]/text()')[0] # 工作名称
experiences = li.xpath('//*[@id="wrap"]/div[2]/div[2]/div/div[1]/div[2]/ul/li[1]/div[1]/a/div[2]/ul//text()') # 年限要求
if not experiences:
experiences = li.xpath('//*[@id="wrap"]/div[2]/div[2]/div/div[1]/div[1]/ul/li[1]/div[1]/a/div[2]/ul//text()') # 年限要求
# print(experiences)
experience = experiences[0] if len(experiences)<3 else experiences[1]
education = experiences[-1]
salary = li.xpath('.//div[@class="job-info clearfix"]/span/text()')[0] # 薪资待遇
other = ''
detail_url = ''
company_name = li.xpath('.//div[@class="company-info"]//h3/a/text()')[0] # 公司名称
companyinfo = li.xpath('.//div[@class="company-info"]//ul/li//text()')
type = companyinfo[1] if len(companyinfo)>2 else companyinfo[0] # 公司类型
numbers = companyinfo[-1] # 公司规模
location = li.xpath('.//span[@class="job-area"]/text()')[0] # 工作地点
words = li.xpath('.//div[@class="job-card-footer clearfix"]/ul[@class="tag-list"]//text()')
words = ','.join(words)
# print(words)
with open(filename, encoding = 'utf-8', mode = 'a', newline = '') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(
[job_name, experience, education, salary, other, detail_url, company_name, type, numbers, location,
words])
def run(self,jobname,city,filename):
asyncio.get_event_loop().run_until_complete(self.main(jobname,city,filename)) # 运行异步任务
数据处理入库核心代码
def entry_del_data():
'''
聚合数据清洗入口
'''
print("Info:数据清洗入库开始......")
sql_list = gen_sql(read_all_csv("data"))
sqlManager = SQLManager()
sqlManager.get_one("TRUNCATE job;")
for item_sql in sql_list:
# print(item_sql)
sqlManager.instert(item_sql)
sqlManager.close()
print("Info:数据清洗入库完成......")
招聘要求数据分析词云核心代码
# 招聘要求数据分析词云
def total_data():
sqlManager = SQLManager()
total_sql = "SELECT count(*) as num FROM `job`"
avg_sql = "SELECT ROUND(avg(start_sal+end_sal)/2, 2) as avgsal FROM `job`"
com_sql = "SELECT COUNT(*) AS num FROM (SELECT COUNT(*) FROM `job` GROUP BY company) AS subquery;"
total_data = sqlManager.get_one(total_sql)['num']
avg_data = sqlManager.get_one(avg_sql)['avgsal']
com_data = sqlManager.get_one(com_sql)['num']
return {'total': total_data, 'avg': avg_data, 'com': com_data, 'citys': 4}
八、源码获取
源码、安装教程文档、项目简介文档以及其它相关文档已经上传到是云猿实战官网,可以通过下面官网进行获取项目!
标签:Python,招聘,下载方式,li,job,sql,薪资,div,文末 From: https://blog.csdn.net/m0_47220500/article/details/143355310