基于Python网络爬虫的IT招聘就业岗位可视化分析推荐系统

文章目录

  • 基于Python网络爬虫的IT招聘就业岗位可视化分析推荐系统
    • 项目概述
    • 招聘岗位数据爬虫分析
    • 系统展示
      • 用户注册登录
      • 系统首页
      • IT招聘数据开发岗-java
      • IT招聘数据开发岗-Python
      • IT招聘数据开发岗-Android
      • IT招聘数据开发岗-其它招聘岗位数据分析
      • 算法方面
      • 运维方面
      • 测试方面
      • 招聘岗位薪资多维度精准预测
      • 招聘岗位分析推荐
    • 结语

基于Python网络爬虫的IT招聘就业岗位可视化分析推荐系统

项目概述

本项目旨在开发一个基于Python网络爬虫技术的IT招聘就业岗位可视化分析推荐系统。数据来源于Boss直聘招聘网站,采集到的各种岗位数据信息量合计在70万左右,数据精确真实可靠,本项目主要利用selenium、requests爬虫以及BeautifulSoup、numpy和Pandas等库进行数据的获取与分析处理。除此之外,项目还包括词云生成、数据分析、精准分析岗位算法推荐以及多维度薪资预测等功能,旨在为求职者提供全面的就业信息支持。

1.数据爬取与清洗:利用selenium和requests等库,结合BeautifulSoup解析HTML页面,从boss直聘等招聘网站上抓取相关数据。爬取的数据包括岗位名称、薪资、公司名称、公司规模、职位描述等。爬取后的数据需要进行清洗和预处理,确保数据的准确性和完整性。

2.词云生成:利用爬取的职位描述等文本数据,使用词云生成技术,将关键词可视化展示,帮助用户快速了解招聘岗位的主要特点和需求。

3.数据分析与可视化:利用Python的数据分析库(如Pandas、NumPy等)对爬取的数据进行分析,探索招聘市场的趋势、热门岗位、薪资水平等多维度、多层次招聘数据岗位关键信息。同时,利用可视化库(如Matplotlib、Echarts、Seaborn、Plotly等)生成直观、易于理解的图表和图形,提供给用户参考。

4.岗位算法推荐:根据用户输入的个人信息、技能和求职偏好,结合爬取的岗位数据,设计并实现精准分析岗位推荐给用户,为用户推荐匹配度较高的岗位,提高求职效率。

5.机器学习算法薪资预测:基于爬取的历史薪资数据以及其他相关因素,建立机器学习算法薪资预测模型,为用户提供对于不同岗位薪资水平的预测,帮助他们更好地评估职位的吸引力。

通过以上功能,本项目旨在为求职者提供一个综合性的就业信息平台,帮助他们更好地了解市场需求、制定求职策略,并通过推荐系统和薪资预测模型提供个性化的职位推荐和薪资参考,从而促进求职过程的顺利进行。

招聘岗位数据爬虫分析

通过selenium爬虫模块,能够快速准确的爬取所需要的详细招聘信息,可以精准爬取所需要的招聘岗位地区,城市,岗位名称,如’python’, ‘算法’, ‘测试’,'python’等不同IT岗位通过关键字都可以精确爬取。

然后将爬虫和数据处理接口全部封装到runtest脚本,完成所需要的招聘岗位数据爬虫及数据清洗。

#数据爬虫
 spider = bosszp_spider.Spider()
 spider.run()


#数据清洗
# #
handle = datahandle.DataHandle()
handle.run()

selenium爬取招聘岗位详细信息并进行数据清洗,这里我的chromedriver.exe版本是v110,一定选择浏览器所兼容支持的版本号。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

看下我之前爬取到的C语言招聘岗位详细数据信息
在这里插入图片描述

部分核心代码:

from selenium import webdriver
from bs4 import BeautifulSoup
import mysql


