汤义好
摘要: 现代教学设计理论认为优化教学过程,可以更好有效地达成教学目标,提高教学效率。文章阐述了在岗位分析系统中如何利用网络爬虫框架WebMagic不断地从网络采集岗位招聘数据,并保存到HBase数据库的一个过程。
关键词:大数据;岗位招聘;WebMagic
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2018)28-0008-02
大学生最关心的莫过于就业,高校的数字化建设日渐成熟,大数据在就业方面的应用正处在积极探索阶段。可以说数据采集是大数据应用开发的一个重要环节,如果没有数据,处理分析也就无从谈起。下面我们就来讨论下如何进行数据采集。
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("//div[@class='cn']/h1/text()").toString());
page.putField("name", page.getHtml().xpath("//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();