非 貓
?
招聘好幫手:用“蜂巢數(shù)據(jù)”篩選簡(jiǎn)歷
非貓
Recruitment a Good Assistant: Use "Honeycomb Data" to Screen Resumes
Fei Mao
想要招到好員工,篩選簡(jiǎn)歷是第一關(guān),而且是一件枯燥的任務(wù)。本文教大家用蜂巢數(shù)據(jù)這款軟件來(lái)自動(dòng)化篩選簡(jiǎn)歷。
我是一家IT公司的項(xiàng)目經(jīng)理,最近公司準(zhǔn)備啟動(dòng)一個(gè)新項(xiàng)目,我負(fù)責(zé)技術(shù)團(tuán)隊(duì)的搭建。
招聘絕對(duì)是一件很耗體力的事,我這里主要指通過(guò)網(wǎng)上招聘渠道招人。每天要在茫茫的簡(jiǎn)歷堆里挑選出符合公司用人要求的簡(jiǎn)歷,有時(shí)候看了數(shù)十個(gè)也沒(méi)一個(gè)合適的,有時(shí)候前兩天剛看過(guò)的簡(jiǎn)歷今天又看了一遍,相當(dāng)考驗(yàn)人的耐心。
這是一種機(jī)械又枯燥的勞動(dòng),應(yīng)該交給機(jī)器來(lái)做,至少應(yīng)該讓機(jī)器把大部分無(wú)用的數(shù)據(jù)先過(guò)濾掉才對(duì)。
前段時(shí)間聽(tīng)朋友介紹過(guò)”蜂巢數(shù)據(jù)”這款軟件,它能對(duì)網(wǎng)頁(yè)數(shù)據(jù)進(jìn)行自動(dòng)化采集,處理,保存。我就用它來(lái)篩選網(wǎng)絡(luò)上的簡(jiǎn)歷。
“蜂巢數(shù)據(jù)”可以從官方網(wǎng)站上下載:http://cn.hdata.me/
也可以通過(guò)其它軟件下載站下載,請(qǐng)注意要下載1.3以后的版本,1.3以前的版本復(fù)制XPath有BUG。
下載安裝后,運(yùn)行“蜂巢數(shù)據(jù)”,將看到如圖1所示的界面:
從左到右,依次是導(dǎo)航面板,任務(wù)面板和工作區(qū)。導(dǎo)航面板里可以看到各個(gè)任務(wù)組,點(diǎn)擊任務(wù)組后會(huì)打開(kāi)任務(wù)面板,任務(wù)面板里面列出的是當(dāng)前選中的任務(wù)組里的任務(wù)。
“蜂巢數(shù)據(jù)”以任務(wù)為工作單元,每個(gè)任務(wù)擁有自己的采集腳本和數(shù)據(jù)庫(kù)。各任務(wù)之間相互獨(dú)立,互不影響。
因?yàn)槲邑?fù)責(zé)的項(xiàng)目需要Android程序員,這里我就以Android程序員簡(jiǎn)歷采集為例,給大家示范如何用“蜂巢數(shù)據(jù)”采集和過(guò)濾簡(jiǎn)歷。
點(diǎn)擊工具欄上的“新建任務(wù)”按鈕,在彈出的新建任務(wù)對(duì)話(huà)框中輸入任務(wù)名“Android程序員”,然后點(diǎn)保存,如圖2所示:
任務(wù)創(chuàng)建完成后,“蜂巢數(shù)據(jù)”會(huì)在工作區(qū)自動(dòng)打開(kāi)任務(wù)編輯窗口。我們將在任務(wù)編輯窗口里完成編寫(xiě)采集腳本,定義數(shù)據(jù)字段等工作。
任務(wù)編輯窗口的布局如圖3所示(為了擴(kuò)大視圖,我關(guān)閉了導(dǎo)航面板和任務(wù)面板,只留下工作區(qū)):
上面是腳本編輯區(qū)和瀏覽器,腳本編輯區(qū)用于編寫(xiě)采集腳本,瀏覽器用于輔助腳本調(diào)試,當(dāng)腳本運(yùn)行時(shí),瀏覽器會(huì)根據(jù)腳本的指令打開(kāi)網(wǎng)頁(yè)。
下面是各種輔助腳本編寫(xiě)的工具面板和數(shù)據(jù)字段編輯區(qū):
1、輸出面板會(huì)顯示腳本運(yùn)行過(guò)程中打印的內(nèi)容。
2、網(wǎng)頁(yè)審查面板可以查看瀏覽器中打開(kāi)的網(wǎng)頁(yè)DOM結(jié)構(gòu)。
3、源文件面板可以查看瀏覽器中打開(kāi)的網(wǎng)頁(yè)的源碼。
4、數(shù)據(jù)字段面板用于對(duì)當(dāng)前任務(wù)數(shù)據(jù)庫(kù)字段的編輯。
介紹完任務(wù)編輯界面,接下來(lái)我們開(kāi)始動(dòng)工。
首先我們來(lái)定義數(shù)據(jù)字段,“蜂巢數(shù)據(jù)”會(huì)根據(jù)采集腳本,把網(wǎng)頁(yè)上的數(shù)據(jù)保存到本地?cái)?shù)據(jù)庫(kù)供我們查看。我們要在腳本運(yùn)行之前設(shè)計(jì)好數(shù)據(jù)庫(kù),有哪些內(nèi)容需要保存。
這里要采集的是簡(jiǎn)歷,一般個(gè)人簡(jiǎn)歷包括這幾個(gè)部分:姓名,性別,年齡,工作經(jīng)驗(yàn),學(xué)歷,個(gè)人簡(jiǎn)介,簡(jiǎn)歷鏈接等數(shù)據(jù)。
我們?cè)跀?shù)據(jù)字段面板中,點(diǎn)擊添加字段,在彈出的添加字段對(duì)話(huà)框里填寫(xiě)字段名,然后點(diǎn)擊保存。添加字段對(duì)話(huà)框里有一個(gè)“過(guò)濾重復(fù)數(shù)據(jù)”選項(xiàng),鉤上后,如果數(shù)據(jù)庫(kù)里該字段下已存在相同的數(shù)據(jù),數(shù)據(jù)將會(huì)被丟棄。我肯定不想看到重復(fù)的簡(jiǎn)歷,所以這里對(duì)簡(jiǎn)歷鏈接進(jìn)行過(guò)濾。如圖4所示:
設(shè)計(jì)完數(shù)據(jù)庫(kù)字段后,我們可以開(kāi)始編寫(xiě)采集腳本了。采集腳本需要用JavaScript語(yǔ)言編寫(xiě)(一種非常簡(jiǎn)單的腳本語(yǔ)言,有網(wǎng)頁(yè)制作經(jīng)驗(yàn)的朋友應(yīng)該很熟悉,百度上可以搜索到很多教程,這里就不多介紹了)。
第一步我們要打開(kāi)待采集的網(wǎng)頁(yè),我要從58同城上采集Android程序員簡(jiǎn)歷,58同城里搜索簡(jiǎn)歷的網(wǎng)頁(yè)地址是:http://hz.58.com/searchjob/?key=android
在“蜂巢數(shù)據(jù)”里通過(guò)腳本打開(kāi)該頁(yè)面,語(yǔ)句是:
load("http://hz.58.com/searchjob/?key=android");
如果你不懂JavaScript,可以直接復(fù)制上面的代碼到編輯區(qū),把網(wǎng)頁(yè)地址替換成任何你想打開(kāi)的頁(yè)面即可。需要注意的是,括號(hào)和雙引號(hào)不能漏寫(xiě)也不能多寫(xiě),且必須是英文字符。
在腳本編輯區(qū)輸入以上代碼后,點(diǎn)擊編輯區(qū)左邊的運(yùn)行按鈕,可以看到腳本運(yùn)行的效果。目前我們只是打開(kāi)了簡(jiǎn)歷搜索頁(yè)面,還沒(méi)開(kāi)始采集數(shù)據(jù)。如圖5所示:
第二步我們要分析網(wǎng)頁(yè)內(nèi)容,看看哪些數(shù)據(jù)是我們需要的。我們?cè)跒g覽器里看下58同城的簡(jiǎn)歷搜索結(jié)果,是一個(gè)列表,每一行是一條簡(jiǎn)歷信息,分別有姓名,性別,年齡,工作經(jīng)驗(yàn),學(xué)歷等我們所需要的數(shù)據(jù)。
“蜂巢數(shù)據(jù)”可以根據(jù)XPath來(lái)提取網(wǎng)頁(yè)里的數(shù)據(jù)(XPath用于標(biāo)識(shí)網(wǎng)頁(yè)中元素的地址,有興趣的朋友可以百度下)。我們?cè)诘谝粭l簡(jiǎn)歷的姓名上點(diǎn)擊鼠標(biāo)右鍵,在彈出菜單里選擇復(fù)制XPath,如圖6所示:
然后在腳本編輯框內(nèi),我們通過(guò)剛才復(fù)制的XPath提取姓名:name = inner_text("http://*[@id='infolist']/dl/dd[2]");
(注意:剛才復(fù)制過(guò)來(lái)的XPath,infolist是被雙引號(hào)包起來(lái)的,腳本里我們替換成單引號(hào),這是JavaScript語(yǔ)法需要,有興趣的朋友可以學(xué)習(xí)下JavaScript語(yǔ)法)
用同樣的辦法,我們?cè)偬崛⌒詣e,年齡,工作經(jīng)驗(yàn),學(xué)歷等數(shù)據(jù),然后我們通過(guò)“蜂巢數(shù)據(jù)”提供的print方法,把提取到的數(shù)據(jù)打印到輸出面板,如圖7所示:
完整的代碼如下:
load("http://hz.58.com/searchjob/?key=android");
name = inner_text("http://*[@id='infolist']/dl/dd[2]");
gender = inner_text("http://*[@id='infolist']/dl/dd[3]");
age = inner_text("http://*[@id='infolist']/dl/dd[4]");
exp = inner_text("http://*[@id='infolist']/dl/dd[5]");
brief = inner_text("http://*[@id='infolist']/dl/dt/span[2]");
link = attribute("http://*[@id='infolist']/dl/dt/a","href");
print("姓名:" + name.trim());
print("性別:" + gender.trim());
print("年齡:" + age.trim());
print("工作經(jīng)驗(yàn):" + exp.trim());
print("個(gè)人簡(jiǎn)介:" + brief.trim());
print("簡(jiǎn)歷鏈接:" + link.trim());
在輸出面板,我們可以看到,姓名,性別,年齡,工作經(jīng)驗(yàn)等信息。這些就是蜂巢數(shù)據(jù)根據(jù)腳本從網(wǎng)頁(yè)中提取的數(shù)據(jù)。
細(xì)心的朋友可能發(fā)現(xiàn)了,簡(jiǎn)歷鏈接的提取跟其它元素有些不一樣,用了attribute這個(gè)函數(shù)。在58同城的網(wǎng)頁(yè)上,點(diǎn)擊簡(jiǎn)歷后會(huì)打開(kāi)另一個(gè)頁(yè)面顯示該簡(jiǎn)歷的內(nèi)容,這是一個(gè)網(wǎng)頁(yè)鏈接,通過(guò)attribute函數(shù)我們就能獲取這個(gè)鏈接地址,而不是網(wǎng)頁(yè)上顯示的文字。熟悉網(wǎng)頁(yè)制作的朋友應(yīng)該猜到了,attribute函數(shù)的第二個(gè)參數(shù)href指的就是網(wǎng)頁(yè)鏈接中的href。
到目前為止,我們只是把提取的數(shù)據(jù)打印出來(lái),接下來(lái)我們把提取的數(shù)據(jù)保存到數(shù)據(jù)庫(kù),方便以后查看。保存數(shù)據(jù)很簡(jiǎn)單,只需要調(diào)用save方法就可以了:
save([name.trim(),gender.trim(),age.trim(),exp.trim(),brief.trim(),link.trim()]);
現(xiàn)在運(yùn)行腳本,我們可以在數(shù)據(jù)字段面板里看到保存的數(shù)據(jù),如圖8所示:
我們已經(jīng)成功采集到了第一條簡(jiǎn)歷,接下來(lái)我們把整個(gè)頁(yè)面的簡(jiǎn)歷都采集過(guò)來(lái)。
我們把網(wǎng)頁(yè)拉到最下面,復(fù)制最后一條簡(jiǎn)歷姓名的XPath,跟第一條對(duì)比下,看看有啥區(qū)別:
//*[@id="infolist"]/dl/dd[2]
//*[@id="infolist"]/dl[35]/dd[2]
大家應(yīng)該注意到了,第一條XPath中間是dl(等同于dl [1]),最后一條XPath中間是dl[35]。也就是說(shuō),每條簡(jiǎn)歷的XPath只有dl[*]中間的數(shù)字是不一樣的,學(xué)過(guò)JavaScript的朋友可能已經(jīng)想到了,可以通過(guò)一個(gè)循環(huán)語(yǔ)句來(lái)采集所有簡(jiǎn)歷:
load("http://hz.58.com/searchjob/?key=android");
for(i = 1;i < 100;i++){
if(!has_element("http://*[@id='infolist']/dl[" + i + "]/dd[2]"))
break;
name = inner_text("http://*[@id='infolist']/dl[" + i + "]/dd[2]");
gender = inner_text("http://*[@id='infolist']/dl[" + i + "]/dd[3]");
age = inner_text("http://*[@id='infolist']/dl[" + i + "]/dd[4]");
exp = inner_text("http://*[@id='infolist']/dl[" + i + "]/dd[5]");
brief = inner_text("http://*[@id='infolist']/dl[" + i + "]/dt/span[2]");
link = attribute("http://*[@id='infolist']/dl[" + i + "]/dt/a","href");
save([name.trim(),gender.trim(),age.trim(),exp.trim(),brief.trim(),link.trim()]);
}
上面代碼中的has_element是蜂巢數(shù)據(jù)提供的一個(gè)輔助函數(shù),用來(lái)判斷網(wǎng)頁(yè)元素是否存在,因?yàn)槲覀儾恢谰W(wǎng)頁(yè)里總共有幾條簡(jiǎn)歷,所以需要通過(guò)has_element進(jìn)行檢測(cè)。運(yùn)行這段代碼后,我們會(huì)在數(shù)據(jù)字段面板里看到總共采集了35條簡(jiǎn)歷,如圖9所示:
單個(gè)網(wǎng)頁(yè)上的簡(jiǎn)歷采集完了,但58上搜到的簡(jiǎn)歷不只一頁(yè),接下來(lái)我們看看怎么用蜂巢數(shù)據(jù)采集多個(gè)頁(yè)面的數(shù)據(jù)。
把網(wǎng)頁(yè)拉到最下面,在第2頁(yè)的數(shù)字上右擊鼠標(biāo),選擇復(fù)制鏈接地址,用同樣的方法我們復(fù)制第3頁(yè)的鏈接地址對(duì)比下各個(gè)頁(yè)面的區(qū)別,如圖10所示:
http://hz.58.com/searchjob/pn2/?key=android
http://hz.58.com/searchjob/pn3/?key=android
對(duì)比第2頁(yè)和第3頁(yè)的鏈接地址,我們發(fā)現(xiàn)只有中間的pn2和pn3是不一樣的,同樣的我們可以通過(guò)一個(gè)循環(huán)分別打開(kāi)各個(gè)頁(yè)面進(jìn)行采集:
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("http://*[@id='infolist']/dl[" + i + "]/dd[2]"))
break;
name = inner_text("http://*[@id='infolist']/dl[" + i + "]/dd[2]");
gender = inner_text("http://*[@id='infolist']/dl[" + i + "]/dd[3]");
age = inner_text("http://*[@id='infolist']/dl[" + i + "]/dd[4]");
exp = inner_text("http://*[@id='infolist']/dl[" + i + "]/dd[5]");
brief = inner_text("http://*[@id='infolist']/dl[" + i + "]/dt/span[2]");
link = attribute("http://*[@id='infolist']/dl[" + i + "]/dt/a","href");
save([name.trim(),gender.trim(),age.trim(),exp.trim(),brief.trim(),link.trim()]);
}}
這里我只采集了5個(gè)頁(yè)面,因?yàn)樵俸竺娴暮?jiǎn)歷大部分可能都是過(guò)時(shí)的,沒(méi)必要采集。具體采集幾頁(yè),大家根據(jù)實(shí)際需求來(lái)設(shè)置就可以了。
腳本的編寫(xiě)算是告一段落了,到目前為止,我們都在任務(wù)編輯模式下工作,采集到的數(shù)據(jù)也沒(méi)有真正保存到數(shù)據(jù)庫(kù),關(guān)閉任務(wù)編輯窗口后采集到的數(shù)據(jù)就會(huì)消失。接下來(lái)我們?cè)谡鎸?shí)環(huán)境下運(yùn)行腳本。
點(diǎn)擊工具欄上的保存按鈕保存任務(wù),然后在任務(wù)面板里鼠標(biāo)右擊Android程序員,選擇開(kāi)始任務(wù),如圖12所示:
任務(wù)運(yùn)行結(jié)束后,鼠標(biāo)右擊Android程序員,選擇查看數(shù)據(jù),我們就可以在新打開(kāi)的標(biāo)簽里看到采集到的數(shù)據(jù)了,這些數(shù)據(jù)已經(jīng)保存在數(shù)據(jù)庫(kù)里了,關(guān)閉蜂巢數(shù)據(jù)后也不會(huì)丟失。你還可以選擇導(dǎo)致數(shù)據(jù)到Excel進(jìn)一步處理。如圖13所示:
以后每天我只需要打開(kāi)蜂巢數(shù)據(jù),運(yùn)行一遍Android程
序員任務(wù),就能采集到當(dāng)天更新的Android程序員簡(jiǎn)歷,而且蜂巢數(shù)據(jù)已經(jīng)幫我過(guò)濾過(guò)重復(fù)的簡(jiǎn)歷,省了我不少時(shí)間。
通過(guò)本文大家應(yīng)該對(duì)“蜂巢數(shù)據(jù)”的使用方法已經(jīng)有所了解,只要會(huì)點(diǎn)JavaScript編程基礎(chǔ),就可以很方便地編寫(xiě)腳本采集你所需要的內(nèi)容。
由于篇幅的原因,這里我就不深入去講解怎么用腳本篩選簡(jiǎn)歷,無(wú)非就是通過(guò)JavaScript對(duì)提取到的數(shù)據(jù)進(jìn)行分析,我相信大家熟悉了JavaScript語(yǔ)法后,這些都不是難事。
除了文中提到的簡(jiǎn)歷篩選,“蜂巢數(shù)據(jù)”可以做的事還很多。比如找工作篩選職位,行業(yè)數(shù)據(jù)分析,論壇回帖跟蹤等。希望“蜂巢數(shù)據(jù)”能對(duì)你有所幫助。