Nutch-0.9源代码:Crawl类整体分析

Windows下配置nutch Windows下配置nutch轻松拥有自己的小引擎(表示弄了一上午了) 因为课程需要所以用到nutch,但是看了网上的攻略都不适用,各种bug,所以自己总结了一下经验 1、Nutch简介(建议看一下Nutch) Nutch 是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫   Nutch 致力于让每个人能很容易, 同时花费很少就可... 阅读详情

Nutch-0.9中,org.apache.nutch.crawl.Crawl类中提供了一个入口主函数main,通过接收键入的命令行,根据命令行指定的参数对Nutch进行配置,从而启动Nutch抓取程序,通过阅读org.apache.nutch.crawl.Crawl类的源代码来了解Nutch是如何根据接收的命令行进行配置及其启动的。

org.apache.nutch.crawl.Crawl类的主函数如下所示:

   // 应该知道,Nutch查找文件系统是基于Linux系统的机制的,所以提供启动的命令与Linux的Shell命令很相似。

   public static void main(String args[]) throws Exception {
    if (args.length < 1) { // 检查命令行参数是否合法,如果小于1个参数,则给出提示。
      System.out.println
        ("Usage: Crawl <urlDir> [-dir d] [-threads n] [-depth i] [-topN N]");
      return;
    }

    Configuration conf = NutchConfiguration.create(); // 使用静态类NutchConfiguration创建一个org.apache.hadoop.conf.Configuration实例,可以在Hadoop的源代码中查看到该类的定义(读取hadoop-site.xml配置文件)
    conf.addDefaultResource("crawl-tool.xml"); // 读取并设置抓取工具的配置文件,可以在nutch-0.9\conf目录下找到
crawl-tool.xml文件
    JobConf job = new NutchJob(conf);
// 抓取任务配置实例的创建

    Path rootUrlDir = null; // 初始URLs文件所在的目录,使用Hadoop的org.apache.hadoop.fs.Path类创建目录
    Path dir = new Path("crawl-" + getDate()); // 设置默认抓取到网页的存放目录。如果命令行中没有指定-dir 的值就会使用默认的值:crawl-时间。
    int threads = job.getInt("fetcher.threads.fetch", 10); // 设置默认抓取工作启动线程数目,默认值为10。
    int depth = 5; // 默认抓取工作遍历深度,默认值为5。
    int topN = Integer.MAX_VALUE; // 抓取任务抓取网页的数量,默认为最大值。

    for (int i = 0; i < args.length; i++) { // 根据读取的命令行,设置抓取工作配置信息。
      if ("-dir".equals(args[i])) {
        dir = new Path(args[i+1]);
        i++;
      } else if ("-threads".equals(args[i])) {
        threads = Integer.parseInt(args[i+1]);
        i++;
      } else if ("-depth".equals(args[i])) {
        depth = Integer.parseInt(args[i+1]);
        i++;
      } else if ("-topN".equals(args[i])) {
        topN = Integer.parseInt(args[i+1]);
        i++;
      } else if (args[i] != null) {
        rootUrlDir = new Path(args[i]);
      }
    }

    FileSystem fs = FileSystem.get(job); // 根据抓取工作配置JobConf创建一个用来存放抓取到的网页的目录。
    if (fs.exists(dir)) {
      throw new RuntimeException(dir + " already exists."); // 如果该目录已经存在,则发生运行时异常。
    }

    if (LOG.isInfoEnabled()) { // 登录日志信息
      LOG.info("crawl started in: " + dir);
      LOG.info("rootUrlDir = " + rootUrlDir);
      LOG.info("threads = " + threads);
      LOG.info("depth = " + depth);
      if (topN != Integer.MAX_VALUE)
        LOG.info("topN = " + topN);
    }

    // 在目录dir下面创建下面5个目录,用来存放,抓取工作过程中不同操作生成的文件或者目录。
    
    Path crawlDb = new Path(dir + "/crawldb");
    Path linkDb = new Path(dir + "/linkdb");
    Path segments = new Path(dir + "/segments");
    Path indexes = new Path(dir + "/indexes");
    Path index = new Path(dir + "/index");

    Path tmpDir = job.getLocalPath("crawl"+Path.SEPARATOR+getDate());
    Injector injector = new Injector(conf);
// 根据Configuration conf创建一个Injector实例
    Generator generator = new Generator(conf); // 根据Configuration conf创建一个Generator实例
    Fetcher fetcher = new Fetcher(conf); // 根据Configuration conf创建一个Fetcher实例
    ParseSegment parseSegment = new ParseSegment(conf); // 根据Configuration conf创建一个ParseSegment实例
    CrawlDb crawlDbTool = new CrawlDb(conf); // 根据Configuration conf创建一个CrawlDb实例
    LinkDb linkDbTool = new LinkDb(conf); // 根据Configuration conf创建一个LinkDb实例
    Indexer indexer = new Indexer(conf); // 根据Configuration conf创建一个Indexer实例
    DeleteDuplicates dedup = new DeleteDuplicates(conf); // 根据Configuration conf创建一个DeleteDuplicates实例
    IndexMerger merger = new IndexMerger(conf); // 根据Configuration conf创建一个IndexMerger实例
      
    // 初始化crawlDb
    injector.inject(crawlDb, rootUrlDir); // 从rootUrlDir目录中读取初始化URLs,将URLs注入到CrawlDb实体中去
    int i;
    for (i = 0; i < depth; i++) {             // 在segment文件中生成抓取工作列表
      Path segment = generator.generate(crawlDb, segments, -1, topN, System
          .currentTimeMillis(), false, false);
      if (segment == null) {
        LOG.info("Stopping at depth=" + i + " - no more URLs to fetch.");
        break;
      }
      fetcher.fetch(segment, threads); // 根据配置的线程数开始抓取网页文件
      if (!Fetcher.isParsing(job)) {
        parseSegment.parse(segment);    // 解析网页文件
      }
      crawlDbTool.update(crawlDb, new Path[]{segment}, true, true); // 更新CrawlDb
    }
    if (i > 0) {
      linkDbTool.invert(linkDb, segments, true, true, false); // invert links

    indexer.index(indexes, crawlDb, linkDb, fs.listPaths(segments)); // 索引过程
      dedup.dedup(new Path[] { indexes });
// 复制索引文件
      merger.merge(fs.listPaths(indexes), index, tmpDir); // 将索引目录index中的索引文件合并后写入到indexes目录中
    } else {
      LOG.warn("No URLs to fetch - check your seed list and URL filters.");
    }
    if (LOG.isInfoEnabled()) { LOG.info("crawl finished: " + dir); }
}

