基于Python的51job招聘数据采集与可视化项目实践

  1. 项目背景与目标 在当今竞争激烈的就业市场中,深入分析招聘信息对于求职者和企业都具有重要意义。基于Python的51job招聘数据采集与可视化项目旨在通过自动化手段高效获取大量招聘信息,并对这些数据进行深度分析和展示。 51job作为中国领先的招聘网站,汇集了海量的招聘信息,涵盖各行各业,提供了极为丰富的数据源。通过采集这些数据,可以帮助我们了解当前的就业市场需求,岗位分布,薪资水平等关键信息。另一方面,随着数据科学和机器学习的发展,传统的人工分析方法已经无法满足大数据分析的需求。因此,使用Python进行数据采集和分析,不仅提高了效率,还可以利用多种数据分析和可视化工具,实现对招聘信息的全面解读。 项目目标主要利用Python爬虫技术,自动从51job网站上获取招聘信息,包括职位名称、公司、地点、薪资、要求等数据。对采集到的数据进行清洗和整理,确保数据的完整性和一致性。运用Python的数据分析库(如Pandas、NumPy等)对招聘数据进行分析,挖掘出有价值的趋势和模式。使用Matplotlib、Seaborn等可视化工具,将分析结果以图表形式展示,便于直观理解和决策支持。 通过该项目,可以为求职者提供更有针对性的求职建议,为企业制定招聘策略提供数据支持,进一步促进人力资源的合理配置。

  2. 数据采集 本项目采集51招聘网站招聘数据1400条,其中1000条存入csv,400条存入json文件。采集的网页信息如下图:

  3. 数据采集项目主要使用Python的Selenium库和BeautifulSoup库来自动化抓取51job网站的招聘信息,并将其存储到本地文件csv和json文件中。 首先,通过Selenium库启动Chrome浏览器,并设置一些选项来规避反爬虫机制。login函数负责打开51job网站,并根据输入的关键词(如"python")进行搜索。在搜索结果页面,代码通过BeautifulSoup解析网页内容,提取每个招聘信息的具体细节,如岗位名称、公司名称、薪资、城市、区县、行业、标签、企业性质、企业人数和回复情况。 在每一页的招聘信息提取完毕后,程序会点击“下一页”按钮,继续抓取下一页的内容,直到预定的页数(如5页)结束。提取的信息以字典形式存储,并使用json库将其保存到本地的51招聘.json文件中,确保每条数据都成功存入,存入json主要代码如下图。
  4. 存入csv主要代码如下图:
  5. 项目通过Selenium实现自动化浏览和操作,有效避免了手动数据收集的繁琐,同时使用BeautifulSoup进行网页解析,确保数据的准确提取。整个流程包括网页的加载、数据提取、翻页操作以及数据的本地存储,确保了数据采集的高效性和全面性。采集结果如下图:
  6. 数据处理
  7. 3.1 数据集成
  8. 数据集成主要通过以下几个步骤实现: 首先,读取两个数据源:一个JSON文件和一个CSV文件。从存储招聘信息的JSON文件和CSV文件中读取数据。利用pandas库,将这些数据转换为DataFrame格式以便于后续操作。通过json.loads逐行读取JSON文件中的招聘数据,并将其添加到一个列表中,随后使用pd.DataFrame将列表转换为数据框。接着,代码读取CSV文件中的数据,并将两个数据框通过pd.concat合并为一个。集成后数据集信息如下图。

  9. 3.2 数据清洗 通过df.drop_duplicates函数删除重复记录,并重置索引。接下来,处理缺失值和异常值。填充缺失值时,将“性质”列的缺失值填充为“未知”,然后删除所有包含缺失值的行。数据标准化方面,主要针对“薪资”列进行了单位换算,将不同格式的薪资统一转换为“万/年”的格式,并将转换后的薪资列拆分为最小值和最大值两列。数据清洗后结果如下图:
  10. 3.3 数据变换 数据变换主要通过以下几个步骤实现,以便将原始数据转换为可分析的格式: 针对薪资数据,定义了一个convert_salary函数,用于将各种格式的薪资统一转换为“万/年”。这个函数处理不同单位(如“万”、“千”、“元/天”)的薪资,并进行相应的换算和格式转换。转换后的薪资数据被拆分为最小值和最大值两列,以便后续分析,薪资数据变换结果如下图:
  11. 行业数据也进行了分词和统计。通过将“行业”列中的数据按“/”分割,统计每个行业的频次,生成一个包含行业和其对应频次的字典。
  12. 3.4 数据规约 数据规约的实现旨在减少数据量,同时保留数据的主要特征,以便提高分析和处理的效率。数据规约具体实现如下: 1、通过删除重复数据来减少数据量。利用drop_duplicates方法,依据‘公司’和‘岗位名’两个字段去重,并重置索引。 df.drop_duplicates(subset=['公司', '岗位名'], inplace=True) df.reset_index(drop=True, inplace=True) 2、删除缺失值较多的记录。在处理缺失值时,先将“性质”列的缺失值填充为“未知”,然后删除所有包含其他缺失值的行,从而减少不完整数据的影响。 df['性质'].fillna('未知', axis=0, inplace=True) df.dropna(axis=0, inplace=True) 3、通过单位换算,将不同单位的薪资数据统一转换为“万/年”的格式,并将转换后的薪资列拆分为最小值和最大值两列。这不仅标准化了数据格式,还减少了数据的复杂性。 df['薪资_g'] = df['薪资'].apply(convert_salary) df['薪资_g'] = df['薪资_g'].str.replace('万/年', '') df['薪资_min'] = df['薪资_g'].str.split('-', expand=True)[0].astype('float').round(1) df['薪资_max'] = df['薪资_g'].str.split('-', expand=True)[1].astype('float').round(1) 4、对冗余信息进行规约,例如通过合并标签中的重复项,实现对标签列的简化。 df['标签'] = df['标签'].apply(lambda x: ' '.join(set(x.split('-'))))
  13. 数据分析与可视化 1、词云图实现 实现词云图需要几个关键步骤,从文本准备到图像生成。下面详细描述了如何使用 stylecloud 库来生成词云图: 步骤一:安装必要的库 安装 stylecloud 和其他必要的库 步骤二:准备文本数据 首先,准备好生成词云的文本数据。从 DataFrame 中提取了标签并将其组合成一个文本字符串 text: # 将标签列表转换为文本 text = ' '.join(df['标签'].tolist()) 这一步将所有标签合并为一个字符串,生成词云时会根据词频来决定每个词的大小和位置。 步骤三:生成词云图 使用 stylecloud 库生成词云图非常简单。需要指定文本、字体路径、颜色、图标以及背景颜色等参数。代码如下: import stylecloud # 指定字体文件路径 font_path = 'simhei.ttf' # 使用本地的黑体字体文件 # 使用 stylecloud 生成词云图 stylecloud.gen_stylecloud( text=text, # 文本数据 font_path=font_path, # 字体路径 palette='cartocolors.qualitative.Bold_5', # 颜色方案 max_font_size=100, # 最大字体大小 icon_name='fas fa-yen-sign', # 图标形状 background_color='#f4f4f4', # 背景颜色 output_name='福利.jpg' # 输出文件名 ) 参数解释: text: 输入的文本数据,将会用于生成词云。 font_path: 字体文件路径,simhei.ttf 是常用的中文字体。 palette: 颜色方案,cartocolors.qualitative.Bold_5 是一个颜色方案的名字,可以根据需要调整。 max_font_size: 最大字体大小,控制词云中最大词的大小。 icon_name: 词云的形状,这里使用的是“人民币符号”,你可以更换为其他图标,例如 'fas fa-heart' (爱心)。 background_color: 词云图的背景颜色。 output_name: 输出文件的名称和格式。 步骤四:保存和查看词云图 词云图生成后,会自动保存为指定名称的文件(如 '福利.jpg')。可以在输出文件中查看词云效果。如下图:

  14. 2、招聘数量前20的区县数据柱形图实现 数据分组与统计: df.groupby('区县')['链接'].count() 对区县进行分组,统计每个区县的招聘链接数。 排序与选取: reset_index() 重置索引,sort_values(by='链接', ascending=False) 按招聘数量降序排列,取前20个数据。 柱形图绘制: plt.bar(x_data, y_data, color='skyblue') 绘制柱形图,设置柱形颜色为浅蓝色。 标题与标签: plt.title、plt.xlabel和plt.ylabel 添加标题和轴标签,明确图表内容。 这种方法清晰地展示了招聘数量最多的前20个区县,有助于了解招聘热点地区。如下图:
  15. 3、不同公司性质招聘数量分布实现 实现不同公司性质招聘数量分布,主要步骤包括数据分组、统计数量、绘制饼图等。数据分组与统计: df.groupby('性质')['链接'].count() 对公司性质进行分组,统计每种公司性质的招聘链接数量。 排序与重置索引: reset_index() 重置索引,sort_values(by='链接', ascending=False) 按招聘数量降序排列。 饼图绘制: plt.pie 绘制饼图,labels 参数设置标签,autopct 参数显示百分比,colors 参数设置颜色。 文本属性和标签距离: textprops={'fontsize': 12} 设置文本字体大小,labeldistance=1.05 设置标签距离。 图例与标题: plt.legend(fontsize=5) 添加图例并设置字体大小,plt.title 添加标题并设置字体大小。 通过这些步骤,生成了一个展示不同公司性质招聘数量分布的饼图,直观显示各类型公司在招聘市场中的占比。如下图:
  16. 总结与展望

  17. 总结

    在本项目中,我们通过Python实现了51job招聘数据的采集与可视化,数据采集方面,使用json库逐行读取JSON文件,将招聘评论数据存储在列表中,并转换为Pandas DataFrame。使用pandas.read_csv读取CSV文件,并合并两种数据源,保证数据的完整性。数据处理方面, 对数据进行去重、缺失值填补和处理。特别是对薪资字段进行单位转换,确保数据的一致性。 提取并处理招聘信息的关键特征,包括薪资、行业、城市分类等。使用正则表达式和自定义函数处理薪资数据。数据分析与可视化方面, 使用词云图展示招聘行业的分布情况,利用stylecloud库生成形象化的词云。分类和比较不同城市和行业的薪资水平,帮助用户理解薪资分布。绘制饼图展示不同公司性质的招聘数量分布,直观显示各类型公司的招聘需求。 使用柱形图展示招聘数量前20的区县数据,识别招聘热点地区。

    展望

    未来的改进和发展方向包括:

    (1)数据采集自动化:使用爬虫技术实时获取最新的招聘数据,确保数据的时效性。结合API接口,扩展数据来源,获取更多维度的招聘信息。

    (2)数据处理优化:增加数据清洗的自动化程度,减少人工干预,提高处理效率。引入更多的特征工程方法,如自然语言处理技术,深入挖掘文本信息。

    (3)高级数据分析:利用机器学习算法进行薪资预测、岗位匹配等高级分析,提供更具指导性的结果。引入地理信息系统(GIS)技术,进行更精细的地域分布分析。

    (4)可视化改进:使用交互式可视化工具(如Plotly、Bokeh),提升用户体验。

    开发Web应用或仪表盘,实现招聘数据的动态展示和分析结果的实时更新。

    (5)用户定制化服务:根据用户需求,提供个性化的分析报告和数据推送服务。

    结合用户反馈,不断优化数据分析模型和可视化效果。

    通过这些改进,项目可以更加全面、准确地分析招聘市场动态,为求职者和招聘方提供更具价值的信息和决策支持。

    参考文献

    [1] 基于Python的网页数据爬取与可视化分析[J]. 田雪丽;郭志斌;刘梦贤.电脑知识与技术,2022(06)

    [2] 基于Python的南京二手房数据爬取及分析[J]. 戴瑗;郑传行.计算机时代,2021(01)

    [3] Python爬虫技术的网页数据抓取与分析[J]. 徐志;金伟.数字技术与应用,2020(10)

    [4] Python招聘数据分析[J]. 葛琳;杨娜.计算机与网络,2020(16)

    [5] 基于Python的豆瓣图书数据的爬取与分析[J]. 张娇.晋城职业技术学院学报,2023(04).

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RockyLinux9上安装Nacos2.3.0(非Docker安装)

