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