Nutch开发(一)
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
建立初始URL集
执行inject ,将URL集注入crawldb数据库
执行generate,根据crawldb数据库创建抓取列表
执行fetch,获取网页信息
4.2)执行parse,解析网页信息
执行updatedb ,把获取到的页面信息存入数据库中
重复进行3~5的步骤,直到预先设定的抓取深度。—“产生/抓取/更新”循环
执行invertlinks ,根据sengments的内容更新linkdb数据库
建立索引—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开发(一)相关推荐
- nutch开发(六)
nutch开发(六) 文章目录 nutch开发(六) 1.nutch1.18整合solr-8.11.0 1.1 配置index-writers.xml文件 1.2 solr core字段的配置 1.3 ...
- Nutch开发(四)
Nutch开发(四) 文章目录 Nutch开发(四) 开发环境 1.Nutch插件设计介绍 2.解读插件目录结构 3. build.xml 4. ivy.xml 5. plugin.xml 6. 解读 ...
- Nutch开发(三)
Nutch开发(三) 文章目录 Nutch开发(三) 开发环境 1.Nutch url过滤 2.示例 3.在Solr建立index 关于solr字段的配置 4.关于Nutch plugin 5.关于N ...
- nutch开发(二)
nutch开发(二) 文章目录 nutch开发(二) 开发环境 1.爬取后生成的目录结构 crawldb linkdb segments 2.阅读TestCrawlDbMerger createCra ...
- Nutch编译及集成eclipse+mysql开发环境的部署总结
Nutch是一个应用程序,以Lucene为基础实现的搜索引擎应用,Lucene为Nutch 提供了文本搜索和索引的API,Nutch不仅提供搜索,而且还有数据抓取的功能. 1)linux下nutch集 ...
- Nutch插件开发及发布流程
2019独角兽企业重金招聘Python工程师标准>>> 一,插件开发流程: 1,Nutch开发客户端环境搭建 2,plugin的源代码则保存在/src/java/org/apach ...
- 目前网络上开源的网络爬虫以及一些简介和比较
2019独角兽企业重金招聘Python工程师标准>>> 目前网络上开源的网络爬虫以及一些简介和比较 目前网络上有不少开源的网络爬虫可供我们使用,爬虫里面做的最好的肯定是google ...
- 一起学Hadoop——Hadoop的前世今生
Hadoop是什么? Hadoop是一个处理海量数据的开源框架.2002年Nutch项目面世,这是一个爬取网页工具和搜索引擎系统,和其他众多的工具一样,都遇到了在处理海量数据时效率低下,无法存储爬取网 ...
- sql select半角html全角,SQL转换全角和半角函数
SQL转换全角和半角函数 CREATE FUNCTION f_Convert( @str NVARCHAR(4000), --要转换的字符串 @flag bit --转换标志,0转换成半角,1转换成全 ...
- 【菜鸟窝】Hadoop生态系统、Hadoop虚拟机环境准备、Hadoop环境搭建(含安装包和教程)
hadoop环境搭建视频:https://www.cniao5.com/course/lessons/10244 1.1Hadoop简介 1.1.1Hadoop的诞生 Hadoop是由Apache L ...
最新文章
- Windows API函数大全
- python 协程并发
- 混合索引_数据库面试题:查询在什么情况下不?索引-数据库知识点
- MySQL高级-索引是个什么东西?explain到底怎么用-MySQL查询优化大全
- C/C++ 踩过的坑和防御式编程
- maven设置jdk版本(全局设置和工程设置)
- 【机器学习】传统目标检测算法之级联分类器Cascade
- .NET Core多平台项目模板eShopOnContainers编译手记
- jdk重启后步行_向后介绍步行以一种新颖的方式来预测未来
- Qt文档阅读笔记-QFuture官方解析及实例
- 基于JAVA+SpringMVC+Mybatis+MYSQL的高校勤工助学管理系统
- 2014年的六级考试即将来临,你们准备好了吗?
- python模板代码替换_Python - 安全替换字符串模板(safe_substitute) 详细解释
- linux下查看用户个数和具体名字
- Office2016+Visio2016安装过程
- linux 移动硬盘位置,在linux中使用移动硬盘
- 箭头小三角(向上或向下、两条边)--两种制作方法
- Mysql之DDL(数据定义语言)
- Elasticsearch Join类型查询父子关系
- iOS 网络性能优化之路
热门文章
- 【超图+CESIUM】【基础API使用示例】46、超图|CESIUM - 聚光源设置
- BusHound详解
- 数学建模与数学实验3.4习题1
- 如何减少linux内存碎片
- 三国古城和108将地图已恢复
- ADC的指标详细定义,SNR,以下内容无关: -------------------------------------------分割线----------------SNDR,SFDR,THD等
- lldp协议代码阅读_LLDP(lldp协议平时开启还是关闭)
- Python实现网络出口带宽自动巡检
- 深度解读汽车域控制器
- linux 安装sz,linux中rz、sz命令的安装配置方法