通过上面的源代码的整体分析,总结一下具体都在这里做了哪些工作:

1、读取命令行参数,合法以后才继续初始化配置实例;

2、通过读取hadoop-site.xml配置文件,初始化一个Configuration实例,并根据crawl-tool.xml文件内容设置抓取工作配置;

3、设置一些默认抓取工作参数,如果命令行中没有指定就会按照默认的参数值进行抓取工作的执行,比如,抓取工作抓取到的网页文件存放目录rootUrlDir、启动的抓取工作进程数threads、抓取深度depth、抓取网页数量topN;

4、创建抓取工作抓取到的网页文件的存放目录,及其子目录(crawldb、linkdb、segments、indexes、index),这些子目录有的是用来存放原生网页,有的是预处理网页文件,有的是网页解析出的文本内容及其其它相关数据等等;

5、在抓取工作及其索引过程中,要进行很多操作来对网页文件或数据进行处理,这通过初始化一些实现了这些操作的类的实例来完成的,例如:Injector、Generator、Fetcher、ParseSegment、CrawlDb、LinkDb、Indexer、DeleteDuplicates、IndexMerger。这些类中,有的是作为实体类,像CrawlDb、LinkDb,它们需要在抓取工作执行过程中及时更新,保持数据状态的处于良好正确状态。

6、最后,就开始执行相关操作了,包括初始化CrawlDb、生成抓取工作列表、抓取网页文件、更新CrawlDb、倒排Links、建立索引、复制索引文件、合并索引文件。

 

from: http://hi.baidu.com/shirdrn/blog/item/b7de0813a865a8d6f7039e18.html
Crawl 立即下载

相关推荐

Drupal远程代码执行漏洞(CVE-2018-7600)实战复现:从检测到写入WebShell的全过程

本文详细解析了Drupal远程代码执行漏洞(CVE-2018-7600)的实战复现过程,从环境搭建、漏洞检测到WebShell写入的全流程。该高危漏洞影响Drupal 6.x至8.x版本,允许攻击者未经授权执行任意代码。文章提供了多种POC构造方法和高级利用技巧,帮助安全研究人员深入理解漏洞原理并掌握验证技术。

weixin_29322553的博客 275

a crawler base on libevent

a crawler base on libevent http://monkey.org/~provos/crawl/crawl - a small and efficient HTTP crawlercrawl - a small and efficient...

191

易灵思FPGA实战:T35F324的PLL硬核配置全流程(附避坑指南)

