Nutch 开发(一)

文章目录

  • Nutch 开发(一)
      • 开发环境
    • 1.IDEA 导入nutch项目
    • 2.nutch源码目录了解
    • 3.Nutch爬取步骤
    • 4.启动类的介绍
    • 5.Nutch的sh脚本
    • 6.运行injector
      • 6.1 配置
      • 6.2创建一个url列表
      • 6.3 IDEA创建启动
      • 6.4 运行效果对等
    • 7.Injector主函数分析
    • 8.运行Generator
      • 8.1 IDEA创建启动
      • 8.2 运行效果对等
    • 9.运行Fetcher
      • 9.1 IDEA创建启动
      • 9.2 报错分析
      • 9.3 配置http.agent.name
      • 9.3 运行效果对等
    • 10.运行ParseSegment
      • 10.1 IDEA创建启动
      • 10.2 运行效果对等
    • 11.运行CrawlDb
      • 11.1 IDEA创建启动
      • 11.2 运行效果对等
    • 12.运行LinkDb
        • 12.1 IDEA创建启动
        • 12.2 运行效果对等
      • 下一章

开发环境

  • Linux,Ubuntu20.04LST
  • IDEA
  • Nutch1.18
  • Solr8.11

转载请声明出处!!!By 鸭梨的药丸哥

1.IDEA 导入nutch项目

要开发nutch最好连nutch源码一起下载下来。去官方下载nutch的源码包。

1.18版本的下载地址:https://www.apache.org/dyn/closer.lua/nutch/1.18/apache-nutch-1.18-src.tar.gz

我下载的是Linux的源码包,因为nutch很多命令都需要运行在Linux上面,所以为了方便我是在Linux上对nutch的插件进行开发。

编译源码前,确保已经安装好ant,可以执行下面的方法进行ant的安装

sudo apt-get update
sudo apt-get install ant

将nutch构建成eclipse项目

ant eclipse

然后使用IDEA以eclipse工程导入项目,这个网上的资源比较多,正常滴导入Nutch源码项目即可,导入时选择以eclipse项目的方式进行导入。

2.nutch源码目录了解

通过nutch源码编译出来的目录结构跟下载的bin包的结构目录有细微的差异

build/    #ant eclipse编译后的生成的
conf/     #配置文件目录
docs/     #接口文档
ivy/      #ivy依赖管理工具的文件夹
lib/      #放置Hadoop本机库的占位符的文件夹(不会自动下载,里面的组件用来加快数据(反)压缩)
src/      #源码目录

3.Nutch爬取步骤

Nutch整个爬取过程是分很多步骤的:

  • injector -> generator -> fetcher -> parseSegment -> updateCrawleDB -> Invert links -> Index -> DeleteDuplicates -> IndexMerger
  1. 建立初始URL集

  2. 执行inject ,将URL集注入crawldb数据库

  3. 执行generate,根据crawldb数据库创建抓取列表

  4. 执行fetch,获取网页信息

4.2)执行parse,解析网页信息

  1. 执行updatedb ,把获取到的页面信息存入数据库中

  2. 重复进行3~5的步骤,直到预先设定的抓取深度。—“产生/抓取/更新”循环

  3. 执行invertlinks ,根据sengments的内容更新linkdb数据库

  4. 建立索引—index (如:在solr中建立索引)

Nutch作者画的一个Nutch架构图,以前较老版本的架构,当初nutch还未吧全文检索功能分离出来

4.启动类的介绍

主要的启动类如下:

Operation Class in Nutch 1.x (i.e.trunk) Class in Nutch 2.x
inject org.apache.nutch.crawl.Injector org.apache.nutch.crawl.InjectorJob
generate org.apache.nutch.crawl.Generator org.apache.nutch.crawl.GeneratorJob
fetch org.apache.nutch.fetcher.Fetcher org.apache.nutch.fetcher.FetcherJob
parse org.apache.nutch.parse.ParseSegment org.apache.nutch.parse.ParserJob
updatedb org.apache.nutch.crawl.CrawlDb org.apache.nutch.crawl.DbUpdaterJob
invertlinks org.apache.nutch.crawl.LinkDb ???

5.Nutch的sh脚本

重Nutch的sh脚本可以发现,nutch脚本的本质还是调用具体的启动类来实现其功能。

下面截取sh的部分片段,可以看出不同的COMMAND对应不同的启动类,然后将命令行的参数传递给启动类。