RockyLinux9上安装Nacos2.3.0 说明什么是Nacos下载并安装创建一个nacos-conf数据库修改application.properties文件 启动访问网址查看是否成功 开启访问鉴权 说明 本文采用的是:安装包安装,非Docker安装,系统采用的Rocky Linux9.4。   当前…

C++ 【 Open3D 】 读取、可视化并保存点云

一、读取常见点云 #include <iostream> #include <Open3D/Open3D.h>int main(int argc, char* argv[]) {std::string fileName("hand.pcd");auto cloud_ptr std::make_shared<open3d::geometry::PointCloud>();if (open3d::io::ReadPointCloud(f…

警钟!电池储能安全事故频发!物联网技术如何加强储能安全排查?

在新能源时代背景下&#xff0c;储能系统作为能源转型的关键支撑技术&#xff0c;其安全问题日益凸显&#xff0c;尤其是近期海外电池项目连续发生的事故&#xff0c;为全球储能行业敲响了警钟。面对这一挑战&#xff0c;物联网技术以其强大的数据采集、智能分析与远程监控能力…

Python基础知识——(002)

文章目录 P8——7. input函数的使用 基本的输入函数input P9——8. Python中的注释 P10——9. Python中的缩进与本章总结 本章总结 P11——10. 章节习题 P8——7. input函数的使用 基本的输入函数input 语法结构&#xff1a; x input(提示文字) 注意事项&#xff1a;无论输…