class Spider(object):

    def __init__(self):
        # 创建数据库对象
        self.__sql = mysql.MySql()
        # 无头浏览器开启
        self.__driver = webdriver.Chrome('spider/chromedriver.exe')
        # 隐式等待
        self.__driver.implicitly_wait(20)
        # 设置需要爬取的 【关键词】
        self.__keyword = ['c', 'java', 'python', 'web前端', '.net', 'u3d', 'c#', 'c++', '算法', 'ios', 'Android']
        #self.__keyword = ['.net', 'u3d', 'c#', 'c++', '算法', 'ios', 'Android']
        #self.__keyword = ['测试', '运维','算法', 'ios', 'Android']
        # self.__keyword = ['python']
        # self.__keyword = ['python', '算法', '测试']
        # self.__keyword = ['Android']

    def __del__(self):
        # 关闭无头浏览器,减少内存损耗
        self.__driver.quit()

    # 设置爬取关键词
    def setKeyword(self, keyword):
        self.__keyword = []
        if isinstance(keyword, list):
            self.__keyword = keyword
        else:
            var = str(keyword)
            var.strip()
            if " " in var:
                keyword_list = var.split(' ')
                self.__keyword = keyword_list
            else:
                self.__keyword.append(var)

    # 获取所有关键词
    def getKeyword(self):
        return self.__keyword

    # 爬虫方法
    def run(self):

        print(">>>开始获取...")

        # 城市json
        # 在下方设置需要爬取的【城市】

        cities = [{"name": "北京", "code": 101010100, "url": "/beijing/"},
                  {"name": "上海", "code": 101020100, "url": "/shanghai/"},
                  {"name": "广州", "code": 101280100, "url": "/guangzhou/"},
                  {"name": "深圳", "code": 101280600, "url": "/shenzhen/"},
                  # {"name": "杭州", "code": 101210100, "url": "/hangzhou/"},
                  # {"name": "天津", "code": 101030100, "url": "/tianjin/"},
                  # {"name": "西安", "code": 101110100, "url": "/xian/"},
                  # {"name": "苏州", "code": 101190400, "url": "/suzhou/"},
                  # {"name": "武汉", "code": 101200100, "url": "/wuhan/"},
                  # {"name": "厦门", "code": 101230200, "url": "/xiamen/"},
                  # {"name": "长沙", "code": 101250100, "url": "/changsha/"},
                  # {"name": "成都", "code": 101270100, "url": "/chengdu/"},
                  # {"name": "郑州", "code": 101180100, "url": "/zhengzhou/"},
                  # {"name": "重庆", "code": 101040100, "url": "/chongqing/"},
                  # {"name": "佛山", "code": 101280800, "url": "/foshan/"},
                  # {"name": "合肥", "code": 101220100, "url": "/hefei/"},
                  # {"name": "济南", "code": 101120100, "url": "/jinan/"},
                  # {"name": "青岛", "code": 101120200, "url": "/qingdao/"},
                  # {"name": "南京", "code": 101190100, "url": "/nanjing/"},
                  # {"name": "东莞", "code": 101281600, "url": "/dongguan/"},
                  # {"name": "福州", "code": 101230100, "url": "/fuzhou/"}
                  ..............................................
                  ]
        # 总记录数
        all_count = 0
        # 关键词爬取
        for key in self.__keyword:
            print('>>>当前获取关键词: "{}"'.format(key))
            # 单个关键词爬取记录数
            key_count = 0
            # 每个城市爬取
            for city in cities:
                print('>>>当前获取城市: "{}"'.format(city['name']))
                # 记录每个城市爬取数据数目
                city_count = 0
                # 只获取前十页
                urls = ['https://www.zhipin.com/c{}/?query={}&page={}&ka=page-{}'
                            .format(city['code'], key, i, i) for i in range(1, 11)]
                # 逐条解析
                for url in urls:
                    self.__driver.get(url)
                    # 获取源码,解析
                    html = self.__driver.page_source
                    bs = BeautifulSoup(html, 'html.parser')
                    # 获取搜索框,用于判断是否被异常检测
                    flag = bs.find_all('div', {'class': 'inner home-inner'})
                    # 主要信息获取
                    job_all = bs.find_all('div', {"class": "job-primary"})


                    # 解析页面
                    for job in job_all:
                        # 工作名称
                        job_name = job.find('span', {"class": "job-name"}).get_text()
                        # 工作地点
                        job_place = job.find('span', {'class': "job-area"}).get_text()
                        # 工作公司
                        job_company = job.find('div', {'class': 'company-text'}).find('h3', {'class': "name"}).get_text()
                        # 公司规模
                        job_scale = job.find('div', {'class': 'company-text'}).find('p').get_text()
                        # 工作薪资
                        job_salary = job.find('span', {'class': 'red'}).get_text()
                        # 工作学历
                        job_education = job.find('div', {'class': 'job-limit'}).find('p').get_text()[-2:]
                        # 工作经验
                        job_experience = job.find('div', {'class': 'job-limit'}).find('p').get_text()
                        # 工作标签
                        job_label = job.find('a', {'class': 'false-link'}).get_text()
                        # 技能要求
                        job_skill = job.find('div', {'class': 'tags'}).get_text().replace("\n", " ").strip()
                        # 福利
                        job_welfare = job.find('div', {'class': 'info-desc'}).get_text().replace(",", " ").strip()

                        #职位类型 追加
                        type=key

                        # 数据存储
                        self.__sql.saveData(job_name, job_place, job_company, job_scale, job_salary, job_education,
                                             job_experience,
                                             job_label,
                                             job_skill,
                                             job_welfare,type)
                            .......