本文详细解析了易灵思T35F324 FPGA中硬核PLL的配置全流程与核心避坑点。内容涵盖从架构理解、Interface Designer参数设置、VCO范围校验,到时钟网络冲突分析与动态重配置等实战环节,重点解决了引脚分配、资源约束和常见报错问题,为工程师提供了一套清晰可靠的配置指南。

u9v0w的博客 215

Python爬虫仅需一行代码----crawl第三方库

仅需一行代码写爬虫–crawl crawl 仅需一行代码即可达到爬虫效果 项目地址(欢迎star):https://github.com/Amiee-well/crawl 使用方法 pip install crawl from crawl import request request.parse( url='https://www.douban.com/group/explore', type_url='text', #login='taobao', Parsing =

一名新生程序员的日常 2万+

VisionMaster位置修正功能深度解析:如何让找圆工具自动跟随移动目标?

本文深度解析海康威视VisionMaster平台的位置修正功能,重点介绍如何通过模板匹配与找圆工具的智能联动实现移动目标的动态追踪。文章详细阐述了工业视觉检测中的坐标系同步原理、模板匹配配置技巧及异常处理策略,为工程师提供了一套完整的工业级解决方案。

uu89012的博客 281

深度学习驱动材料科学:晶体生成与性质预测技术综述

深度学习作为人工智能的核心技术,通过模拟人脑神经网络处理复杂数据,在多个领域展现出强大的模式识别与生成能力。其原理在于构建多层非线性变换,从海量数据中自动学习特征表示与映射关系。这一技术价值在于能够高效处理高维、非结构化数据,解决传统方法计算成本高、探索空间有限的问题。在工程实践中,深度学习已广泛应用于计算机视觉、自然语言处理等领域,并正深刻变革材料科学的研究范式。具体到材料领域,它通过学习已知材料的构效关系,实现对新材料性能的快速预测与逆向设计。应用场景包括但不限于新能源材料、半导体、催化剂等领域的高通量

weixin_28695161的博客 414

nutch源码分析---4