PMON的解读和开发

提示&#xff1a;龙芯2K1000PMON相关记录 文章目录 1 PMON的发展和编译环境PMONPMON2000 2 PMON2000的目录结构3 Targets目录的组成4 PMON编译环境的建立5 PMON2000的框架6 异常向量表7 Pmon的空间分配8 PMON的汇编部分(starto.S或sbdreset.S)的解读Start.SC代码部分dbginit 9 …

点云曲面提取

csdn是不是有有什么大bing&#xff1f;gif只能上传5m我吐了在线GIF动图压缩 - docsmall 在线GIF动图压缩工具,在线GIF动图压缩软件 代码整理中

单元测试Spring 上下文加载过程中遇到的阻塞或死锁问题

IDEA单元测试一直转圈&#xff0c;阻塞&#xff0c;前置后置的方法都不执行&#xff0c;无任何输出 1.单元测试类 SpringBootTest(classes {BareMetalApplication.class}) RunWith(SpringRunner.class) public class K8sUserNfsStoreInitServiceImplTest {BeforeEachpublic…

【结构性型模式-适配器模式】

定义 将一个类的接口转换成客户希望的另外一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的那些类能一起工作。 适配器模式分为类适配器模式和对象适配器模式&#xff0c;前者类之间的耦合度比后者高&#xff0c;且要求程序员了解现有组件库中的相关组件的内部结…

