`
wwkevin811
  • 浏览: 6567 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Nutch源代码解读--1

阅读更多
主要分析利用HTTP协议爬取爬取网页)

   本身是研究搜索引擎地,对开源的NUTCH很感兴趣。但是网上的代码对于NUTCH的分析都十分有限,我希望能尽我的力量把NUTCH里的代码尽我所能分析给大家。

本文主要从一个爬虫系统最底层的爬虫如何爬行一个网页做一个分析。这个是比较底层的,如果之前对NUTCH没有详细使用过或者看过一些代码的。可以先去网上看一些使用NUTCH的流程。再看我这里的分析,可能会更加清楚些。

  (PS:Nutch的官方http://lucene.apache.org/nutch/,much more details)

  OK:话归正题.nutch里通过fecher这个类具体负责一次的爬行工作。在Crawl这个main方法里   fetcher.fetch(segment, threads); // fetch it这里的segment是经过处理的包含了待爬行队列的URL的信息。(这在以后会更详细的介绍到),threads是准备进行爬行的爬虫个数,就是使用几个线程来爬取segment里的url.在fecher.fecth()这个方法,

for (int i = 0; i < threadCount; i++) {       // spawn threads

      new FetcherThread(getConf()).start();}

最终执行的过程是由FetcherThread这个内部类的run方法执行地。那么它如何爬取网页的呢?

       Protocol protocol = this.protocolFactory.getProtocol(url.toString());

     ProtocolOutput output = protocol.getProtocolOutput(url, datum);

     ProtocolStatus status = output.getStatus();

    Content content = output.getContent();

在RUN方法里执行爬取网页的主要代码就是上面4行。简单地说这里的url是从刚才的segment里获取的相关爬行url的信息。

第一:获得了这个URL的使用的协议。本文主要介绍http协议。(看完下面你对HTTP协议,也会有帮助地)

第二:利用这个协议,获得响应的内容。第三:内容的相关状态。第四:内容里的实质性内容获取

下面是具体地分析:我们知道NUTCH里的大部分东西是通过插件开发的。那么这里PROTOCAL只是一个接口,定义了一个普通的协议接口,具体的协议如HTTP协议是以插件包形式发布地。下面主要分析地就是HTTP协议。

类都在package org.apache.nutch.protocol.http里面。大概的流程就是HTTP类利用HTTP协议产生一个HTTPRESPONSE类,利用HttpResponse类里的Content和返回的状态码产生一个PROTALOUTPUT类。这就是我们第二步的大概流程。也是底下分析的关键。

关键代码就是上面地getProtocalOutput(url,crawlDatum)是怎么运作地。分析代码如下:     

getProtocal()方法的主体框架:

getProtocal()方法的主体框架:

URL u = new URL(urlString);

   if (checkRobots) {

        //处理是否有设置了robot.txt检查,如果有进行相应地检查包括了是否允许反问这个IP}

      long crawlDelay = robots.getCrawlDelay(this, u);//根据robot.txt设置这个爬虫的等待时间

      long delay = crawlDelay > 0 ? crawlDelay : serverDelay;//如果没有设置,则等于serverdelay

      if (checkBlocking && maxCrawlDelay >= 0 && delay > maxCrawlDelay) {

      //如果爬虫的等待时间,超过了预先设置的最大等待时间那么忽略这个URL

} . . .

      //是否设置了检查block,因为多线程爬虫时,对一个IP可能只允许一只爬虫,如果另外的爬虫也进来了,那么它就应该被block了.会被放入一个Block_List中进行等待.涉及多线程对同步变量的返问.

      if (checkBlocking) {

        //对于爬虫是否被block进行相应地处理,如果被block次数大于maxDelays那么就自动取消它的任务了,会抛出一个异常

      }

      //当爬虫不被block时,获取它的输出

      Response response;

      try {

        response = getResponse(u, datum, false); // make a request

      } finally {

        //改爬虫对该ip返回完毕,解除BLOCK,让其他的爬虫可以返问.

        if (checkBlocking) unblockAddr(host, delay);

      }

      //根据返回的状态码进行相应地处理,底下一般大家都能看懂了

      int code = response.getCode();

     . . .

      if (code == 200) { // got a good response

        return new ProtocolOutput(c); // return it

       

      } else if{

      ....

      }

2 getResponse()的程序框架:方法返回一个HttpResponse的对象.(哭!!!百度对文章长度限制,我贴代码太长了)只能做个简要分析了。这个构造方法就是利用url的信息,建立一个socket发出一个get的请求,然后通过返回的消息内容,设置关于这个url的datum里的Metadata信息,以及读取网页里的内容保存在Content里。从而返回的HttpResponse就有了关于url的网页的相关信息了。到此就完成了一个网页的抓取了。呵呵,可见了解底层的一些协议还是很关键地,比如:

1 HTTP 1.1协议里的状态码表示什么? 200:成功;300-400:表示重定向了,

400 Bad Request;401 未授权;404 未找到;410 网页不存在permanently gone;

2 了解一个HTTP请求报头,和响应的报头也是很基本的知识。

截取几个报头,学习:

      GET / HTTP/1.0

Host: www.xmu.edu.cn

Accept-Encoding: x-gzip,gzip

User-Agent: mynutch/Nutch-0.9

这个是我的nutch对厦门大学主页发起的一个请求.可以看到这是一个Get请求,HTTP1.0协议地,请求的主机名。使用的压缩方式,用户返问的agent.(如果是浏览器,那么这里可是会显示浏览器的型号),还有其他的报头,比如connection是否进行长连接,referer是否是其他连接过来地,cookie请求的cookie。

下面是一个响应的报头:

    HTTP/1.1 200 OK

    Connection:close

Date: Sun, 25 May 2008 11:12:28 GMT

Server: Microsoft-IIS/6.0

X-Powered-By: ASP.NET

Content-Length: 12006

Content-Type: text/html

Set-Cookie: ASPSESSIONIDQABRDBRR=LALGDJHAFMFCLAPDOONBLLOK; path=/

Cache-control: private

0
8
分享到:
评论

相关推荐

    apache-nutch-2.3.1-src.tar.gz

    `apache-nutch-2.3.1-src.tar.gz` 是 Apache Nutch 的源代码包,版本号为 2.3.1,以 tar.gz 格式压缩。 这个压缩包中包含的主要文件和目录结构如下: 1. **src**: 这是 Nutch 的源代码存放位置,分为多个子目录,...

    nutch-2.1源代码

    在研究和使用Nutch-2.1源代码时,你可以深入了解搜索引擎的各个组成部分,如爬虫的实现、索引过程的细节、查询处理的算法等,这对于提升自己的搜索引擎技术知识非常有帮助。同时,Nutch也是研究搜索引擎优化(SEO)...

    nutch的源代码解析

    Nutch 的源代码解析对于深入理解搜索引擎的工作原理以及自定义搜索引擎的实现非常有帮助。下面我们将详细探讨 Nutch 的注入(Injector)过程,这是整个爬取流程的第一步。 Injector 类在 Nutch 中的作用是将输入的 ...

    apache-nutch-1.7-src.tar.gz

    在“apache-nutch-1.7-src.tar.gz”这个压缩包中,你将获得Nutch 1.7的源代码,这使得开发者可以深入了解其工作原理,并对其进行定制和扩展。解压后的文件夹“apache-nutch-1.7”包含了所有必要的组件和配置文件。 ...

    apache-nutch-1.6-src.tar.gz

    这个`apache-nutch-1.6-src.tar.gz`文件包含了Nutch 1.6的源代码,允许开发者深入研究其内部机制,定制自己的爬虫需求,或者为项目贡献代码。 源代码包`apache-nutch-1.6`中通常包含以下几个关键部分: 1. **源...

    apache-nutch-1.4-bin.tar.gz

    1. **解压**:首先,你需要将"apache-nutch-1.4-bin.tar.gz"解压到本地目录,得到Nutch的运行环境。 2. **配置**:编辑conf/nutch-site.xml文件,设置如存储路径、抓取间隔、抓取范围等相关参数。 3. **创建种子**:...

    apache-nutch-1.3-src.tar.gz_nutch_nutch-1.3.tar.gz

    这个源码包 "apache-nutch-1.3-src.tar.gz" 和 "nutch-1.3.tar.gz" 包含了 Nutch 1.3 的源代码和编译后的二进制文件,对于开发者和研究者来说是非常有价值的资源。 **Nutch 概述** Nutch 是基于 Java 开发的,遵循 ...

    nutch配置nutch-default.xml

    nutch配置nutch-default.xml

    apache-nutch-1.5.1-bin.tar.gz

    Nutch是一款刚刚诞生的完整的开源搜索引擎系统,可以结合数据库进行索引,能快速...Nutch的开放源代码方便任何人去查看Nutch排序算法的工作流程。因此Nutch就可以更好的发展,为那些爱好搜索引擎的人们提供了一个平台。

    apach-nutch-1.9-bin.tar.gz

    4. **配置与部署**:解压 "apache-nutch-1.9" 文件后,需要根据你的环境配置`conf/nutch-site.xml`文件,设置包括抓取间隔、并发度、存储路径等参数。同时,可能还需要配置`conf/regex-urlfilter.txt`和`conf/...

    apache-nutch-2.3.1 源码和构建好的库文件等 (part 4)

    相对于那些商用的搜索引擎, Nutch作为开放源代码 搜索引擎将会更加透明, 从而更值得大家信赖. 现在所有主要的搜索引擎都采用私有的排序算法, 而不会解释为什么一个网页会排在一个特定的位置. 除此之外, 有的搜索...

    apache-nutch-1.6-bin.tar.gz最新版

    nutch不用安装,是个应用程序,下载后为nutch-1.6.tar.gz,双击桌面上的cygwin快捷方式;执行以下命令: $ cd D:/Downloads/Soft $ tar zxvf nutch-1.0.tar.gz 在e盘下面出现nutch-0.9文件夹说明解压成功了.然后环境...

    apache-nutch-2.3.1-src

    apache-nutch-2.3.1-src.tar ,网络爬虫的源码, 用ivy2管理, ant runtime 编译 apache-nutch-2.3.1-src.tar ,网络爬虫的源码, 用ivy2管理, ant runtime 编译

    apache-nutch-1.4-bin.tar.gz.part2

    apache-nutch-1.4-bin.tar.gz.part2

    apache-nutch-1.13-src.zip_nutch_网络爬虫

    在 `apache-nutch-1.13` 的源代码中,你可以看到以下关键组件和目录结构: - `src/java`:包含 Nutch 的核心 Java 类库,如爬虫逻辑、索引和搜索模块。 - `src/conf`:存放配置文件,如 `nutch-site.xml`,用于设置...

    apache-nutch-1.4-bin.part1

    apache-nutch-1.4-bin.part1

    nutch 1.5的源代码

    在`apache-nutch-1.5.1`这个压缩包中,你将找到源代码、构建脚本、文档、配置文件以及示例数据。通过对这些内容的阅读和实践,你可以深入了解搜索引擎的运作机制,进一步提升你的Java编程和分布式系统技能。同时,...

    nutch-1.0-dev.jar

    nutch-1.0-dev.jar nutch devlope

Global site tag (gtag.js) - Google Analytics