# figure out which class to run
if [ "$COMMAND" = "crawl" ] ; thenecho "Command $COMMAND is deprecated, please use bin/crawl instead"exit -1
elif [ "$COMMAND" = "inject" ] ; thenCLASS=org.apache.nutch.crawl.Injector
elif [ "$COMMAND" = "generate" ] ; thenCLASS=org.apache.nutch.crawl.Generator
elif [ "$COMMAND" = "freegen" ] ; thenCLASS=org.apache.nutch.tools.FreeGenerator
elif [ "$COMMAND" = "fetch" ] ; thenCLASS=org.apache.nutch.fetcher.Fetcher
elif [ "$COMMAND" = "parse" ] ; thenCLASS=org.apache.nutch.parse.ParseSegment
elif [ "$COMMAND" = "readdb" ] ; thenCLASS=org.apache.nutch.crawl.CrawlDbReader
elif [ "$COMMAND" = "mergedb" ] ; thenCLASS=org.apache.nutch.crawl.CrawlDbMerger
elif [ "$COMMAND" = "readlinkdb" ] ; thenCLASS=org.apache.nutch.crawl.LinkDbReader
elif [ "$COMMAND" = "readseg" ] ; thenCLASS=org.apache.nutch.segment.SegmentReader
elif [ "$COMMAND" = "mergesegs" ] ; thenCLASS=org.apache.nutch.segment.SegmentMerger
elif [ "$COMMAND" = "updatedb" ] ; thenCLASS=org.apache.nutch.crawl.CrawlDb
elif [ "$COMMAND" = "invertlinks" ] ; thenCLASS=org.apache.nutch.crawl.LinkDb
elif [ "$COMMAND" = "mergelinkdb" ] ; thenCLASS=org.apache.nutch.crawl.LinkDbMerger
elif [ "$COMMAND" = "dump" ] ; thenCLASS=org.apache.nutch.tools.FileDumper
elif [ "$COMMAND" = "commoncrawldump" ] ; thenCLASS=org.apache.nutch.tools.CommonCrawlDataDumper
elif [ "$COMMAND" = "solrindex" ] ; thenCLASS="org.apache.nutch.indexer.IndexingJob -D solr.server.url=$1"shift
elif [ "$COMMAND" = "index" ] ; thenCLASS=org.apache.nutch.indexer.IndexingJob
elif [ "$COMMAND" = "solrdedup" ] ; thenecho "Command $COMMAND is deprecated, please use dedup instead"exit -1
elif [ "$COMMAND" = "dedup" ] ; thenCLASS=org.apache.nutch.crawl.DeduplicationJob
elif [ "$COMMAND" = "solrclean" ] ; thenCLASS="org.apache.nutch.indexer.CleaningJob -D solr.server.url=$2 $1"shift; shift
elif [ "$COMMAND" = "clean" ] ; thenCLASS=org.apache.nutch.indexer.CleaningJob
elif [ "$COMMAND" = "parsechecker" ] ; thenCLASS=org.apache.nutch.parse.ParserChecker
elif [ "$COMMAND" = "indexchecker" ] ; thenCLASS=org.apache.nutch.indexer.IndexingFiltersChecker
elif [ "$COMMAND" = "filterchecker" ] ; thenCLASS=org.apache.nutch.net.URLFilterChecker
elif [ "$COMMAND" = "normalizerchecker" ] ; thenCLASS=org.apache.nutch.net.URLNormalizerChecker
elif [ "$COMMAND" = "domainstats" ] ; then CLASS=org.apache.nutch.util.domain.DomainStatistics
elif [ "$COMMAND" = "protocolstats" ] ; thenCLASS=org.apache.nutch.util.ProtocolStatusStatistics
elif [ "$COMMAND" = "crawlcomplete" ] ; thenCLASS=org.apache.nutch.util.CrawlCompletionStats
elif [ "$COMMAND" = "webgraph" ] ; thenCLASS=org.apache.nutch.scoring.webgraph.WebGraph
elif [ "$COMMAND" = "linkrank" ] ; thenCLASS=org.apache.nutch.scoring.webgraph.LinkRank
elif [ "$COMMAND" = "scoreupdater" ] ; thenCLASS=org.apache.nutch.scoring.webgraph.ScoreUpdater
elif [ "$COMMAND" = "nodedumper" ] ; thenCLASS=org.apache.nutch.scoring.webgraph.NodeDumper
elif [ "$COMMAND" = "plugin" ] ; thenCLASS=org.apache.nutch.plugin.PluginRepository
elif [ "$COMMAND" = "junit" ] ; thenCLASSPATH="$CLASSPATH:$NUTCH_HOME/test/classes/"if $local; thenfor f in "$NUTCH_HOME"/test/lib/*.jar; doCLASSPATH="${CLASSPATH}:$f";donefiCLASS=org.junit.runner.JUnitCore
elif [ "$COMMAND" = "startserver" ] ; thenCLASS=org.apache.nutch.service.NutchServer
elif [ "$COMMAND" = "webapp" ] ; thenCLASS=org.apache.nutch.webui.NutchUiServer
elif [ "$COMMAND" = "warc" ] ; thenCLASS=org.apache.nutch.tools.warc.WARCExporter
elif [ "$COMMAND" = "updatehostdb" ] ; thenCLASS=org.apache.nutch.hostdb.UpdateHostDb
elif [ "$COMMAND" = "readhostdb" ] ; thenCLASS=org.apache.nutch.hostdb.ReadHostDb
elif [ "$COMMAND" = "sitemap" ] ; thenCLASS=org.apache.nutch.util.SitemapProcessor
elif [ "$COMMAND" = "showproperties" ] ; thenCLASS=org.apache.nutch.tools.ShowProperties
elseCLASS=$COMMAND
fi

6.运行injector

inject的主函数在org.apache.nutch.crawl包的injector类中。

6.1 配置

要运行inject,首先要apache-nutch-1.18/conf/nutch-site.xml添加plugin.folders配置,用来覆盖掉默认的相对路径的配置。因为使用nutch脚本的运行路径和我们直接用源码运行的路径是不同的。

<property>  <name>plugin.folders</name>  <value>/home/liangwy/IdeaProjects/apache-nutch-1.18/src/plugin</value>  <description>Directories where nutch plugins are located.  Each  element may be a relative or absolute path.  If absolute, it is used  as is.  If relative, it is searched for on the classpath.</description>
</property>
6.2创建一个url列表
mkdir urls
touch urls/seeds.txt
vim urls/seeds.txt
#然后输入要第一批进行爬取的url即可
6.3 IDEA创建启动

点击主菜单依次选择: Run -> Edit Configurations ,点击 + 号,选择创建 Application :

  • Name : Injector
  • Main Class :org.apache.nutch.crawl.Injector (1.x版本的主函数类,具体名字要看源码2.x叫InjectorJob)
  • VM options :-Dhadoop.log.dir=logs -Dhadoop.log.file=hadoop.log
  • Program arguments : /home/User/IdeaProjects/apache-nutch-1.18/myNutch/crawldb /home/User/apache-nutch-1.18/urls (存储抓取地址文件seed.txt的目录)

注意:Program arguments的填充是跟你nutch提供的脚本传递的参数一样的

6.4 运行效果对等

运行效果等价于使用nutch(Bin版本)的bin/目录下的nutch命令一样。

./nutch inject /home/User/IdeaProjects/apache-nutch-1.18/myNutch/crawldb /home/liangwy/apache-nutch-1.18/urls

7.Injector主函数分析

injector的main函数如下:

public static void main(String[] args) throws Exception {int res = ToolRunner.run(NutchConfiguration.create(), new Injector(), args);System.exit(res);
}

Injector的运行是通过ToolRunner进行的,点开ToolRunner的run函数,发现最后运行的实际调用方法是injector的run函数。

方法参数:

  • Configuration conf #nutch的配置
  • Tool tool #要运行的工具类(如:injector,generator)
  • String[] args #传递给工具类的命令行参数
public static int run(Configuration conf, Tool tool, String[] args) throws Exception {if (CallerContext.getCurrent() == null) {CallerContext ctx = (new Builder("CLI")).build();CallerContext.setCurrent(ctx);}if (conf == null) {conf = new Configuration();}//解析配置GenericOptionsParser parser = new GenericOptionsParser(conf, args);tool.setConf(conf);String[] toolArgs = parser.getRemainingArgs();//实际运行还是调用tool自身的runreturn tool.run(toolArgs);}

8.运行Generator

8.1 IDEA创建启动

点击主菜单依次选择: Run -> Edit Configurations ,点击 + 号,选择创建 Application :

  • Name : Generator
  • Main Class :org.apache.nutch.crawl.Generator
  • Program arguments : /home/User/IdeaProjects/apache-nutch-1.18/myNutch/crawldb /home/User/IdeaProjects/apache-nutch-1.18/myNutch/segments -topN 100

注意:Program arguments的填充是跟你nutch提供的脚本传递的参数一样的

8.2 运行效果对等

运行效果等价于使用nutch(Bin版本)的bin/目录下的nutch命令一样。

./nutch generate /home/liangwy/IdeaProjects/apache-nutch-1.18/myNutch/crawldb /home/liangwy/IdeaProjects/apache-nutch-1.18/myNutch/segments -topN 100

9.运行Fetcher

9.1 IDEA创建启动

点击主菜单依次选择: Run -> Edit Configurations ,点击 + 号,选择创建 Application :

  • Name : Fetcher
  • Main Class :org.apache.nutch.fetcher.Fetcher
  • Program arguments : /home/User/IdeaProjects/apache-nutch-1.18/myNutch/segments/20220114175955 -threads 16

注意:Program arguments的填充是跟你nutch提供的脚本传递的参数一样的

9.2 报错分析

没有配置http.agent.name,这个配置可以在conf/nutch-site.xml中进行配置

Fetcher: No agents listed in ‘http.agent.name’ property.
Fetcher: java.lang.IllegalArgumentException: Fetcher: No agents listed in ‘http.agent.name’ property.
at org.apache.nutch.fetcher.Fetcher.checkConfiguration(Fetcher.java:563)
at org.apache.nutch.fetcher.Fetcher.fetch(Fetcher.java:431)
at org.apache.nutch.fetcher.Fetcher.run(Fetcher.java:545)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:76)
at org.apache.nutch.fetcher.Fetcher.main(Fetcher.java:518)

9.3 配置http.agent.name

在conf/nutch-site.xml文件中添加如下配置

property><name>http.agent.name</name><value>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.43</value><description>HTTP 'User-Agent' request header. MUST NOT be empty -please set this to a single word uniquely related to your organization.NOTE: You should also check other related properties:http.robots.agentshttp.agent.descriptionhttp.agent.urlhttp.agent.emailhttp.agent.versionand set their values appropriately.</description></property><property><name>http.robots.agents</name><value>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.43,*</value></property>
9.3 运行效果对等

运行效果等价于使用nutch(Bin版本)的bin/目录下的nutch命令一样。

./nutch fetch /home/liangwy/IdeaProjects/apache-nutch-1.18/myNutch/segments/20220114175955 -threads 16

10.运行ParseSegment

10.1 IDEA创建启动

点击主菜单依次选择: Run -> Edit Configurations ,点击 + 号,选择创建 Application :

  • Name : ParseSegment
  • Main Class :org.apache.nutch.parse.ParseSegment
  • Program arguments : /home/User/IdeaProjects/apache-nutch-1.18/myNutch/segments/20220114175955

注意:Program arguments的填充是跟你nutch提供的脚本传递的参数一样的

10.2 运行效果对等

运行效果等价于使用nutch(Bin版本)的bin/目录下的nutch命令一样。

./nutch parse /home/liangwy/IdeaProjects/apache-nutch-1.18/myNutch/segments/20220114175955

11.运行CrawlDb

11.1 IDEA创建启动

点击主菜单依次选择: Run -> Edit Configurations ,点击 + 号,选择创建 Application :

  • Name : CrawlDb
  • Main Class :org.apache.nutch.crawl.CrawlDb
  • Program arguments : /home/liangwy/IdeaProjects/apache-nutch-1.18/myNutch/crawldb/ -dir /home/liangwy/IdeaProjects/apache-nutch-1.18/myNutch/segments

注意:Program arguments的填充是跟你nutch提供的脚本传递的参数一样的

11.2 运行效果对等

运行效果等价于使用nutch(Bin版本)的bin/目录下的nutch命令一样。

./nutch updatedb /home/liangwy/IdeaProjects/apache-nutch-1.18/myNutch/crawldb/ -dir /home/liangwy/IdeaProjects/apache-nutch-1.18/myNutch/segments

12.运行LinkDb

12.1 IDEA创建启动

点击主菜单依次选择: Run -> Edit Configurations ,点击 + 号,选择创建 Application :

  • Name : LinkDb
  • Main Class :org.apache.nutch.crawl.LinkDb
  • Program arguments : /home/liangwy/IdeaProjects/apache-nutch-1.18/myNutch/linkdb -dir /home/liangwy/IdeaProjects/apache-nutch-1.18/myNutch/segments/

注意:Program arguments的填充是跟你nutch提供的脚本传递的参数一样的

12.2 运行效果对等

运行效果等价于使用nutch(Bin版本)的bin/目录下的nutch命令一样。

/nutch invertlinks /home/liangwy/IdeaProjects/apache-nutch-1.18/myNutch/linkdb -dir /home/liangwy/IdeaProjects/apache-nutch-1.18/myNutch/segments/

下一章

下一章,教如何将这些步骤进行整合。

Nutch开发(一)相关推荐

  1. nutch开发(六)

    nutch开发(六) 文章目录 nutch开发(六) 1.nutch1.18整合solr-8.11.0 1.1 配置index-writers.xml文件 1.2 solr core字段的配置 1.3 ...

  2. Nutch开发(四)

    Nutch开发(四) 文章目录 Nutch开发(四) 开发环境 1.Nutch插件设计介绍 2.解读插件目录结构 3. build.xml 4. ivy.xml 5. plugin.xml 6. 解读 ...

  3. Nutch开发(三)

    Nutch开发(三) 文章目录 Nutch开发(三) 开发环境 1.Nutch url过滤 2.示例 3.在Solr建立index 关于solr字段的配置 4.关于Nutch plugin 5.关于N ...

  4. nutch开发(二)

    nutch开发(二) 文章目录 nutch开发(二) 开发环境 1.爬取后生成的目录结构 crawldb linkdb segments 2.阅读TestCrawlDbMerger createCra ...

  5. Nutch编译及集成eclipse+mysql开发环境的部署总结

    Nutch是一个应用程序,以Lucene为基础实现的搜索引擎应用,Lucene为Nutch 提供了文本搜索和索引的API,Nutch不仅提供搜索,而且还有数据抓取的功能. 1)linux下nutch集 ...

  6. Nutch插件开发及发布流程

    2019独角兽企业重金招聘Python工程师标准>>>  一,插件开发流程: 1,Nutch开发客户端环境搭建 2,plugin的源代码则保存在/src/java/org/apach ...

  7. 目前网络上开源的网络爬虫以及一些简介和比较

    2019独角兽企业重金招聘Python工程师标准>>> 目前网络上开源的网络爬虫以及一些简介和比较 目前网络上有不少开源的网络爬虫可供我们使用,爬虫里面做的最好的肯定是google ...

  8. 一起学Hadoop——Hadoop的前世今生

    Hadoop是什么? Hadoop是一个处理海量数据的开源框架.2002年Nutch项目面世,这是一个爬取网页工具和搜索引擎系统,和其他众多的工具一样,都遇到了在处理海量数据时效率低下,无法存储爬取网 ...

  9. sql select半角html全角,SQL转换全角和半角函数

    SQL转换全角和半角函数 CREATE FUNCTION f_Convert( @str NVARCHAR(4000), --要转换的字符串 @flag bit --转换标志,0转换成半角,1转换成全 ...

  10. 【菜鸟窝】Hadoop生态系统、Hadoop虚拟机环境准备、Hadoop环境搭建(含安装包和教程)

    hadoop环境搭建视频:https://www.cniao5.com/course/lessons/10244 1.1Hadoop简介 1.1.1Hadoop的诞生 Hadoop是由Apache L ...

最新文章

  1. Windows API函数大全
  2. python 协程并发
  3. 混合索引_数据库面试题:查询在什么情况下不?索引-数据库知识点
  4. MySQL高级-索引是个什么东西?explain到底怎么用-MySQL查询优化大全
  5. C/C++ 踩过的坑和防御式编程
  6. maven设置jdk版本(全局设置和工程设置)
  7. 【机器学习】传统目标检测算法之级联分类器Cascade
  8. .NET Core多平台项目模板eShopOnContainers编译手记
  9. jdk重启后步行_向后介绍步行以一种新颖的方式来预测未来
  10. Qt文档阅读笔记-QFuture官方解析及实例
  11. 基于JAVA+SpringMVC+Mybatis+MYSQL的高校勤工助学管理系统
  12. 2014年的六级考试即将来临,你们准备好了吗?
  13. python模板代码替换_Python - 安全替换字符串模板(safe_substitute) 详细解释
  14. linux下查看用户个数和具体名字
  15. Office2016+Visio2016安装过程
  16. linux 移动硬盘位置,在linux中使用移动硬盘
  17. 箭头小三角(向上或向下、两条边)--两种制作方法
  18. Mysql之DDL(数据定义语言)
  19. Elasticsearch Join类型查询父子关系
  20. iOS 网络性能优化之路

热门文章

  1. 【超图+CESIUM】【基础API使用示例】46、超图|CESIUM - 聚光源设置
  2. BusHound详解
  3. 数学建模与数学实验3.4习题1
  4. 如何减少linux内存碎片
  5. 三国古城和108将地图已恢复
  6. ADC的指标详细定义,SNR,以下内容无关: -------------------------------------------分割线----------------SNDR,SFDR,THD等
  7. lldp协议代码阅读_LLDP(lldp协议平时开启还是关闭)
  8. Python实现网络出口带宽自动巡检
  9. 深度解读汽车域控制器
  10. linux 安装sz,linux中rz、sz命令的安装配置方法