基于Java+SpringMvc+Vue技术的图书管理系统的设计与实现(60页论文参考)

博主介绍&#xff1a;硕士研究生&#xff0c;专注于Java技术领域开发与管理&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架构思想、较扎实的技术功底和资深的项目管理经…

RISC-V 指令系统

指令系统 指令集 指令集从本质上可以分为复杂指令集&#xff08;Complex Instruction Set Computing&#xff0c;CISC&#xff09;和精简指令集&#xff08;Reduced Instruction Set Computing&#xff0c;RISC&#xff09;两种。复杂指令集的特点是能够在一条指令内完成很多…

如何理解数据模型?颗粒度、维度及指标?

问题1 什么是数据模型&#xff1f; 数据模型反映在数据库中就是一张表&#xff0c;该表把他分开来看有以下关注的点。 &#xff08;1&#xff09;主键&#xff1a;表明该表主要的分析对象&#xff0c;比如我们的分析对象是订单、是商品、是门店&#xff0c;那么主键就是订单id,…

Qt 线程 QThread类详解

Qt 线程中QThread的使用 在进行桌面应用程序开发的时候&#xff0c; 假设应用程序在某些情况下需要处理比较复杂的逻辑&#xff0c; 如果只有一个线程去处理&#xff0c;就会导致窗口卡顿&#xff0c;无法处理用户的相关操作。这种情况下就需要使用多线程&#xff0c;其中一个…

