您好, 访客   登录/注册

网络数据采集框架Nutch及其应用研究

来源:用户上传      作者:周飚

  [摘 要]随着大数据与云计算、物联网、人工智能进一步融合,各行各业产生了海量电子化数据,建立大数据应用首要解决的问题就是采集数据,其中,Apache Nutch是用于数据采集的爬虫框架。为采集若干人才招聘网站职位需求数据,采用MySQL数据库进行数据存储,采用Nutch实现网站数据采集,采用排程框架Quartz实现数据定时采集和更新。
  [关键词]Nutch;分布式;爬虫框架;Crawler Quartz排程
  doi:10.3969/j.issn.1673 - 0194.2019.18.078
  [中图分类号]TP391.1 [文献标识码]A [文章编号]1673-0194(2019)18-0-03
  0     引 言
  未来大数据产业发展出现两大趋势:①与云计算、人工智能等前沿创新技术深度融合,实现超大规模数据运算,智能化、自动化的海量数据分析,在短时间内完成复杂度较高、精密度较高的信息处理;②制造业产品从市场规划、设计、制造、销售到维护整个生命周期会产生大量结构化和非结构化数据,形成制造业大数据,为使产品制造全过程变得更加敏捷、精准和智能,企业不断升级制造业的大数据解决方案,助力传统制造业迅速转型与发展。
  世界各国已将大数据上升为国家战略,大数据在推动我国经济转型升级过程中发挥着至关重要的作用。从大数据产业层级来看,主要分为3层,从底层到上层分别是基础支撑层、数据服务层和融合应用层。面对来自政府、工业、农业、交通、商品交易和互联网等各方面巨大的数据,发展大数据应用亟待建立起稳定高效的数据采集和存储的基础设施。数据从哪里来,如何采集数据,是首先要解决的问题。
  1     网站数据采集
  互联网网站会产生大量开放的非结构化和结构化网页数据。对于这些数据,企业可以通过网站提供的公共API和网页爬虫从网站上获取。网页爬虫适用所有可以访问的网站,无论网站是否提供了API,都可以进行数据采集,这种方案不存在局限性。目前,常用的网页爬虫系统有Nutch、Crawler4j、Scrapy等框架。本文将对Nutch在网页数据采集方面进行初步研究。
  2     Nutch技术介绍
  Apache Nutch是一个高度可扩展和可伸缩性的分布式爬虫框架。Nutch通过分布式抓取网页数据,并由Hadoop支持,通过提交MapReduce任务来抓取网页数据,可以将网页数据存储在HDFS分布式文件系统中。Nutch可以进行分布式多任务的数据爬取、存储和索引。由于多个计算机并行做爬取任务,Nutch可以充分利用多个计算机的计算资源和存储能力,大大提高系统爬取数据能力。Nutch在搜索引擎中负责爬取网页,同时自动维护网页的URL信息,例如,相同网页去重、网页定时更新、网页重定向。Nutch采用了MapReduce分布式爬取和解析,具有良好的水平擴展性。Nutch 2.x引入了Gora作为存储抽象层,从而支持各种传统SQL数据库和NoSQL数据库,如MySQL、HBase、Cassandra等。
  只看Apache Nutch单任务网页爬虫,从总体上分为3个主要部分,即爬行、索引和搜索,各部分之间的协作关系是Nutch根据目标网址列表及层级访问网站,抓取内容并进行存储,然后对这些内容建立索引,在索引的基础上完成所需数据的搜索。Nutch基本运行流程包含5个步骤:①将起始URL集合注入Nutch系统中;②生成片段文件,其中,包含将要抓取的URL地址,然后根据URL地址在互联网上抓取相应内容;③解析所抓取到的网页,并分析其中的文本和数据;④根据新抓取网页中的URL集合更新起始URL集合,并再次进行抓取;⑤对抓取到的网页内容建立索引,生成索引文件存放在系统中。从用户角度来看,Nutch提供了一个基于Tomcat的查询应用程序,允许用户输入词条,Nutch以Lucene为搜索引擎在索引文件中进行搜索,并将相应的结果返回给用户。
  3     案例及解决方案研究
  本文基于Nutch2.1爬虫框架结合其他技术来研究如何采集各个人才招聘网站职位需求数据,为中、高等职业院校主管部门在专业设置、招生就业方面提供数据分析依据。
  (1)建立Eclipse开发环境下Nutch+MySQL二次开发环境。下载Nutch 2.2.1源码,修改相关配置文件,利用ant工具构建Eclipse二次开发项目,在Eclipse开发环境中导入该项目。创建Java Maven项目,在pom.xml文件中配置好Nutch,依赖各个jar包并自动下载。
  (2)安装MySQL数据库服务器,创建后台数据库及webpage表。
  (3)配置Nutch,使其采用MySQL关系型数据库存储数据。修改/ivy/ivy.xml文件的代码如下。
  <dependency org="org.apache.gora" name="gora-core" rev="0.2.1" conf="*->default"/>
  <dependency org="org.apache.gora" name="gora-sql" rev="0.1.1-incubating" conf="*->default" />
  <dependency org="mysql" name="mysql-connector-java" rev="5.1.18" conf="*->default"/>
  (4)项目数据库连接配置。修改gora.properties,以连接到指定的后台数据库,   ora.sqlstore.jdbc.driver=com.mysql.jdbc.Driver
  gora.sqlstore.jdbc.url=jdbc:mysql://数据库服务器IP地址:端口/后台数据库名
  gora.sqlstore.jdbc.user=XXXX(连接数据库的用户名)
  gora.sqlstore.jdbc.password=******(连接数据库的密码)
  (5)配置nutch-site.xml文件,添加6个property。第1个property的name为http.agent.name,value为YourNutchSpider;第2个property的name为http.accept.language,value为ja-jp, en-us,en-gb,en;q=0.7,*;q=0.3;第3个property的name为storage.data.store.class,value为org.apache.gora.sql.store.SqlStore;第4个property的name为parser.character.encoding.default,value为utf-8;第5个property的name为plugin.includes,value为protocol-http|urlfilter-regex|parse-(html|tika)|index-(basic|anchor)|urlnormalizer-(pass|regex|basic)|scoring-opic;第6个property的name为generate.batch.id,value为*。
  配置格式如下所示:
  <property>
  <name>属性名</name>
  <value>属性值</value>
  <description>描述</description>
  </property>
  (6)配置Nutch要访问的种子网站域名。在项目根目录下,建立urls目录,然后在目录下建立一个文本文件,文件名为seed.txt,内容是爬取的人才网站域名。
  (7)调用Nutch API。Nutch本身提供了Crawler类来执行数据爬虫的命令。可以使用Hadoop的ToolRunner来运行Crawl工具,自定义Java类MyCrawler.java,在main方法中调用ToolRunner.run方法运行Crawler,主要代码如下。
  public class MyCrawler {
  public static void main(String[] args) {
   String crawlArg = "urls -depth 1";
   try {
   ToolRunner.run(NutchConfiguration.create(), new Crawler(), tokenize(crawlArg));
   } catch (Exception e) {
   e.printStackTrace();
   return;
   }
  }
  public static String[] tokenize(String str) {
   StringTokenizer tok = new StringTokenizer(str);
   String tokens[] = new String[tok.countTokens()];
   int i = 0;
   while (tok.hasMoreTokens()) {
   tokens[i] = tok.nextToken();
   i++;
   }
   return tokens;
  }
  }
  (8)为了解决定时采集最新人才招聘网站的职位需求数据,引入java排程框架Quartz。将上面实现网页抓取的代码封装进Job接口的实现类CrawJob,再利用Quartz排程API实现定时执行数据采集,主要代码如下。
  //1、创建Scheduler的工厂
  SchedulerFactory sf = new StdSchedulerFactory();
  //2、从工厂中获取调度器实例
  Scheduler scheduler = sf.getScheduler();
  //3、创建JobDetail
  JobDetail jobDetail = JobBuilder.newJob(CrawlJob.class)
  .withDescription("This is a crawl web data job by nutch to DB.")
  .withIdentity("crawlJob", "crawGroup")
  .build();
  //4、創建Trigger
  Trigger t = TriggerBuilder.newTrigger()
  .withDescription("This is a trigger of crawl web data.")
  .withIdentity("crawlTrigger", "crawlTriggerGroup")   .startAt(startTime)
  .withSchedule(CronScheduleBuilder.cronSchedule("0 */1 * * * ?")).build();
  //5、注册任务和定时器
  scheduler.scheduleJob(jobDetail, t);
  scheduler.scheduleJob(historyJobDetail, historyTrigger);
  //6、启动调度器
  scheduler.start();
  上述代码实现每隔1分钟采集一次人才网站的最新数据。
  4     为数据分析做准备
  Nutch将采集到的数据存储到webpage数据表中,可根据数据分析需要再定义相关数据表,每隔一段时间将webpage中的数据进行解析,存入数据表中。考虑性能需要,定时清除webpage中的历史数据。存入相关数据表中的结构化数据为数据分析解决了数据从哪里来的问题。经过数据采集、解析和结构化,接着可以根据业务需求进行数据分析和统计,并可借助图形展现框架将这些定义良好的有价值的数据进行可视化展现。
  5     下一步研究方向
  以上是以MySQL数据库作为数据存储来研究Nutch数据采集,下一步将MySqL关系型数据库存储转换成Hoodap分布式存储,利用Nutch相关技术建立爬虫集群,进一步研究Nutch的分布式数据采集,为更大规模、更快响应数据采集做准备。把Nutch与Hoodap整合起来,Nutch负责抓取数据,Hoodap负责存储数据,真正建立大数据应用平台,结合全文检索引擎Lucene/Solr实现数据实时索引和快速检索。
  主要参考文献
  [1]朱应坚,陈雪梅,向勇.基于Nutch的分布式电商数据采集数据研究[J].广东通信技术,2015(10).
  [2]孙立伟,何国辉,吴礼发.网络爬虫技术的研究[J].电脑知识与技术,2010(15).
  [3]宋豪.基于WiFi的分布式無线数据采集系统研究与实现[D]. 西安:西安理工大学,2018.
  [4]王烽.新型互联网中服务信任自动管理机制设计与实现[D].北京:北京交通大学,2018.
  [5]龚延伦.A公司三期工程可行性研究项目的范围管理[D].成都:电子科技大学,2010.
  [6]王思贤.基于DSP的直接转矩控制系统研究[D].长沙:中南大学,2009.
  [7]唐湘越.基于DSP的直接转矩控制系统研究[D].大连:大连交通大学,2009.
  [8]宋志坚.基于LXI的高性能数据采集系统的软件设计与实现[D].成都:西南交通大学,2008.
  [9]陈美华.面向P2P环境的SLBLTrust信任模型及其安全扩展机制研究[D].上海:华东师范大学,2009.
转载注明来源:https://www.xzbu.com/3/view-15019180.htm