湯義好
摘要: 現代教學設計理論認為優化教學過程,可以更好有效地達成教學目標,提高教學效率。文章闡述了在崗位分析系統中如何利用網絡爬蟲框架WebMagic不斷地從網絡采集崗位招聘數據,并保存到HBase數據庫的一個過程。
關鍵詞:大數據;崗位招聘;WebMagic
中圖分類號:TP393 文獻標識碼:A 文章編號:1009-3044(2018)28-0008-02
大學生最關心的莫過于就業,高校的數字化建設日漸成熟,大數據在就業方面的應用正處在積極探索階段??梢哉f數據采集是大數據應用開發的一個重要環節,如果沒有數據,處理分析也就無從談起。下面我們就來討論下如何進行數據采集。
1 數據采集的來源與工具
就業信息主要來自網絡和學校招聘,主要的崗位數據源于網絡,需要有一套采集軟件也就是爬蟲。爬蟲有很多,綜合考慮WebMagic是一個無序配置、便于二次開發的爬蟲框架,其提供簡單靈活的API,只需要少量代碼既可以實現。數據抓取時序圖如圖1所示。
Downloader負責從互聯網上下載頁面,以便后續處理。WebMagic默認使用Apache HttpClient作為下載工具。PageProcessor負責解析頁面,抽取有用的信息,以及發現新的鏈接。WebMagic使用Jsoup作為HTML解析工具,并基于其開發了解析XPath的工具Xsoup。PageProcessor對于每個站點每個頁面的解析都不一樣,是需要使用者定制的部分。Scheduler負責調度,一般無須自己定制。Pipeline負責抽取結果的處理,包括計算、持久化到文件、數據庫等。默認提供了輸出到控制臺和保存到文件兩種結果處理方案。
2 如何實施爬取任務
(1) 解析崗位列表源代碼
定制基于Java的WebMagic爬蟲框架抓取招聘網站上根據崗位的關鍵詞如“大數據”搜索出的崗位結果。列出的關于關鍵詞搜索出來的列表就是爬蟲抓取的起始頁??梢酝ㄟ^添加后續鏈接的URL至爬取隊列,使得爬蟲按照要求一步步循環下去。這里需要添加的鏈接便是崗位的信息頁,以及后續列表分頁。分析頁面中的相同項,可以發現所需要的URL是一個唯一的超鏈接,記下標簽的樣式名稱交給Xpath識別,并添加至抓取列,實現代碼如下。
select = page.getHtml().xpath(“//p[@class = t1 ]”);
urls = select.links().all();
page.addTargetRequests(urls);
需要注意的是,要防止添加空白搜索結果頁的鏈接,否則將會把整個招聘網站的崗位全部抓取下來。所以需要添加提出隊列的保護機制,代碼如下:
Iteratror
while(it.hasNext()){
String x = it.next();
If(x.equals(“http://...”)){
it.remove();
}
}
page.addTargetRequest(urls);
(2) 解析崗位信息頁面
需要爬取的崗位信息包括職位名稱、發布時間、是否洗數據、編號、工作地點、工作經驗、薪資、招聘人數、學歷、崗位描述、職能類別、公司名稱、公司性質、公司行業、公司規模等。由于格式基本差不多可以json配置項的方式將某個點的正則保存在一起,方便調用。WebMagic框架可以根據獲取的正則定位相關的內容。具體代碼如下:
page.putField("jobname", page.getHtml().xpath("http://div[@class='cn']/h1/text()").toString());
page.putField("name", page.getHtml().xpath("http://p[@class='cname']/a/text()").toString());
(3) 根據條件保存抓取到的信息
根據條件篩選崗位信息,比如已經列出的一些培訓機構的“公司黑名單”,保存在數組中,那么就可以使用簡單的if語句來判斷。對于發布日期,僅需要保留當天或本周發布的招聘信息。篩選完成便可以將抓取內容選擇性的保存到本地的某個文件中。也可以將結果保存到HDFS和HBase數據庫中,這樣更有助于后面的大數據處理。
(4) 運行主程序
WebMagic的核心組件為PageProcessor與Pipeline。用戶可以自己定制這兩個組件,而調用這兩個核心組件是通過Spider類,其簡單的代碼如下:
Spider.create(new CrawlJob())
.addUrl(URL_START)
.addPipleline(new PipelineJob()).thread(5).run();
可以借助系統的定時服務來實現程序的定時爬取功能使用代碼如下:
public ServiceState start() {
initializer = new InitializeService(this);
initializer.start();
services.add(initializer);
Service jobAnalyzer = new JobAnalysisService(this, initializer);
jobAnalyzer.start();