基于51job网站招聘信息的爬取与分析
——以Python技术岗位为例

2021-04-24 13:05毛遂毛红霞
网络安全技术与应用 2021年4期
关键词:薪资网页可视化

◆毛遂 毛红霞

(四川大学锦城学院 计算机与软件学院 四川 611731)

1 背景

伴随着社会便利性科技的不断发展和大数据相关技术的普及与应用,大多数人由前往人才市场的传统招聘转变为在相关招聘网查看和筛选合适岗位。网络招聘不但招聘范围广、招聘信息齐全,而且招聘方式更为便捷。它打破了时间和地域的限制,逐渐成为企业组织招聘的主流方式之一[1]。但因为大量相关信息的充斥和地域空间的限制,很多的招聘者难以在短时间内找出适合自己的岗位和工作地点。

网络爬虫技术的不断发展刚好为这样繁杂的数据找到了一条很好的处理道路,利用web 网络爬虫技术可以将大量的招聘信息保存到本地,再结合Python 语句就可以实现数据的清洗整合和图例绘制。

2 相关技术分析

2.1 爬取技术分析

网络爬虫(Web Crawler),是一种按照一定的规则,自动提取Web网页的应用程序或者脚本,工作原理是基于http 协议中请求与响应机制。其优点在于,它可以将整个网页的源代码完整爬取下来[2]。访问者通过相关设备发送请求并传输url 到目标服务器,目标服务器通过相关处理和优化分析后返回访问者所需信息,访问者得到相关HTML 信息后可利用Beautiful Soup,正则表达式,Xpath 等技术去获取到想要的网页固定信息。此外本次实验将通过引入selenium,time等包进行网页的动态爬取。

2.2 数据清洗和可视化技术分析

Python 这门语言为技术者们提供了大量的数据处理的方式,常用的有pandas 以及matplotlib。Pandas 是用于高性能数据分析的技术库,在支持各种数据结构相互转换的同时又可提取和保存数据。而Matplotlib 可以将处理好的数据转化为图表形式,通过可视化将数据进行直观的展示[3]从而反映出数据的各项明显特征。

3 总体描述

本次实验将通过 Pycharm 2020.1.3,Google Chrome 86.0 和selenium 库当中的webdriver 让电脑自行模拟人登录和访问指定网站(51Job 招聘网站)的一系列行为。通过for 循环和driver.page_source保存翻页的源代码信息,再利用BeautifulSoup 相关方法提取指定信息的节点并保存至空列表,以便后续利用append 和get 方法获取指定文本信息。数据清洗过程使用Python 语句实现非标准数值的处理和空缺值处理。

数据可视化过程利用Matplotlib 画图工具进行相应的作图,以便直观看出目标爬取数据之间的联系与区别。

4 爬取实现

4.1 登录和搜索相关内容

本次实验爬取的51Job 网站在登录前和登录后所展示的内容不同,故需要通过完成登录才能实现相关数据的爬取工作。登录过程使用语句如:driver.find_element_by_css_selector 和send_keys。此过程可以让电脑自行实现输入指定账户和密码,若在登录过程当中遇到验证问题(滑块点击)则需手动辅助完成。

4.2 相关内容的爬取

首先可以利用Google Chrome 浏览器的F12 开发者工具来查看所要爬取内容在网页上对应的标识。之后使用BeautifulSoup 写出提取表达式进行一一爬取。在原网页中可以看到爬取对象职业名称、工资、地点、要求、时间都是在span 这个节点下的,除了彼此之间的class 名称不同。而公司名称在a 节点下,公司的大小是在p 节点下。通过append 方法可以将爬取下来的文本信息放入每一个所对应的空列表当中。具体代码如下:

for i in soup.find_all('span',class_=['jname at','sal','d at','time')

for i in soup.find_all('a',class_='cname at')

for i in soup.find_all('p',class_='dc at')

由于是利用webdriver 实现的动态爬取,所以需要实现自动翻页。其具体如下:首先使用css 找到每页原址定位如:在翻第二页时的地址为(body >div:nth-child(4)>div.j_result >div >div.leftbox >div:nth-child(4)>div.j_page >div >div >div >ul >li:nth-child(3)>a)仿制如上操作7 页之后发现,此后的css 定位将会固定不变,同时也不难看出在翻页规律上唯一的不同是li:nth-child()括号中的数字,当通过for 循环改变括号数字的时候便可实现网页爬取。

5 数据清洗

5.1 数据去重和薪资缺失值处理

在保证数据一一对应的前提下,去除重复行(data=data.drop_duplicates())。

如果将所有薪水中带有空值的数据剔除会大大降低数据统计的可靠程度,所以会将爬取的数据通过指定列名的形式来逐行遍历,找出其众数值并填入存在缺失值的行中。此时填充完的薪水列是单独存在的新列,可以用覆盖的形式让其替代原始数据列。最后用isnull().sum()来检查缺失值是否消除,以验证工作的可行性。

5.2 拆分和整合数据

通过观察csv 文件当中的数据如:“北京-朝阳区 | 3-4 年经验| 本科 | 招3 人”可以发现许多有用的数据是通过( | )相连在一起的,不满足数据处理条件,所以需要将此列的数据进行相应的拆分和保留。

同样在文件中的requires 和company_size 列都可以发现一些不符合招聘信息格式的存在。此时就需要去进行相应的处理工作。如requires 当中存在“深圳-福田区 | 本科 | 招2 人”(标准格式为四个招聘信息)这样招聘信息只有三个的情况,company_size 当中有着“私企”(标准格式为两个招聘信息)。

在对应的 jobField 列中存在如“后端研发工程师”这样不包含所查询关键词Python 的岗位名称的情况。同时也会存在python 中的开头英文大小写不统一的情况,所以都需要进行统一化处理。具体代码如下:

J=j.split(' | ')

k=k.replace('python','Python')

if len(I)!=4 or len(J)!=2 or 'Python' not in k:

原始列名requires 拆分后构成新列名“area”,“work year”,“education”,“hiring”,待装入清洗后的数据之后将原来的列名requires删除。对 Company_size 执行相同操作后构成 companyType 和companySize。

5.3 去掉括号内容和地区优化

在jobField 和companyType 当中可以发现有的数据是带有多余括号的,为了使数据看起来美观就需要利用正则表达式去掉中英文括号及其内容(i=re.sub('(.*?)','',i),i=re.sub('(.*?)','',i))

清洗后的数据集当中地区数据依然存在附属的情况,如“北京-朝阳区”,本次实验只留下市级地区。

5.4 薪资优化

在薪资列当中会出现薪资不统一的情况如:“***千/月,***元/天(日),***万/月”所以综合考虑,最佳的方案是将单位都统一成“***千/月”的形式。而对于薪资是一个区间的相关形式则采取平均数的方式来处理。如出现“5-8 千/月”在清洗后就会得到“6.5 千/月”的结果,结果保留一位小数。具体代码如下:

mean_salary=(low_salary+high_salary)/2

salary='-'.join((str(low_salary),str(high_salary)))+'千/月'

6 数据分析可视化

6.1 岗位占比和企业类型

根据清洗后的相关数据可以得出在与Python 技术相关工作岗位的饼状图(左图),前五种分别为Python 开发工程师、Python 高级开发工程师、Python 工程师、Python 爬虫工程师和Python 后端开发工程师。其实不难看相关岗位按照当前的潮流趋势依然会以技术开发方向为主。俗话常说“兴趣是最好的老师”生活就要把兴趣和工作结合起来,做自己感兴趣的事[4]招聘者可通过制作的图表直观获得自己是否适合相关岗位的判断。在保证高效筛选工作岗位的同时,也能获得最为主观的感受。

图1 岗位占比(左)和企业类型图(右)

在企业类型分布图当中排名前五的类型分别是民营公司、上市公司、外企、合资和国企,而民营公司又以绝对性的市场占比力压其他三者,可以看出在相关的技术领域民营公司对于新技术和对于人才的渴望是比较强烈的。

6.2 薪资同学历与地区之间的关系

相信无论是在传统行业还是新兴行业,影响基本工资的因素主要有:职称学历、工龄、工作技能、工作量和职位差别等[5]这也合乎大家对于行业的传统认知。通过图2 可以很清楚看出由于学历不同带来的收入差距,这也解释了这几年以来为什么报考研究生的人数在不断攀升的原因,每一个人都希望通过提升学历来让自己的薪资水平有一个质的提升。以图2 来看许多的公司都会以高额的薪资水平(本图达到19.50 千/月)去吸引高级人才,其行业的热门程度不言而喻。因为Python 语言由于其自身特点,在很多领域都非常优秀,是一门真正的全栈语言。对于未来人工智能领域的发展,Python 语言会继续发挥其不可代替的作用,推进信息时代的持续发展。[6]

图2 薪资同学历与地区之间的关系

通过图2 也可以清晰看出相关岗位招聘最多的城市分别为:上海、深圳、广州、北京和南京。北京、上海、广州、深圳(北上广深)作为我国最发达的城市,具有经济高速发展的独特优势[7]。上海作为我国最早一批对外开放港口的城市,对于经济的影响力不言而喻,而支撑深厚经济基础的必然是新技术、新发展、新产业和高技术人才。深圳和广州都处在沿海地区对外和对内贸易的交接口,随着广州贸易业务的不断升级和深圳高科技创新金融产业的发展高级技术人才的需要必然也是刚需。所以紧靠着沿海城市和行业大公司落地较多的上海对于年轻人来说都是很理想的求职地选择,刚好也是招聘发布最多的地方。

7 结束语

本文基于selenium 库再结合Google Chrome 实现了对于招聘网站51Job 中与Python 技术相关职业岗位的爬取。通过数据的相关清洗和制图模块完成了数据可视化工作。对岗位占比、企业类型、薪资与学历和岗位需求量与薪资之间的关系进行了相关的分析和结论总结,对于招聘者有着一定的辅助决策的作用。

猜你喜欢
薪资网页可视化
基于CiteSpace的足三里穴研究可视化分析
不简单以“住房薪资”引才——遵循“一步一重天”的人才发展规律
思维可视化
基于HTML5与CSS3的网页设计技术研究
基于CGAL和OpenGL的海底地形三维可视化
“融评”:党媒评论的可视化创新
基于CSS的网页导航栏的设计
基于HTML5静态网页设计
基于URL和网页类型的网页信息采集研究