昇思MindSpore学习笔记6-02计算机视觉--ResNet50迁移学习

摘要&#xff1a; 记录MindSpore AI框架使用ResNet50迁移学习方法对ImageNet狼狗图片分类的过程、步骤。包括环境准备、下载数据集、数据集加载、构建模型、固定特征训练、训练评估和模型预测等。 一、概念 迁移学习的方法 在大数据集上训练得到预训练模型 初始化网络权重参数…

【机器学习】特征选择:精炼数据,提升模型效能

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 特征选择&#xff1a;精炼数据&#xff0c;提升模型效能引言为何进行特征选择&a…

STM32的独立看门狗详解

目录 1.独立看门狗是什么&#xff1f; 2.独立看门狗的作用 3.独立看门狗的实现原理 4.独立看门狗用到的寄存器 4.1 IWDG_KR &#xff08;关键字计时器&#xff09; 4.2 IWDG_PR&#xff08;预分频寄存器&#xff09; 4.3 IWDG_RLR&#xff08;重装载寄存器&#xff09…

接口调用的三种方式

例子&#xff1a; curl --location http://110.0.0.1:1024 \ --header Content-Type: application/json \ --data {"task_id": 1 }方式一&#xff1a;postman可视化图形调用 方式二&#xff1a;Vscode中powershell发送请求 #powershell (psh) Invoke-WebRequest -U…

温州海经区管委会主任、乐清市委书记徐建兵带队莅临麒麟信安调研

7月8日上午&#xff0c;温州海经区管委会主任、乐清市委书记徐建兵&#xff0c;乐清市委常委、副市长叶序锋&#xff0c;乐清市委办主任郑志坚一行莅临麒麟信安调研&#xff0c;乐清市投资促进服务中心及湖南省浙江总商会相关人员陪同参加。麒麟信安董事长杨涛、总裁刘文清热情…

elasticsearch集群模式部署

系统版本&#xff1a;CentOS Linux release 7.9.2009 (Core) es版本&#xff1a; elasticsearch-7.6.2 本次搭建es集群为三个节点 添加启动用户 添加之前用户要是创建好了的(这里的es用户并不是绝对要求&#xff0c;你可以根据具体的需要命名创建) visudo 修改配置文件 sys…

【吊打面试官系列-MyBatis面试题】使用 MyBatis 的 mapper 接口调用时有哪些要求?

大家好&#xff0c;我是锋哥。今天分享关于 【使用 MyBatis 的 mapper 接口调用时有哪些要求&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 使用 MyBatis 的 mapper 接口调用时有哪些要求&#xff1f; 1、Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的…

数据结构(初阶1)

文章目录 一、复杂度概念 二、时间复杂度 2.1 大O的渐进表示法 2.2 时间复杂度计算示例 2.2.1. // 计算Func2的时间复杂度&#xff1f; 2.2.2.// 计算Func3的时间复杂度&#xff1f; 2.2.3.// 计算Func4的时间复杂度&#xff1f; 2.2.4.// 计算strchr的时间复杂度&#xff1f; …