非 貓
?
招聘好幫手:用“蜂巢數據”篩選簡歷
非貓
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("http://*[@id='infolist']/dl/dd[2]");
(注意:剛才復制過來的XPath,infolist是被雙引號包起來的,腳本里我們替換成單引號,這是JavaScript語法需要,有興趣的朋友可以學習下JavaScript語法)
用同樣的辦法,我們再提取性別,年齡,工作經驗,學歷等數據,然后我們通過“蜂巢數據”提供的print方法,把提取到的數據打印到輸出面板,如圖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("工作經驗:" + 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("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是蜂巢數據提供的一個輔助函數,用來判斷網頁元素是否存在,因為我們不知道網頁里總共有幾條簡歷,所以需要通過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("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個頁面,因為再后面的簡歷大部分可能都是過時的,沒必要采集。具體采集幾頁,大家根據實際需求來設置就可以了。
腳本的編寫算是告一段落了,到目前為止,我們都在任務編輯模式下工作,采集到的數據也沒有真正保存到數據庫,關閉任務編輯窗口后采集到的數據就會消失。接下來我們在真實環境下運行腳本。
點擊工具欄上的保存按鈕保存任務,然后在任務面板里鼠標右擊Android程序員,選擇開始任務,如圖12所示:
任務運行結束后,鼠標右擊Android程序員,選擇查看數據,我們就可以在新打開的標簽里看到采集到的數據了,這些數據已經保存在數據庫里了,關閉蜂巢數據后也不會丟失。你還可以選擇導致數據到Excel進一步處理。如圖13所示:
以后每天我只需要打開蜂巢數據,運行一遍Android程
序員任務,就能采集到當天更新的Android程序員簡歷,而且蜂巢數據已經幫我過濾過重復的簡歷,省了我不少時間。
通過本文大家應該對“蜂巢數據”的使用方法已經有所了解,只要會點JavaScript編程基礎,就可以很方便地編寫腳本采集你所需要的內容。
由于篇幅的原因,這里我就不深入去講解怎么用腳本篩選簡歷,無非就是通過JavaScript對提取到的數據進行分析,我相信大家熟悉了JavaScript語法后,這些都不是難事。
除了文中提到的簡歷篩選,“蜂巢數據”可以做的事還很多。比如找工作篩選職位,行業數據分析,論壇回帖跟蹤等。希望“蜂巢數據”能對你有所幫助。