nutch源码分析—parse bin/nutch parse crawl/segments/*

conansonic的博客 2063

保姆级教程:用sw_urdf_exporter插件将Solidworks机械臂模型转为ROS可用的URDF

本文提供了一份详细的保姆级教程,指导用户使用sw_urdf_exporter插件将Solidworks机械臂模型转换为ROS可用的URDF文件。从环境准备、插件配置到模型预处理和关键参数设置,再到ROS环境集成测试和性能优化,全面覆盖了机械臂URDF转换的全流程。特别适合机器人工程师和ROS开发者快速实现Solidworks模型到ROS环境的无缝迁移。

weixin_29300931的博客 399

Nutch-0.9源代码:Crawl类整体分析(转载)

Nutch-0.9源代码:Crawl类整体分析(转载) Nutch-0.9中,org.apache.nutch.crawl.Crawl类中提供了一个入口主函数main,通过接收键入的命令行,根据 命令行指定的参数对Nutch进行配置,从而启动Nutch抓取程序,通过阅读org.apache.nutch.crawl.Crawl类的源代码来了 解Nutch是如何根据接收的命令行进行配置及其启动的...

Sophie.xu的专栏 178

基于卷积神经网络的人脸识别算法

摘要:近年来,随着科学技术的不断发展,人脸识别技术日渐成熟,使得人脸识别技术的使用率不断增大。例如:门禁、ATM机、公安系统以及新兴起的人机交互等领域,都应用到了人脸识别系统。在人脸识别研究领域中,深度学习扮演着重要的角色。由于深度学习的人脸识别技术凭借其识别率高、识别快等特点,逐渐成为整个领域的主流技术。在众多深度学习算法中,以卷积神经网络为代表的人脸识别系统得到了广泛应用,主要研究内容如下:首先,通过对经典损失函数进行研究,对比每种损失函数的特点,然后根据A-Softmax函数进行改进,借助Margin

yyq2263511327的博客 1万+

Halcon实战:5分钟搞定线序颜色检测(附完整代码解析)

本文详细介绍了如何使用Halcon在5分钟内实现工业级线序颜色检测的高效方案。通过机器视觉技术,结合实战项目经验,提供完整的代码解析和优化技巧,帮助开发者快速构建鲁棒性强、准确率高的检测系统,适用于电子制造和汽车线束等行业。

weixin_29098367的博客 441

Nutch1.0 Crawl整体代码分析

[img]http://dl.iteye.com/upload/attachment/151051/4d80cf30-28d0-3485-be82-3dfa3bf9d20a.png[/img] ================================================================ Crawler和Searcher两部分被尽是分开,其主要目的是为了使两个...

JLife 雅致 博大 精深 196

SAR合成孔径雷达成像及处理(附带Matlab源代码)

总结:本文介绍了SAR合成孔径雷达的基本原理,并提供了使用Matlab实现SAR成像和处理的源代码示例。然后,在慢时间域进行方位压缩处理,通过计算每个接收通道的延迟和频移,将多次接收的信号叠加得到最终的成像结果。SAR成像的基本原理是通过接收雷达发射的脉冲信号的回波,并利用多次接收的信号进行叠加处理。以多普勒频移校正为例,根据雷达飞行速度和方位角,计算实际的多普勒频率,并对每个接收通道的数据进行频移校正,以消除因目标运动引起的频率偏移。通过调整参数和算法,可以实现不同的SAR成像和处理效果。

ByteJolt的博客 689

nutch在windows下的配置

nutch0.9+Tomcat6在windows下的配置,还需要下载一个Cygwin类UNIX模拟环境,当然在linux环境下可以跳过这个。 在nutch-0.9目录下新建一个weburls.txt,用于存放入口网页地址,如http://www.view.sdu.edu.cn/。然后在nutch-0.9/conf/crawl-urlfilter.txt文件里修改以下地方:在 # accept

王小垚的博客 1207

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

nutch之crawl命令

1、建立urls目录并添加163文件[root@localhost nutch]#mkdir urls [root@localhost nutch]#echo http://www.163.com/>>urls/1632、编辑conf/crawl-urlfilter.txt文件,设定要抓取的网址信息[root@localhost nutch]#vi conf/crawl-urlfilter.txt 修改MY.DOMAIN.NAME为: # accept hosts in MY.DOMAIN.NAME

gls_liujia的专栏 2562

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Nutch 0.9笔记

      一直留意Lucene,Nutch的进展,最近这两个项目都发展得非常快,Lucne已发展到 2.1,Nutch已发展到 0.9,改进了很多,令人欣喜。      今天小试了一下Nutch-0.9,笔记如下:      1、解压Nutch包,在Nutch根目录下建目录urls,里面建一些包含URL的文本如urlt.txt,一行一个URL,内容如:http://www.blogjava.ne...

rainsf 216

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

nutch 配置crawl-urlfilter.txt,regex-urlfilter.txt和nutch-site.xml

  1:解压缩的nutch后,到conf下面修改crawl-urlfilter.txt# accept hosts in MY.DOMAIN.NAME+^http://([a-z0-9]*\.)*apache.org/+^http://([a-z0-9]*\.)*longtask.com/blog/如果有需要可以继续添加相关的站点.     2:修改conf下面的nutch-site.xml文件,...

nhy520 247

nutch1.9安装

下载nutch1.9 http://mirrors.hust.edu.cn/apache/nutch/1.9/apache-nutch-1.9-bin.tar.gz 解压

bitterliquor的专栏 1134

在Eclipse下编译和运行Nutch 0.9

[quote]就在刚刚,终于把Nutch 0.9在Eclipse中配置成功了,苦恼了我一个星期的问题终于解决了!现在真的是心情舒畅哦!哈哈,当然,我首先还是要感谢一下笨笨的,在网上搜到了他的博客文章,给了我很大的帮助哦。呵呵,还有我的同学,虽然和我隔着远了点,不过还是给我帮了很大的忙哦!哈哈,真的要好好感谢一下他呢!我又在毕业设计成功的道路上迈进了一大步呢!怎么也要纪念一下么!哈哈! 笨笨的...

我游啊游啊游^^......... 236

Nutch-0.9源代码:Injector类

在对Nutch抓取工作流程分析中,已经简单地提及到了inject操作,如下所示: inject操作调用的是nutch的核心包之一crawl包中的类org.apache.nutch.crawl.Injector。它执行的结果是:crawldb数据库内容得到更新,包括URL及其状态。 inject操作主要作用可以从下面3方面来说明: (1) 将URL集合进行格式化和过滤,消除其中的非法URL,并设定U...

nhy520 148

nutch mysql hadoop_Hadoop-Nutch学习整理(持续更新)

[-dir d] [-threads n] [-depth i] [-topN]3、爬取结果解析nutch爬取下来的网页信息,保存路径格式如下:主要爬取信息保存在路径segments下:喎?http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHVsPgo8bGk+Q3Jhd2xkYsrHy/nT0NDo...

weixin_34693059的博客 170
上一篇: Nutch工作流程
下一篇: Nutch-0.9源代码:NutchConfiguration类
RuizeMa
博客等级 码龄18年 8粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值