最后爬取不同城市的详细真实IT招聘岗位数据大约70万条,爬的时间也挺久。

在这里插入图片描述

系统展示

启动项目 进入系统

http://127.0.0.1:8080/login.html

在这里插入图片描述

用户注册登录

在这里插入图片描述

系统首页

在这里插入图片描述

在这里插入图片描述

IT招聘数据开发岗-java

在这里插入图片描述

IT招聘数据开发岗-Python

在这里插入图片描述

IT招聘数据开发岗-Android

在这里插入图片描述

IT招聘数据开发岗-其它招聘岗位数据分析

其它 IT招聘岗位数据分析这里就不一一截图了。

非开发岗我这里爬取了3个,想爬取更多岗位,可以直接修改爬虫代码里面参数信息就行。

算法方面

在这里插入图片描述

运维方面

在这里插入图片描述

测试方面

在这里插入图片描述

招聘岗位薪资多维度精准预测

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

招聘岗位分析推荐

在这里插入图片描述

在这里插入图片描述

结语

后面有时间和精力也会分享更多关于大数据领域方面的优质项目内容,感谢各位的喜欢与支持!

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

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

相关文章

【多线程】volatile 关键字、wait 和 notify方法详解

volatile 、wait 和 notify 🌲volatile关键字🚩保证内存可见性🚩volatile 不保证原⼦性 🌳wait 和 notify方法🚩wait()🚩notify()🚩notifyAll()方法 ⭕wait 和 sleep 的对比( 面试题…

机器学习基础(四)非监督学习的进阶探索

导语:上一节我们详细探索监督学习的进阶应用,详情可见: 机器学习基础(三)监督学习的进阶探索-CSDN博客文章浏览阅读296次,点赞13次,收藏11次。监督学习作为机器学习的一个主要分支,…

RHEL9安装Python2.7

RHEL9作为2022年5月新推出的版本,较RHEL8有了很多地方的改进,而且自带很多包,功能非常强大,稳定性和流畅度也较先前版本有了很大的提升。RHEL9自带python3.9,但是过高版本的python不可避免地会导致一些旧版本包地不兼容…

【分布式事务 XA模式】MySQL XA模式详解

MYSQL中的XA事务 写在前面1. XA事务的基本原理2. MySQL XA事务操作 写在前面 MySQL 的 5.0.3 版本开始支持XA分布式事务,并且只有innoDB存储引擎支持XA事务。 1. XA事务的基本原理 XA事务本质上是一种基于两阶段提交的分布式事务,分布式事务可以理解成…

一些PCB整改优化经验总结

一个UP的PCB整改经验: 当正面全局铺铜之后出现很多小铜皮碎片的时候不如不铺铜或者单面铺铜RJ45网口的地和整体的地分开,两地之间通过电容相连(整板地一定要相连)TVS这种防浪涌高压的器件的地单独铺设,这样当高压来临…

《艾尔登法环 黄金树幽影》是什么?Mac电脑怎么玩《艾尔登法环》艾尔登法环下载

全体起立,《艾尔登法环 》最新DLC《黄金树幽影》将在6月21日发布,steam售价198元,现在就可以预订了。宫崎英高在接受FAMI通的采访时表示,新DLC的体量远超《黑暗之魂》和《血源诅咒》资料片。好家伙,别人是把DLC续作&am…

踩坑:SpringBoot连接Mysql的时区报错

解决方法:1.修改时区2.修改连接版本 目录 1.修改时区 2.切换版本 1.修改时区 查看mysql的默认时区 SELECT global.time_zone AS Global Time Zone, session.time_zone AS Session Time Zone; 查看mysqk的默认是时区返回两个结果 Global Time Zone:表示Mysql…

Jenkins中Publish Over SSH插件使用(1)

SSH插件 前言Publish Over SSH插件是jenkins里面必不可少的插件之一,主要的功能有两个把jenkins服务器上的文件,传输到远程nginx, 远程执行shell命令和脚本。 1. SSH插件下载与配置 1.1 下载Publish over SSH插件 系统管理—》管理插件 …

可控核聚变新里程碑!AI成功预测等离子体撕裂登Nature,清洁能源「圣杯」更近一步

可控核聚变,又有新突破了! 长期以来,核聚变一直受着一个「幽灵」的困扰——等离子体不稳定性问题。 而最近,普林斯顿团队用AI提前300毫秒预测了核聚变等离子不稳定态,这个时间,就足够约束磁场调整应对等离…

美团外卖流程解析:便捷、高效、安全的美食配送

美团外卖作为中国最大的外卖平台之一,提供了丰富多样的美食选择,并通过高效的配送服务将美食送到用户手中。本文将深入探讨美团外卖的流程,从下单到送达,揭秘背后的便捷、高效、安全的运营体系。 1. 下单与支付 美团外卖的下单过…

[每周一更]-(第88期):Nginx 之 proxy_pass使用详解

proxy_pass 指令用于指定后端服务器的地址,可以采用以下不同的格式: 直接指定地址和端口: location / {proxy_pass http://backend_server:8080; }这将请求代理到 http://backend_server:8080。 使用变量: location / {set $ba…

bat脚本检测进程程序的方法

一、脚本检测进程 使用批处理脚本检测程序是否在运行,可以使用tasklist命令来列出当前运行的所有进程,并通过findstr命令来搜索特定的进程名。下面是一个简单的批处理脚本示例,它会检测指定的程序是否在运行,并给出相应的信息&…

PostgreSQL索引篇 | BTree

B-Tree索引 (本文为《PostgreSQL数据库内核分析》一书的总结笔记,需要电子版的可私信我) B树特点: 非叶子节点含一个或多个关键字值和子节点指针,不指向实际数据的存储位置所有关键字都是叶子节点,每个叶…

echarts多y轴样式重叠问题

1、主要属性设置 yAxis: [{//y轴1nameTextStyle: {align: "right",padding: 0}},{//y轴2nameTextStyle: {align: "left",padding: 0}},{//y轴3axisLabel: {margin: 50},nameTextStyle: {align: "left",padding: [0, 0, 0, 50]},axisPointer: {l…

华为HCIP Datacom H12-831 卷24

多选题 1、如图所示,某园区部署OSPF实现网络互通,其中Area1部署为NSSA区域。某工程师为了实现R1访问R4的环回口地址,在R4的OSPF进程中引入直连路由。以下关于该场景的描述,错误的有哪些项? A、在R4引入直连路由后,R1通过转换后的…

Sublime Text4配置C#运行环境

这里写自定义目录标题 前言部署.NET环境Sublime Text4配置C#编译环境1. 下载插件 运行测试 前言 今天把家里的9年前的远古神机搬了出来,重装了个win7的精简版,本打算装个VScode测试一下是否能写C#代码,结果是可以的,但&#xff0…

Python中format()方法的基本使用,第一种用法 <模板字符串>.format(<参数列表>)。

第一种用法&#xff1a; <模板字符串>.format(<参数列表>) 解析&#xff1a; 其中&#xff1a; <模板字符串>是包含占位符或者叫槽&#xff08;用花括号 {} 表示&#xff09;的字符串&#xff0c;用来指定最终格式化后的字符串的样式和结构。<参数列表…

Android 解决后台服务麦克风无法录音问题

Android 解决后台无法录音问题 问题分析问题来源解决方案1. 修改清单文件:`AndroidManifest.xml`2. 修改启动服务方式3. 服务启动时创建前台通知并且指定前台服务类型参考文档最后我还有一句话要说我用心为你考虑黄浦江的事情,你心里想的却只有苏州河的勾当 问题分析 安卓9.…

Android BitmapDrawable.bitmap与BitmapFactory.decodeResource获取不到原始图像素级真实宽高,Kotlin

Android BitmapDrawable.bitmap与BitmapFactory.decodeResource获取不到原始图像素级真实宽高&#xff0c;Kotlin 当一个图片放在ImageView里面后&#xff0c;用以下方式获取图的宽高&#xff1a; val bmp1 (this.drawable as BitmapDrawable).bitmapLog.d("fly", &…

Fiddler工具 — 21.Fiddler常用插件

Fiddler已有的功能已经够我们日常工作中使用了&#xff0c;为了更好的扩展Fiddler&#xff0c;Fiddler也是支持一些插件的安装&#xff0c;也支持用户自己开发插件并安装。 Fiddler插件下载地址&#xff1a;https://www.telerik.com/fiddler/add-ons 1、Traffic Differ Traf…