疫情封控,现场招聘举办的难度大增,一定程度上增加了招聘网站的流量,网络招聘越来越成为各公司的招聘首选手段,网络招聘还具有岗位齐全、信息综合,样本数量大、反映企业真实需求、时效性高等特点,可以预见,通过分析研究招聘网站信息来研究就业市场必将越来越流行。
(二)技术方法。
1.Python。
Python是一种简单易学、功能强大的计算机程序设计语言,它有高效率的高层数据结构,简单而有效地实现面向对象编程。Python简洁的语法和对动态输入的支持,让人更加容易阅读、调试和扩展,再加上其高度集成了解释性、交互性、面向对象性和丰富的可扩展性等特点,特别是可导入多种模块,大量的第三方科学计算函数库都有对应版本对其支持,使得Python语言在爬虫和大数据处理分析方面优点明显。
本项目,运用python中的requests模块编写抓取软件,实现台州人才网职位JSON源文件的下载;结合json模块实现JSON数据源的解析,再结合xlwings模块进行数据存取。最后,结合pandas、matplotlib和pyecharts等模块进行数据挖掘及展示。
2.网络爬虫。
网络爬虫(WebCrawler),又称网页蜘蛛、网络机器人,是一种按照一定规则,自动抓取万维网数据信息的程序。网络爬虫的基本实现原理及过程:通过互联网获取网页初始URL链接,将初始网页存储至本机,并对初始网页中出现的新URL链接进行爬取,始终重复上述过程,直至满足设定的停止条件。若无停止条件,则直到无法获取新的URL链接为止,以此实现对网页数据的遍历,供后期数据分析使用。
二、爬虫软件设计流程
(一)网站分析。
点击浏览器工具里的开发人员工具,选择network选项卡中XHR标签,再点再F5来刷新网页,可以通过返回信息里的getjobs返回页面的预览为标准的json数据,主要内容如下:
{msg:"success",listcount:1179,pagecount:66,pagesize:18,pageindex:1,…}
可以了解到,网站的职位信息通过AJAX异步请求来组织数据传输。
分析getjobs返回页面的jobs标签,可以看到:
jobs:[{
jobs:[{id:475081,userid:2872929,compid:2872929,workface:"社会人士,",
area:"温岭市"
bdmap:""
company:"温岭市七星电机有限公司"
companyhead:""
,…]
可以得出,该处的键值名分别有workface、company、area、job、edu、salary和language,分别对应职位的职业要求、公司名、工作区域、职位名称、教育要求、工资和外语要求等含义。可见,其数据结构与结构化数据库方式相同,也与excel的行与列的结构形式相似,数据保存方式可以用结构化数据库和excel进行保存,考虑统计分析的使用习惯,本文选用excel来保存数据,因此本文使用xlwings模块进行excel数据存取。
(二)程序设计。
因爬取的数据是以JSON格式组织的,因此程序流程主要分为如下步骤完成
1.利用request获得response对象。
如果网站的请求不是从浏览器发出,则无法获得服务器相应内容,所以爬虫程序需要伪装成一个从浏览器发出的请求,就要求程序在发送Request请求时,需要加入特定的headers。分析在台州人才网的xhr标签的标头,其表单数据部分为:
apiurl:/Open/Api/
comefrom:电脑端
label:website
secret:374472D1C57F388C7171A347459EA738
可以看出apiurl字段为getjobs网页在服务器上的相对路径,一般网站为了防止因为搜索引擎和网络爬虫的爬取,常使用一定的防盗链签名,secret字段就是这种防盗链签名。
根据以上分析,params、headers和response分别如下:
params={
…
'apiurl':'/Open/Api/',
'comefrom':'电脑端',
'label':'website',
'secret':374472D1C57F388C7171A347459EA738,
}
headers={
'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)'
'Chrome/86.0.4240.198Safari/537.36'
response=requests.get(url=url,params=params,headers=headers)
2.将response对象返回的数据进行分页爬取。
根据代码段:
result=json.loads(response.text)
得到的就是json数据,分析json数据得到pagecount键值为总页面数。
通过代码段:
forpinrange(result['pagecount']):
这样的for循环,可以组织每个不同的页面的爬取路径。
再通过得到的页面json数据,通过代码段:
foriinresult['jobs']:
可得到完整结构的jobs职位信息。
3.将爬取的数据保存在Excel中。
通过list列表作为单行的jobs数据进行临时保存,代码段:
info_list.append(
…,
i['workface'],i['companyhead'],i['company'],
)
再通过sheet进行填充,因为数据的第一行是标题,填充要从第二行的第一列开始(也就是a2),代码段:
sheet.range('a2').value=info_list
保存为“test.xlsx”Excel工作簿的代码段:
workbook.save('test.xlsx')
三、数据分析
(一)数据处理分析。
通过数据结构了解,有:id、userid、compid、workface、companyhead、companyicon、bdmap、industry、companytype、companysize、companymoney、job、num、welfare、area、edu、salary、worktype、worktime、language、minage、maxage、minsalary、maxsalary、time、refreshtime、hits、status和sort字段,一般公司名称、岗位数量、岗位名称、职位要求和工资水平一般比较重要。
根据job列的岗位名称分析,一周内共有311个岗位,根据岗位名称去重后得到共计273个不同岗位名,比如:研发工程师(产品经理助理)和研发工程师(JAVA开发),同为研发工程师就有针对产品经理助理和JAVA开发的,因此很难根据岗位名称进行分析。薪酬水平也是重要的信息,但《台州人才网》的薪酬数据是10000及以上、8000到9999和7000到7999等范围字段来安排,因此没有办法明确了解更精确的工资数据,尚无法分析平均工资等数据。依据现有数据分析能力,明确分析的重点有:学历要求、工作经验要求、薪酬范围情况、相同岗位名称出现多少和提供岗位数前十的单位等五项。
(二)数据处理设计。
1.学历要求。
学历要求占比可以用环形图来展示,因此可以使用matplotlib.pyplot模块,该模块需要pandas模块支持,也需要一起导入,并导入xlwings模块对excel表格进行支持。
程序代码段:
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
x=df['学历']
y=df['岗位数']
plt.pie(y,labels=x,autopct='%.2f%%',pctdistance=0.85,radius=1.0,labeldistance=1.1,wedgeprops={'width':0.3,'linewidth':2,'edgecolor':'white'})
plt.title(label='',fontdict={'color':'black','size':30},loc='center')
根据环形图可知,当前台州市对大专学历的就业者需求最大,台州市以制造业发达见长,大量的工业企业也正在改进技术,智能制造越来越成为企业的行进方向,工业企业对员工的学历要求也越来越高。
2.工作经验要求。
工作经验要求展示的程序设计几乎同于学历要求。
根据环形图可知,58.7%的岗位要求是有工作经验的社会人士,25.4%的岗位对毕业生开放,毕业生群体的就业难度明显低于社会人士,当前毕业生就业难度比较低。
3.薪酬范围情况。
在对数据的掌握及分析变得愈加重要的当今时代,数据可视化作为提高用户对数据的理解程度、创新架构和增进体验的重要一环,一向富有表现力的Python语言应当可以发挥更大作用,优秀的pyechart第三方库即在这样的背景下诞生。pyecharts库是一个用于生成Echarts图表的类库,Echarts是一个由百度开源的商业级数据图表,并于2018年初捐赠给Apache基金会,成为ASF孵化级项目。2021年1月Apache基金会官方宣布ECharts项目正式毕业,成为Apache顶级项目。。
ECharts可提供了常规的折线图、柱状图、散点图、饼图、K线图外,还可用于BI的漏斗图,仪表盘,并且支持图与图之间的混搭。它是一个纯JavaScript的图表库,可以为用户提供直观生动,可交互,可高度个性化定制的数据可视化图表,赋予了用户对数据进行挖掘整合的能力,同时,可以被网站直接使用,更增加了数据显示的途径。本文对薪酬显示部分,引入pyecharts模板进行显示。
salarys=data["salarys"]
sums=data["sums"]
pie=Pie("",title_pos='center',width=800)
pie.add("",salarys,sums,is_label_show=True,is_toolbox_show=False)
pie.render('rose.html')
4.岗位名称关键词情况。
比如:研发工程师(产品经理助理)和研发工程师(JAVA开发),同为研发工程师就有针对产品经理助理和JAVA开发的,很难根据岗位名称进行分析。本文利用Python的jieba模块进行分词,再通过WordCloud模块将岗位高频关键词进行词云化。
ls=jieba.lcut(s)#生成分词列表
ls=s
text=''.join(ls)#连接成字符串
word=WordCloud(
font_path='fz.ttf',#设置字体,本机的字体
background_color='white',#设置背景颜色
max_font_size=150,#设置字体最大值
max_words=2000,#设置最大显示字数
).generate(ls)
image=word.to_image()
word.to_file('2.png')
根据词云图生成原理,词语显示规格越突出、距离中心位置越近词语出现频率越高。从词云图可以看出工程师、专员和助理这三个工种招聘关键词出现次数最多。台州市作为制造业发展较好的城市,对高技能工种需求比较高,高技能人才也更易在台州找到工作。
5.提供岗位数前十的单位。
根据每个企业提供的招聘职位数据,进行合计汇总,并进行排序,可通过xlwings模块绘制柱形图。
chart=i.charts.add(left=200,top=0,width=355,height=211)
chart.set_source_data(i['A1'].expand('table'))
chart.chart_type='bar_clustered'
代码中bar_clustered就是指定了样式为柱形图。
可以看出,台州众凯企业管理咨询有限公司和浙江华诚会计师事务所有限公司招聘的人数最多,分析这两家公司的招聘内容,可以得知其主要负责代招,因为有较多的公司没有专业的人力资源人员,需代招中介公司组织代为初招。
四、结语
本文通过分析招聘网站网页结构,利用Python语言及其强大的第三方库编写爬虫代码,获取相应的职位信息,并对收集到的数据进行清洗整理及分析,结合可视化图表及词云图了解招聘需求等。
本文的不足之处主要有三个方向:一是本文只获取了单个网站的就业信息,无法代表全市及各县(市、区)的全部网络招聘情况,下一步的重点将放在如何进行多数据源的就业信息获取及合并,以获得更加全面的就业信息;二是本文在分析岗位名时也提到,同为研发工程师就有分别针对产品经理助理和JAVA开发的,很难根据岗位名称进行分析,需要借助人工智能进行分析,需要用Python写神经网络进行训练等;三是本文虽获取了就业单位的信息,但没有做好产业及行业的相对应匹配,无法进行产业及行业需求的深层级统计分析,进一步的分析则需要借助一些大数据技术实施。