nutch爬虫技术学习知识点
1、Nutch1.x比Nutch2.x稳定
① Nutch2.x可以将数据放到HBase、Mysql等数据库中,但还在开发阶段
② Nutch1.x基于hdfs中SequenceFile文件去存储、管理海量数据;一轮爬取中,将所有的网页都放到content文件夹中,文件夹中存有若干个SequenceFile文件,每一个SequenceFile文件存储的是JAVA对象。
2、Nutch是在Hadoop上运行的
3、Nutch使用Linux Shell进行流程控制
4、Nutch分为几个流程,每一个流程都是由Map Reduce来完成
5、开发工具:Intellij和Netbeans可以兼容eclipse项目,也可以开发Nutch
6、Nutch常用的插件:
(1) URL正规化
(2) 正则过滤器
(3) http请求器
(4) 网页解析器
① 抽取网页中的链接,后面被存放到hdfs中,作为待爬取的链接
② 抽取网页中的信息,例如标题、描述,后面被存放到hdfs中,作为索引阶段提交给索引服务器的数据(用作搜索)。
(5) 网页打分
(6) 索引
(7) 。。。。。。。
一般需要修改的是http请求器和网页解析器
7、
nutch爬取数据的流程
执行”bin/crawl urls data http://xxx.xxx.xxx.xxx:8983/solr 轮数”命令的流程:
循环执行:产生-->抓取-->更新
Generator->Fetcher->ParseSegment->CrawlDb update
总结如下:
1) 建立初始 URL 集
2) 将 URL 集注入 crawldb 数据库---inject
3) 根据 crawldb 数据库创建抓取列表---generate
4) 执行抓取,获取网页信息---fetch
5) 解析抓取的内容---parse segment
6) 更新数据库,把获取到的页面信息存入数据库中---updatedb
7) 重复进行 3~5 的步骤,直到预先设定的抓取深度。---这个循环过程被称为“产生/抓取/更新”循环
8) 根据 sengments 的内容更新 linkdb 数据库---invertlinks
9) 建立索引---index
抓取完成之后会生成3个数据文件:crawldb、linkdb、segments。
crawldb: 爬行数据库,用来存储所要爬行的网址。
linkdb: 链接数据库,用来存储每个网址的链接地址,包括源地址和链接地址。
segments: 抓取的网址被作为一个单元,而一个segment就是一个单元。
1、inject注入url的流程:
2、crawldb
crawldb中存放的是url地址,第一次根据所给url :http://blog.tianya.cn进行注入,然后update crawldb 保存第一次抓取的url地址,下一次即depth=2的时候就会从crawldb中获取新的url地址集,进行新一轮的抓取。
crawldb中有两个文件夹:current 和old. current就是当前url地址集,old是上一次的一个备份。每一次生成新的,都会把原来的改为old。
current和old结构相同 里面都有part-00000这样的一个文件夹(local方式下只有1个) 在part-00000里面分别有data和index两个文件。一个存放数据,一个存放索引。
nutch的日志记录:
crawldb的状态:
说明:
-stats命令是一个快速查看爬取信息的很有用的命令:
TOTAL urls:表示当前在crawldb中的url数量。
db_unfetched:链接到已爬取页面但还没有被爬取的页面数(原因是它们没有通过url过滤器的过滤,或者包括在了TopN之外被Nutch丢弃)
db_fetched:表示已爬取和索引的页面,如果其值为0,那肯定出错了。
db_redir_temp和db_redir_perm分别表示临时重定向和永久重定向的页面。
db_gone:表示发生了404错误或者其他一些臆测的错误,这种状态阻止了对其以后的爬取工作。
min score、avg score、max score是分值算法的统计值,是网页重要性的依据。
通过-dump参数将抓取到的url输出到文件中查看
通过-url参数查看具体链接的信息:
3、segments
每一个segments都是一组被作为一个单元来获取的URL。segments是它本身这个目录以及它下面的子目录:
一个crawl_generate确定了将要被获取的一组URL;
一个crawl_fetch包含了获取的每个URL的状态;
一个content包含了从每个URL获取回来的原始的内容;
一个parse_text包含了每个URL解析以后的文本;
一个parse_data包含来自每个URL被解析后内容中的外链和元数据;
一个crawl_parse包含了外链的URL,用来更新crawldb。
每个文件的生成时间:
1.crawl_generate在Generator的时候生成;
2.content,crawl_fetch在Fetcher的时候生成;
3.crawl_parse,parse_data,parse_text在Parse segment的时候生成。
查看content内容:
bin/nutch readseg -dump ./data/segments/20140111162237 ./data/crawl_tianya_seg_content -nofetch -nogenerate -noparse -noparsedata -noparsetext
查看crawl_fetch内容:
bin/nutch readseg -dump ./data/segments/20140111162237 ./data/crawl_tianya_seg_fetch -nocontent -nogenerate -noparse -noparsedata -noparsetext
查看crawl_generate内容:
bin/nutch readseg -dump ./data/segments/20140111162237 ./data/crawl_tianya_seg_generate -nocontent -nofetch -noparse -noparsedata -noparsetext
查看crawl_parse内容:
bin/nutch readseg -dump ./data/segments/20140111162237 ./data/crawl_tianya_seg_parse -nofetch -nogenerate -nocontent –noparsedata –noparsetext
查看parse_data内容:
bin/nutch readseg -dump ./data/segments/20140111162237 ./data/crawl_tianya_seg_content -nofetch -nogenerate -noparse -nocontent -noparsetext
查看parse_text内容:
bin/nutch readseg -dump ./data/segments/20140111162237 ./data/crawl_tianya_seg_content -nofetch -nogenerate -noparse -noparsedata -nocontent
4.通过readdb及topN参数命令查看按分值排序的url
(1) .这里我设定的条件为:前10条,分值大于1
./bin/nutch readdb ./data/crawldb -topN 10 ./data/crawldb_topN 1
(2) 不设分值条件,查询前10条
./bin/nutch readdb ./data/crawldb -topN 10 ./data/crawldb_topN_all_score