許丹亞,賈雨瀟
(1.鄭州鐵路局信息技術(shù)所,河南 鄭州 450000;2.中國民生銀行信用卡中心,北京 100071)
當(dāng)前招聘的形式眾多,其中,網(wǎng)絡(luò)招聘覆蓋的區(qū)域廣泛,信息量豐富,求職者可隨時獲得大量的空缺職位信息。國內(nèi)現(xiàn)有的網(wǎng)絡(luò)招聘平臺較為復(fù)雜,發(fā)布的招聘信息量巨大。求職信息列表冗長,篩選條件的粒度難以界定,求職者可能錯過很多求職機會。
因此,為了方便個體求職者,本文開發(fā)了基于Web的網(wǎng)絡(luò)招聘數(shù)據(jù)采集與分析系統(tǒng)。系統(tǒng)要解決的問題是網(wǎng)絡(luò)招聘信息平臺眾多,招聘信息量巨大,大量耗費求職者的精力和耐性,而現(xiàn)有的招聘信息分析工具應(yīng)用不便,不能直觀了解某一領(lǐng)域的人才需求現(xiàn)狀[1-2]。
系統(tǒng)對網(wǎng)站的招聘信息加以采集、分析并且以快速的、圖形化的形式進行統(tǒng)計,為用戶提供提高招聘信息檢索效率的工具。使用網(wǎng)絡(luò)招聘信息抽取與分析系統(tǒng),可以增強用戶的信息獲取、分析和辨別能力,提高求職效率。
系統(tǒng)的使用者分為未注冊用戶(游客)、用戶和管理員3類,系統(tǒng)為不同的使用者提供不同的服務(wù)。本文運用UML(統(tǒng)一建模語言)的用例圖和活動圖進行需求與功能分析[3]。
游客使用系統(tǒng)的過程為,根據(jù)城市列表和職位列表,游客篩選招聘信息,系統(tǒng)展示職位信息列表,游客可點擊職位列表中的地址,到某招聘網(wǎng)站上查看招聘信息詳情;系統(tǒng)分析查詢到的招聘信息,展示分析圖表。游客注冊后可以享受更多功能,如招聘信息分析、查看歷史記錄、匹配職位信息等。
其中,招聘信息為實時采集。信息列表中每條招聘信息包括:招聘信息編號、職位名稱、公司類型、薪資、學(xué)歷和詳細的訪問地址等。通過點擊系統(tǒng)抓取的鏈接地址,可訪問采集數(shù)據(jù)的原始鏈接。
登錄后的用戶使用的功能包括登錄和注冊、查詢招聘信息、查看招聘信息分析結(jié)果和匹配招聘信息。
另外,系統(tǒng)為管理員展示用戶信息列表,管理員可以刪除用戶的信息和所有的歷史記錄。
系統(tǒng)基本功能包括根據(jù)搜索招聘信息、匹配招聘信息和管理歷史記錄。
系統(tǒng)為用戶和游客提供搜索招聘信息功能,該功能根據(jù)輸入的篩選信息,實時采集信息并展示和分析,也可以訪問某一條招聘信息的鏈接。
系統(tǒng)為用戶提供匹配招聘信息功能,該功能根據(jù)輸入的意向信息,在用戶搜索的招聘信息里為用戶匹配信息并展示,用戶可以查看匹配信息列表,也可以修改意向信息,進行再次匹配。
系統(tǒng)為用戶和管理員提供歷史記錄功能,用戶可根據(jù)內(nèi)容查看具體的歷史記錄。歷史記錄分為招聘信息歷史記錄和招聘信息訪問歷史記錄兩種,用戶和管理員可以刪除歷史記錄。其中,招聘信息訪問記錄中,記錄著用戶點擊訪問的詳細頁面的記錄。訪問記錄包括訪問記錄編號、招聘信息編號和訪問的鏈接地址。
系統(tǒng)包括5個模塊,注冊登錄、用戶信息管理、信息采集、信息存儲、信息分析。在數(shù)據(jù)流的驅(qū)動下,各個模塊相互協(xié)調(diào)完成整個系統(tǒng)的功能。
2.1.1 信息采集模塊
信息采集模塊把實時采集的招聘信息結(jié)構(gòu)化和去除重復(fù)信息。該模塊分為輸入和請求模塊、網(wǎng)頁下載模塊、網(wǎng)頁解析模塊、數(shù)據(jù)格式化與輸出模塊。
其中,輸入和請求模塊負責(zé)從外部接收篩選后的信息,轉(zhuǎn)換為初始請求信息,并傳遞給網(wǎng)頁下載模塊;網(wǎng)頁下載模塊根據(jù)請求信息獲取要下載的網(wǎng)頁,把網(wǎng)頁信息傳遞給網(wǎng)頁解析模塊;網(wǎng)頁解析模塊對網(wǎng)頁進行初步清洗,并對篩選的每一個網(wǎng)頁進行解析;數(shù)據(jù)格式化與輸出模塊把數(shù)據(jù)格式化,設(shè)置緩存存儲每一次抓取的數(shù)據(jù),并把數(shù)據(jù)傳遞給數(shù)據(jù)存儲模塊,用于后續(xù)數(shù)據(jù)分析。
2.1.2 數(shù)據(jù)分析模塊和信息存儲模塊
數(shù)據(jù)分析模塊負責(zé)對招聘信息關(guān)鍵指標進行統(tǒng)計分析,并以圖表的形式輸出。其中,數(shù)據(jù)分析模塊提取招聘信息關(guān)鍵指標,并把數(shù)據(jù)轉(zhuǎn)換成圖表,最后把圖表二進制輸出。數(shù)據(jù)返回到前端,解碼為圖片展示。
信息存儲模塊負責(zé)提取抓取的招聘信息,并存儲到數(shù)據(jù)庫中,系統(tǒng)自動為招聘信息分配ID,以便后續(xù)的查詢與刪除;信息存儲模塊會接受來自注冊登錄模塊的注冊信息,把用戶的信息插入數(shù)據(jù)庫。
2.1.3 注冊登錄模塊和用戶信息管理模塊
注冊登錄模塊,負責(zé)用戶的注冊和登錄。用戶信息管理模塊可以讓用戶管理自己的信息,篩選出匹配的招聘信息;管理員可以管理用戶的信息,刪除歷史招聘信息記錄。
系統(tǒng)創(chuàng)建了用戶信息表、招聘信息表、管理員信息表、歷史記錄表和簡歷投遞表。系統(tǒng)中有3個實體,分別為用戶、管理員和招聘信息。其中,用戶可以抓取招聘信息,可以投遞簡歷。系統(tǒng)E-R模型如圖1所示。
圖1 系統(tǒng)E-R模型
系統(tǒng)使用的開發(fā)語言為Python,數(shù)據(jù)庫管理軟件為MySQL 5.7。
翻譯與民族身份構(gòu)建——以傳教士傈僳族地區(qū)的翻譯為例 ……………………………………… 藍紅軍(5.62)
游客輸入注冊信息,該模塊檢查輸入的注冊信息的用戶名是否已經(jīng)存在,不存在則注冊成功,否則給出提示信息。
用戶輸入登錄信息,該模塊把登錄信息與弱密碼用戶表中信息比對,若正確,進入系統(tǒng),否則重新輸入。
在用戶信息管理模塊中,用戶可以管理自己的信息,篩選出匹配的招聘信息。用戶登錄后進入個人中心,可輸入自己的職位意向信息,查詢匹配信息;用戶可投遞簡歷,簡歷投遞表中會記錄投遞情況,用戶后續(xù)可以查看投遞情況;用戶可輸入職位意向信息,點擊保存,數(shù)據(jù)庫中的用戶信息表中的相應(yīng)信息也會發(fā)生改變。
信息采集模塊應(yīng)用爬蟲技術(shù)對拉勾網(wǎng)的職位信息進行采集,并對數(shù)據(jù)進行清洗、去重,得到結(jié)構(gòu)一致的招聘信息列表,系統(tǒng)將記錄采集的信息記錄,用戶可查看和刪除已采集記錄。
其中輸入和請求模塊負責(zé)接收模塊外部傳遞進來的篩選信息,這些篩選信息包括意向城市和意向職位,該模塊通過對拉勾網(wǎng)站的結(jié)構(gòu)的拼接,并把其轉(zhuǎn)換為初始請求信息,下載相應(yīng)的網(wǎng)頁,獲得招聘信息的頁數(shù)。
用戶輸入篩選條件,可以在常用城市選項框內(nèi)選擇意向城市;也可以選擇點擊更多城市,在按字母排列的詳細城市列表中選擇意向城市。
用戶也可以選擇意向職位,可以在選項框內(nèi)選擇熱門職位;也可以選擇點擊更多城市按鈕,在出現(xiàn)的職位選擇彈出框中選擇職位分類。
輸入篩選條件后,點擊搜索按鈕,系統(tǒng)的信息采集模塊會實時采集符合條件的招聘信息,并在招聘信息展示區(qū)域展示信息和條數(shù)。
信息采集模塊采用了爬蟲技術(shù)。在編寫招聘信息頁面爬取規(guī)則之前,應(yīng)該對爬蟲進行一些基本的配置,這是編寫爬蟲腳本的重要一步,設(shè)置情況如表1所示。
表1 爬蟲的配置
拉勾網(wǎng)帶有反爬蟲機制,若缺少請求消息頭的配置,網(wǎng)站會識別出是爬蟲在訪問,拒絕連接。通過配置User-Agent請求的身份,設(shè)置為“Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)”,網(wǎng)站會把爬蟲的訪問當(dāng)作瀏覽器在訪問。time_out是超時時間,系統(tǒng)設(shè)為10 s,下載一個網(wǎng)頁,若10 s內(nèi)還沒有加載出來就放棄對這個網(wǎng)頁的下載,防止因為個別網(wǎng)頁出現(xiàn)問題導(dǎo)致整個系統(tǒng)不能運行。
拉勾網(wǎng)不是靜態(tài)網(wǎng)頁,爬取信息面臨很多問題,如網(wǎng)頁的觸發(fā)狀態(tài)更改,狀態(tài)變化可能是由網(wǎng)頁中的多種事件引起的。而點擊不限于元素,JavaScript允許為幾乎任何HTML元素添加點擊處理程序。除了點擊之外,其他事件可能導(dǎo)致狀態(tài)發(fā)生變化[4]。為了達到所有可能的狀態(tài),抓取工具可以調(diào)用所有可能元素上的所有可能事件。但即便如此,這些元素的組合可能是進入下一個狀態(tài)的關(guān)鍵。例如,某些應(yīng)用程序在用戶拿著鍵盤按鍵時有特殊狀態(tài),然后單擊一個元素。抓取工具面臨的挑戰(zhàn)是嘗試許多這樣的組合,或者發(fā)現(xiàn)JavaScript收聽哪些元素。在JavaScript中查找哪些元素具有偵聽器是比較方便的。因此,處理招聘網(wǎng)站客戶端是執(zhí)行JavaScript代碼,識別可被點擊的元素,跟蹤其變化過程,獲取數(shù)據(jù)。
輸入和請求模塊負責(zé)接收模塊外部傳遞進來的篩選信息,這些篩選信息包括意向城市和意向職位。該模塊通過對拉勾網(wǎng)結(jié)構(gòu)的研究得到該網(wǎng)頁請求篩選信息后的鏈接地址規(guī)律,通過這個規(guī)律的拼接,得出符合篩選條件的招聘信息的鏈接地址,并把其轉(zhuǎn)換為初始請求信息,把信息傳遞給網(wǎng)頁下載模塊。網(wǎng)頁下載模塊根據(jù)請求信息獲取要下載的網(wǎng)頁,把下載到的網(wǎng)頁傳遞給網(wǎng)頁解析模塊對網(wǎng)頁進行初步清洗,并對篩選的每一個網(wǎng)頁進行解析。數(shù)據(jù)格式化與輸出模塊會把數(shù)據(jù)進行格式化,設(shè)置一個緩存存儲每一次抓取的數(shù)據(jù),用于數(shù)據(jù)分析模塊的數(shù)據(jù)分析,并把數(shù)據(jù)插入數(shù)據(jù)庫。
網(wǎng)址拼接為:'https://www.lagou.com/jobs/list_' + job + '?px=default&city=' + city + '#filterBox',其中city和job為用戶選擇的意向城市和意向職位。
獲得地址后,用get()請求方式進入相關(guān)網(wǎng)頁,get()的參數(shù)分別為拉鉤網(wǎng)站的拼接地址、已經(jīng)配置過的爬蟲的請求頭headers。
下載到連接的網(wǎng)頁后,對網(wǎng)頁的文本進行正則匹配,得到符合篩選條件的招聘信息的頁數(shù),正則表達式為:re.findall('totalNum">(.*?)<', html, re.S)[0],參數(shù)html為所下載網(wǎng)頁的文本。這里進行一個判斷,對不能匹配的網(wǎng)頁設(shè)置可抓取的頁數(shù)為0。
構(gòu)造post數(shù)據(jù),把獲得的抓取頁數(shù)傳遞進來,獲得數(shù)據(jù)。這里進行一個判斷,對于頁面小于100的數(shù)據(jù)丟棄。
最后對數(shù)據(jù)進行解析和清洗,保留想要的招聘信息。
數(shù)據(jù)分析模塊負責(zé)把信息采集模塊采集到的招聘信息列表中的關(guān)鍵指標,學(xué)歷、工作經(jīng)驗、公司大小和薪資范圍進行統(tǒng)計分析,并以圖表的形式輸出。
信息存儲模塊把抓取的招聘信息和用戶的信息以一定的結(jié)構(gòu)插入數(shù)據(jù)庫。
如圖2所示為信息分析模塊的界面展示,圖中顯示了北京的Java工作招聘信息的統(tǒng)計情況,499條招聘信息中,分別是對學(xué)歷所占比例的統(tǒng)計、對工作經(jīng)驗的統(tǒng)計、對公司大小的統(tǒng)計和對薪資的統(tǒng)計。
通過圖2的4幅圖,可以對北京的Java工程師的就職要求有個大概的了解,本科學(xué)歷,有3~5年工作經(jīng)驗者優(yōu)先,月薪在9 000~25 000元。
由此可知,Java工程師崗位對學(xué)歷要求不高,但要有一定的工作經(jīng)驗;收入較為可觀,但長遠發(fā)展前景一般。
在對網(wǎng)絡(luò)招聘信息抽取與分析系統(tǒng)進行需求分析,并對基本的爬蟲技術(shù)和數(shù)據(jù)統(tǒng)計分析技術(shù)充分掌握的情況下,本文從用戶和功能角度出發(fā),對網(wǎng)絡(luò)招聘信息抽取與分析系統(tǒng)進行了詳細的設(shè)計,開發(fā)了小型基于Web的招聘數(shù)據(jù)采集與分析的系統(tǒng)。
系統(tǒng)為求職者解決了面對大量招聘信息時的窘境,實現(xiàn)了系統(tǒng)分析設(shè)計階段要達到的基本功能,系統(tǒng)可以長時間正常運行,但仍有一些局限,有待后續(xù)完善和擴展:(1)系統(tǒng)信息的來源不夠全面,后續(xù)將逐步添加熱門招聘網(wǎng)站;(2)系統(tǒng)的個人信息匹配雖然直接、方便,有一定的實用性,但匹配過于單一,對目標不明確的用戶不適用,應(yīng)進一步添加些成熟的匹配算法供用戶選擇;(3)數(shù)據(jù)分析模塊只對經(jīng)驗、薪資、學(xué)歷、公司大小進行了簡單的統(tǒng)計分析,后續(xù)可以增加更多指標的分析,也可以采用更高級的分析算法對數(shù)據(jù)進行精細分析。
圖2 信息分析模塊的分析結(jié)果