招聘好帮手:用“蜂巢数据”筛选简历
2016-03-21非猫
非 猫
招聘好帮手:用“蜂巢数据”筛选简历
非猫
Recruitment a Good Assistant: Use "Honeycomb Data" to Screen Resumes
Fei Mao
想要招到好员工,筛选简历是第一关,而且是一件枯燥的任务。本文教大家用蜂巢数据这款软件来自动化筛选简历。
一、前言
我是一家IT公司的项目经理,最近公司准备启动一个新项目,我负责技术团队的搭建。
招聘绝对是一件很耗体力的事,我这里主要指通过网上招聘渠道招人。每天要在茫茫的简历堆里挑选出符合公司用人要求的简历,有时候看了数十个也没一个合适的,有时候前两天刚看过的简历今天又看了一遍,相当考验人的耐心。
这是一种机械又枯燥的劳动,应该交给机器来做,至少应该让机器把大部分无用的数据先过滤掉才对。
前段时间听朋友介绍过”蜂巢数据”这款软件,它能对网页数据进行自动化采集,处理,保存。我就用它来筛选网络上的简历。
二、正文
“蜂巢数据”可以从官方网站上下载:http://cn.hdata.me/
也可以通过其它软件下载站下载,请注意要下载1.3以后的版本,1.3以前的版本复制XPath有BUG。
下载安装后,运行“蜂巢数据”,将看到如图1所示的界面:
从左到右,依次是导航面板,任务面板和工作区。导航面板里可以看到各个任务组,点击任务组后会打开任务面板,任务面板里面列出的是当前选中的任务组里的任务。
“蜂巢数据”以任务为工作单元,每个任务拥有自己的采集脚本和数据库。各任务之间相互独立,互不影响。
因为我负责的项目需要Android程序员,这里我就以Android程序员简历采集为例,给大家示范如何用“蜂巢数据”采集和过滤简历。
点击工具栏上的“新建任务”按钮,在弹出的新建任务对话框中输入任务名“Android程序员”,然后点保存,如图2所示:
任务创建完成后,“蜂巢数据”会在工作区自动打开任务编辑窗口。我们将在任务编辑窗口里完成编写采集脚本,定义数据字段等工作。
任务编辑窗口的布局如图3所示(为了扩大视图,我关闭了导航面板和任务面板,只留下工作区):
上面是脚本编辑区和浏览器,脚本编辑区用于编写采集脚本,浏览器用于辅助脚本调试,当脚本运行时,浏览器会根据脚本的指令打开网页。
下面是各种辅助脚本编写的工具面板和数据字段编辑区:
1、输出面板会显示脚本运行过程中打印的内容。
2、网页审查面板可以查看浏览器中打开的网页DOM结构。
3、源文件面板可以查看浏览器中打开的网页的源码。
4、数据字段面板用于对当前任务数据库字段的编辑。
介绍完任务编辑界面,接下来我们开始动工。
首先我们来定义数据字段,“蜂巢数据”会根据采集脚本,把网页上的数据保存到本地数据库供我们查看。我们要在脚本运行之前设计好数据库,有哪些内容需要保存。
这里要采集的是简历,一般个人简历包括这几个部分:姓名,性别,年龄,工作经验,学历,个人简介,简历链接等数据。
我们在数据字段面板中,点击添加字段,在弹出的添加字段对话框里填写字段名,然后点击保存。添加字段对话框里有一个“过滤重复数据”选项,钩上后,如果数据库里该字段下已存在相同的数据,数据将会被丢弃。我肯定不想看到重复的简历,所以这里对简历链接进行过滤。如图4所示:
设计完数据库字段后,我们可以开始编写采集脚本了。采集脚本需要用JavaScript语言编写(一种非常简单的脚本语言,有网页制作经验的朋友应该很熟悉,百度上可以搜索到很多教程,这里就不多介绍了)。
第一步我们要打开待采集的网页,我要从58同城上采集Android程序员简历,58同城里搜索简历的网页地址是:http://hz.58.com/searchjob/?key=android
在“蜂巢数据”里通过脚本打开该页面,语句是:
load("http://hz.58.com/searchjob/?key=android");
如果你不懂JavaScript,可以直接复制上面的代码到编辑区,把网页地址替换成任何你想打开的页面即可。需要注意的是,括号和双引号不能漏写也不能多写,且必须是英文字符。
在脚本编辑区输入以上代码后,点击编辑区左边的运行按钮,可以看到脚本运行的效果。目前我们只是打开了简历搜索页面,还没开始采集数据。如图5所示:
第二步我们要分析网页内容,看看哪些数据是我们需要的。我们在浏览器里看下58同城的简历搜索结果,是一个列表,每一行是一条简历信息,分别有姓名,性别,年龄,工作经验,学历等我们所需要的数据。
“蜂巢数据”可以根据XPath来提取网页里的数据(XPath用于标识网页中元素的地址,有兴趣的朋友可以百度下)。我们在第一条简历的姓名上点击鼠标右键,在弹出菜单里选择复制XPath,如图6所示:
然后在脚本编辑框内,我们通过刚才复制的XPath提取姓名:name = inner_text("//*[@id='infolist']/dl/dd[2]");
(注意:刚才复制过来的XPath,infolist是被双引号包起来的,脚本里我们替换成单引号,这是JavaScript语法需要,有兴趣的朋友可以学习下JavaScript语法)
用同样的办法,我们再提取性别,年龄,工作经验,学历等数据,然后我们通过“蜂巢数据”提供的print方法,把提取到的数据打印到输出面板,如图7所示:
完整的代码如下:
load("http://hz.58.com/searchjob/?key=android");
name = inner_text("//*[@id='infolist']/dl/dd[2]");
gender = inner_text("//*[@id='infolist']/dl/dd[3]");
age = inner_text("//*[@id='infolist']/dl/dd[4]");
exp = inner_text("//*[@id='infolist']/dl/dd[5]");
brief = inner_text("//*[@id='infolist']/dl/dt/span[2]");
link = attribute("//*[@id='infolist']/dl/dt/a","href");
print("姓名:" + name.trim());
print("性别:" + gender.trim());
print("年龄:" + age.trim());
print("工作经验:" + exp.trim());
print("个人简介:" + brief.trim());
print("简历链接:" + link.trim());
在输出面板,我们可以看到,姓名,性别,年龄,工作经验等信息。这些就是蜂巢数据根据脚本从网页中提取的数据。
细心的朋友可能发现了,简历链接的提取跟其它元素有些不一样,用了attribute这个函数。在58同城的网页上,点击简历后会打开另一个页面显示该简历的内容,这是一个网页链接,通过attribute函数我们就能获取这个链接地址,而不是网页上显示的文字。熟悉网页制作的朋友应该猜到了,attribute函数的第二个参数href指的就是网页链接中的href。
到目前为止,我们只是把提取的数据打印出来,接下来我们把提取的数据保存到数据库,方便以后查看。保存数据很简单,只需要调用save方法就可以了:
save([name.trim(),gender.trim(),age.trim(),exp.trim(),brief.trim(),link.trim()]);
现在运行脚本,我们可以在数据字段面板里看到保存的数据,如图8所示:
我们已经成功采集到了第一条简历,接下来我们把整个页面的简历都采集过来。
我们把网页拉到最下面,复制最后一条简历姓名的XPath,跟第一条对比下,看看有啥区别:
//*[@id="infolist"]/dl/dd[2]
//*[@id="infolist"]/dl[35]/dd[2]
大家应该注意到了,第一条XPath中间是dl(等同于dl [1]),最后一条XPath中间是dl[35]。也就是说,每条简历的XPath只有dl[*]中间的数字是不一样的,学过JavaScript的朋友可能已经想到了,可以通过一个循环语句来采集所有简历:
load("http://hz.58.com/searchjob/?key=android");
for(i = 1;i < 100;i++){
if(!has_element("//*[@id='infolist']/dl[" + i + "]/dd[2]"))
break;
name = inner_text("//*[@id='infolist']/dl[" + i + "]/dd[2]");
gender = inner_text("//*[@id='infolist']/dl[" + i + "]/dd[3]");
age = inner_text("//*[@id='infolist']/dl[" + i + "]/dd[4]");
exp = inner_text("//*[@id='infolist']/dl[" + i + "]/dd[5]");
brief = inner_text("//*[@id='infolist']/dl[" + i + "]/dt/span[2]");
link = attribute("//*[@id='infolist']/dl[" + i + "]/dt/a","href");
save([name.trim(),gender.trim(),age.trim(),exp.trim(),brief.trim(),link.trim()]);
}
上面代码中的has_element是蜂巢数据提供的一个辅助函数,用来判断网页元素是否存在,因为我们不知道网页里总共有几条简历,所以需要通过has_element进行检测。运行这段代码后,我们会在数据字段面板里看到总共采集了35条简历,如图9所示:
单个网页上的简历采集完了,但58上搜到的简历不只一页,接下来我们看看怎么用蜂巢数据采集多个页面的数据。
把网页拉到最下面,在第2页的数字上右击鼠标,选择复制链接地址,用同样的方法我们复制第3页的链接地址对比下各个页面的区别,如图10所示:
http://hz.58.com/searchjob/pn2/?key=android
http://hz.58.com/searchjob/pn3/?key=android
对比第2页和第3页的链接地址,我们发现只有中间的pn2和pn3是不一样的,同样的我们可以通过一个循环分别打开各个页面进行采集:
for(a = 1;a <= 5;a++){
load("http://hz.58.com/searchjob/pn" + a + "/?key=android");
for(i = 1;i <= 100;i++){
if(!has_element("//*[@id='infolist']/dl[" + i + "]/dd[2]"))
break;
name = inner_text("//*[@id='infolist']/dl[" + i + "]/dd[2]");
gender = inner_text("//*[@id='infolist']/dl[" + i + "]/dd[3]");
age = inner_text("//*[@id='infolist']/dl[" + i + "]/dd[4]");
exp = inner_text("//*[@id='infolist']/dl[" + i + "]/dd[5]");
brief = inner_text("//*[@id='infolist']/dl[" + i + "]/dt/span[2]");
link = attribute("//*[@id='infolist']/dl[" + i + "]/dt/a","href");
save([name.trim(),gender.trim(),age.trim(),exp.trim(),brief.trim(),link.trim()]);
}}
这里我只采集了5个页面,因为再后面的简历大部分可能都是过时的,没必要采集。具体采集几页,大家根据实际需求来设置就可以了。
脚本的编写算是告一段落了,到目前为止,我们都在任务编辑模式下工作,采集到的数据也没有真正保存到数据库,关闭任务编辑窗口后采集到的数据就会消失。接下来我们在真实环境下运行脚本。
点击工具栏上的保存按钮保存任务,然后在任务面板里鼠标右击Android程序员,选择开始任务,如图12所示:
任务运行结束后,鼠标右击Android程序员,选择查看数据,我们就可以在新打开的标签里看到采集到的数据了,这些数据已经保存在数据库里了,关闭蜂巢数据后也不会丢失。你还可以选择导致数据到Excel进一步处理。如图13所示:
以后每天我只需要打开蜂巢数据,运行一遍Android程
序员任务,就能采集到当天更新的Android程序员简历,而且蜂巢数据已经帮我过滤过重复的简历,省了我不少时间。
三、结尾
通过本文大家应该对“蜂巢数据”的使用方法已经有所了解,只要会点JavaScript编程基础,就可以很方便地编写脚本采集你所需要的内容。
由于篇幅的原因,这里我就不深入去讲解怎么用脚本筛选简历,无非就是通过JavaScript对提取到的数据进行分析,我相信大家熟悉了JavaScript语法后,这些都不是难事。
除了文中提到的简历筛选,“蜂巢数据”可以做的事还很多。比如找工作筛选职位,行业数据分析,论坛回帖跟踪等。希望“蜂巢数据”能对你有所帮助。