网络爬虫Heritrix1.14.4在MyEclipse中的安装配置与使用教程

来源:互联网 发布:js 手动触发click事件 编辑:程序博客网 时间:2024/05/29 19:55

本文主要参考:http://blog.csdn.net/yunshuixiliu/article/details/8627488 

和http://blog.csdn.net/wy_kath/article/details/9385015

非常感谢!!!记下来,以便以后查看~



一、heritrix的安装配置

   Heritrix具体下载地址如下:
   http://sourceforge.net/projects/archive-crawler/files/archive-crawler%20%28heritrix%201.x%29/

   本实例所用的为Heritrix1.14.4的源代码版本,即你只需下载一个文件即可:heritrix-1.14.4-src.zip。 之所以采用源代码版本,是因为本实例中,需要对Heritrix 进行一些扩展,以适应本实例的需求。网上教程多是下载两个文件heritrix-1.14.4.zip和heritrix-1.14.4-src.zip,即费时,又大多无效,按照网上流传配置办法很难成功。这里我已在MyEclipse里顺利配置完成并抓取到所需网页,下面开始配置流程:


   1、将heritrix-1.14.4-src.zip的压缩包解压,目录中的lib和src是本实例需要的两个文件夹。 “lib”文件夹下存放的是Heritrix 运行时候所需要的第三方类库,“src”文件夹下就是Heritrix 的源代码。

   2、在Eclipse 中打开菜单:File/new/Java Project,并在“Project name”中输入“Heritrix”,这样就新建了一个项目名称叫做Heritrix ,同时将源代码文件夹下的lib文件夹拖放置新建好的项目工程Heritrix 下。在Elipse里的项目工程内,找到刚刚拖进去的lib文件夹,把里面所有的.jar文件选中,右键Build Path→ Add to...,这样便完成了运行库的添加任务。


   3、将位于Heritrix 源代码文件夹下的src\ Java \ 的org和st两个文件夹直接拖进Heritrixj工程的src下。如果当添加完后报错,只是因为你的太低版本的Eclipse默认的编译版本为1.4,所以要改成1.5或者1.6版本。单击菜单中的Window ,选择Preferences之后,展开左边的Java选项,单击其中的“Compiler”,将Compiler compliancelevel改成J2EE1.6或1.5。      


   4、将位于解压后文件夹下的src \ conf\下的所有文件和文件夹拖至Heritrix 工程的src内,在src 内找到heritrix .properties并打开。 该文件是Heritrix  的配置文件,在“heritrix .cmdline.admin= ”后边添加用户和密码,格式如:“admin:admin”,在登录Heritrix 的管理界面时需要此用户名和密码。 在配置文件中还能够指定Heritrix 管理界面的访问端口,建议可为8080端口。

   错误1:Access restriction: The type FileURLConnection is not accessible due to restriction on required library C:\Program Files\Java\jdk1.6.0_20\jre\lib\rt.jar,如图 1 所示。
解决方案:这是 JRE 的访问限制导致报错,在 MyHeritrix 工程上右键单击选择“Build PathConfigure Build Path …”,然后选择 Library 选项卡,将“JRE System Library”删除然后重新导入一下即可修复。或者选择“WindowsPreferencesJavaCompilerErrors/Warnings”找到“Deprecated and restricted API”下的“Forbidden reference (access rules)”,将默认设置“Error”改为“Warning”或“Ignore”

   错误2:这个时候会报错NullPointerException 的错误:这个错误的原因是缺少了“tlds-alpha-by-domain.txt”文件,在 heritrix-1.14.4-src\src\resources\org\archive\util 下可以找到该文件,将其拷贝到org.archive.util包(MyHeritrix\src\org\archive\util) 中即可。
图2. NullPointerException 错误


   5、将Heritrix 源代码文件夹下的src下的其他文件夹,即除conf 和Java两个文件夹以外的所有文件夹,拖至Heritrix 项目工程下, 

  

   6、至此,Heritrix 已经可以运行起来了。 运行Heritrix ,选择执行org.archive.crawler包下的heritrix.java文件,以Java application方式运行。然后Heritrix 会在控制台输出一段信息,最后是版本号,这就表示Heritrix 已经运行成功了。


   7、启动浏览器并在浏览器的地址栏中输入http://localhost:8080 便可看到Heritrix 的登录界面。用户名和密码处分别输入在配置文件中,输入的admin和admin,单击“Login”按钮后便能看到Heritrix 的控制台界面。

到此,Heritrix安装与配置完成。最好的参考教程:http://www.ibm.com/developerworks/cn/opensource/os-cn-heritrix/index.html?ca=drs-#major2 (很好的错误解决转载  : http://hi.baidu.com/liuqiyuan/item/9127c1103a3a8a001894ecdf

   

   错误 3:错误具体:
12:32:54.530 EVENT  Starting Jetty/4.2.23
12:32:54.563 WARN!! Delete existing temp dir C:\Users\asus\AppData\Local\Temp\Jetty_127_0_0_1_8080__ for WebApplicationContext[/,jar:file:/F:/workspacetwo/Heritrixfive/webapps/admin.war!/]
12:32:54.566 WARN!! Failed to delete temp dir C:\Users\asus\AppData\Local\Temp\Jetty_127_0_0_1_8080__
12:32:54.585 WARN!! Can't reuse C:\Users\asus\AppData\Local\Temp\Jetty_127_0_0_1_8080__, using C:\Users\asus\AppData\Local\Temp\Jetty_127_0_0_1_8080___1930706384182235396
12:32:54.638 EVENT  Started WebApplicationContext[/,Heritrix Console]
12:32:54.690 WARN!! Failed to start: SocketListener@127.0.0.1:8080
Exception in thread "main" org.mortbay.util.MultiException[java.net.BindException: Address already in use: JVM_Bind]
at org.mortbay.http.HttpServer.start(HttpServer.java:640)
at org.archive.crawler.SimpleHttpServer.startServer(SimpleHttpServer.java:279)
at org.archive.crawler.Heritrix.startEmbeddedWebserver(Heritrix.java:1236)
at org.archive.crawler.Heritrix.doCmdLineArgs(Heritrix.java:715)
at org.archive.crawler.Heritrix.main(Heritrix.java:556)
Heritrix version: 1.14.4
12:32:54.692 EVENT  Stopped WebApplicationContext[/,Heritrix Console]
12:32:54.693 EVENT  Stopped org.mortbay.http.NCSARequestLog@618d26
12:32:54.693 EVENT  Stopped org.mortbay.jetty.Server@ae506e





它的意思是端口占用了,重新启动下myeclipse就行了





二  、heritrix的使用教程

学习研究heritrix已经有了一段时间了,想写一些博文,一来是方便以后自己查阅,二来和广大博友们分享交流,提高认识。

    本系列文章所用环境:heritrix1.14.4 + myeclipse10

    heritrix1.14.4源码包下载:http://download.csdn.net/detail/kath_y/5788787     

   一、在myeclipse中安装配置heritrix                  

    1、新建空的java项目(注意不是WEB项目),命名为Heritrix;

    2、把heritrix-1.14.4-src\src\java\目录下的org、st和com文件夹拷贝到Heritrix/src目录下;

    3、把heritrix-1.14.4\src下的wbapps文件夹拷贝到heritrix目录下;

    4、右击heritrix项目,点击properties ,通过JavaBuildPath,将heritrix-1.14.4-src下的lib目录下的所有包导入进来;(此时工程目录下会自动生成一个Referenced Libraries)

    5、解压缩heritrix-1.14.4目录下的heritrix-1.14.4.jar文件,把解压后的所有文件和文件夹(除org、st、com文件夹和heritrix.properties文件外)拷贝到heritrix目录下;

    6、将heritrix-1.14.4目录下的conf文件夹拷贝到heritrix目录下;并将heritrix目录下的profiles、modules、selftest文件夹移入conf文件夹中;

    7、打开eclipse下的heritrix/conf/heritrix.properties文件,找到"heritrix.cmdline.admin=",修改为“heritrix.cmdline.admin = admin:admin”;(admin:admin对应登录时的用户名:密码,可以根据自己喜好修改)

    8、Conf/jmxremote.password.template拷贝到heritrix目录下。改名为:jmxremote.password,最后再行改成:

                        monitorRole  admin

                        controlRole   admin

    9、找到org.archive.crawler包,运行Heritrix.java中的main函数。

     可能会出现的异常:

       1、在Heritrix.java中出现File URLConnection 红叉

       解决办法:依次点击Window->java->Compiler->Errors/Warnings,将Forbidden reference(access rules)的选项从Error改为Warning,点击Apply,点击OK。

       2、出现的异常......thread-10org.archive.util.ArchiveUtils.<linit>( )TLD list....

         解决办法:将\heritrix-1.14.4-src\heritrix-1.14.4\src\resources\org\archive\util 下的文本文档拷贝到heritrix中的src\org\archive\util下;

       最终运行Heritrix.java的正确结果如下:

       

    二、登录并创建一个简单的JOB

   1、打开浏览器,输入http://localhost:8080,进入heritrix的登录页面

       

    2、点击Login按钮后进入heritrix的控制台界面

        

      ①左边红色方框里介绍的是当前heritrix的一些信息。

      ②右边蓝色框内显示了当前Java虚拟机的一些状态,如上图所示,可以看到当前的堆大小为4184KB,而已经被使用了3806KB,另外,最大的堆内容可以达到65088KB,也就是在64M左右。在正式抓取的时候,64M的最大内存是不够用的,一般至少设置为512M。设置过程如下:右键点击Heritrix->Run As->Run Configurations,进入该页面,选择Arguments项,在VM arguments:框下输入:-Xmx512m,点击Apply。

        

       重新启动heritrix,登录后可以看到最大内存已经改到了520256 KB,即512M。

                      

   3、创建一个Job

   1)点击控制台页面的Jobs按钮,进入如下界面

            

     在创建页面有四种创建方式,含义如下:

     ①Based on existing job:以一个已经有的抓取任务为模板,创建所有抓取属性和抓取起始URL的列表。

     ②Based on a recovery:在以前的某个任务中,可能设置过一些状态点,新的任务将从这个设置的状态点开始。

     ③Based on a profile:专门为不同的任务设置了一些模板,新建的任务将按照模板来生成。

     ③With defaults:这个最简单,表示按默认的配置来生成一个任务。

   (2)、点击选择最简单的With Defaults方式,创建一个新的任务

    在Heritrix中,一个任务对应一个描述文件。这个描述文件的默认的名称为order.xml。每次创建一个新任务时,都相当于生成了一个order.xml的文件。文件中详细记录了Heritrix在运行时需要的所有信息。例如,它包括该用户所选择的Processor类、Frontier类、Fetcher类、抓取时线程的最大数量、连接超时的最大等待时间等信息。上面所说的4种创建抓取任务的方式,其实都是在生成一个order.xml文件。其中,第4种With defaults,则是直接拷贝默认的order.xml文件。在所创建的Eclipse工程或是命令行启动的Heritrix下载包中,该默认的order.xml文件均是放于profiles\default目录下的。

       关于order.xml的细节,在此还不必深究。接下的学习中会做介绍。

 

         

    在新建任务的名称上,填入“sina_blog”,表示该抓取任务将抓取新浪博客的信息。在Description中随意填入字符,然后再在seeds框中,填入新浪博客首页地址。

    这里需要解释一下seeds的含义。所谓seeds,其实指的是抓取任务的起始点。每次的抓取,总是需要从一个起始点开始,在得到这个起始点网页上的信息后,分析出新的地址加入抓取队列中,然后循环抓取,重复这样的过程,直到所有链接都分析完毕。在新建任务的过程是可以填多个Seeds作为起点的,以上只作为一个示例,所以只填了新浪博客的首页地址

   (3)、设置抓取时的处理链

    在上图的下边有一排按钮:Modules   Submodulers   Settings   Overrides   Submit job,点击Modules按钮,进入处理链设置页面。

        

    此时页面并没有做配置的Add/Change按钮及相应的下拉菜单,我们需要在myeclipse中将modules的上一级目录放到项目的classpath中,过程如下:

    右键Heritrix->Run As->Run configuratins.....->classpath->user Entries->Advanced->Add External Folder,找到modules的上一级目录conf加入即可。

    重新启动Heritrix项目,登录并和之前一样创建job,到Modules页面可以看到,页面如下:

       

         此时,页面中出现了Add/Change的配置按钮。

         

     从上而下,可以看到,需要配置的内容共有7项,其中CrawlScope和Frontier是两个最重要的组件。

        ①CrawlScope用于配置当前应该在什么范围内抓取网页链接。比如,如果选择BroadScope,则表示当前抓取的范围不受限制,但如果选择了HostScope,则表示抓取的范围在当前的Host内。我们选择BroadScope。

         

        ②Frontier则是一个URL的处理器,它将决定下一个被处理的URL是什么。同时,它还会将经由处理器链所解析出来的URL加入到等待处理的队列中去。我们使用BdbFrontier类来做为处理器(其实Heritrix也只有这一个可用的Frontier),全权掌管URL的分配。

          

       除了以上两个组件外,还有5个队列要配。这五个队列根据先后的顺序,就依次组成了Heritrix的整个处理器链。5个队列的含义分别如下:

      Ⅰ、PreProcessor:这个队列中,所有的处理器都是用来对抓取时的一些先决条件做判断的。比如判断robot.txt的信息等,它是整个处理器链的入口。

        

       Ⅱ、Fetcher:从名称上看,它用于解析网络传输协议,比如解析DNS、HTTP或FTP等。这里我们主要使用FetchDNS和FetchHTTP两个类。

         

       Ⅲ、Extractor:它的名字就很好的揭示了它的作用。它主要用是于解析当前获取到的服务器返回内容,这些内容通常是以字符串形式缓存的。在这个队列中,包括了一系列的工具,如解析HTML、CSS等。在解析完毕,取出页面中的URL后,将它们放入队列中,等待下次继续抓取。在演示中,使用两种Extractor,即ExtractorHTTP和ExtractorHTML。

         

       Ⅳ、Writer:主要是用于将所抓取到的信息写入磁盘。通常写入磁盘时有两种形式,一种是采用压缩的方式写入,在这里被称为Arc方式,另一种则采用镜象方式写入。当然处理起来,镜象方式要更为容易一些,因此,我们命名用镜象Mirror方式。

       

      Ⅴ 、PostProcessor:在整个抓取解析过程结束后,进行一些扫尾的工作,比如将前面Extractor解析出来的URL有条件的加入到待处理队列中去。   

              

     

      值得一提的是,在处理器链的设置过程中,每一个队列中的处理器都是要分先后顺序的,信息的处理流程实际上是不可逆的,因此,在设置时,可以看见在队列的右侧总是有“Up”、“Down”和“Remove”这样的操作,以帮助能够正确的设置其顺序。

      在设置完Hertrix所需的处理链后,仍然还不能够马上开始抓取任务,还需对默认的运行时参数做一些修改,以适应真正的需要。

    (4)、设置运行时的参数

       在设置完处理链后,在页面顶部或底部都可以找到如下图所示的菜单项,单击“Settings”链接,就进入了属性设置的页面。

        

      如下图在属性设置页面上有非常多的输入域,Heritrix在抓取网页时,这些域是用来对的各个组件的值进行预设。

         

      由于页面上的内容非常多,使用者可能无法全部了解它们的作用。所以Heritrix提供了一个辅助功能,来在最大程度上让使用者了解每个参数的含义。

          

            

      可以看到,在每个属性的右侧都有一个小问号,当单击问号时,就会弹出一个Javascript的Alert提示框,上面介绍了当前属性的作用。例如,在上图中单击“max-toe-threads”属性,通过Alert的提示可以知道,它表示的是同时处理URIS的线程的最大数目。默认是100,我们设置为50。

     当在第一次使用Heritrix时,所需要设置的参数并不多,以默认设置为主。以下就来介绍一些必须要在第一次使用时就要配置好的参数。

      ①max-toes-threads

      该参数的含义很容易了解,它表示Heritrix在运行该抓取任务时,为任务分配多少个线程进行同步抓取。该参数的默认值为100,而事实上根据笔者的经验,在机器配置和网络均很好的情况下,设置50个线程数就已经足够使用了。

      ② HTTP-Header

       在HTTP-Header这个属性域下面,包括两个属性值“user-agent”和“from”。默认情况下,这两个属性的值如下图

        

      很明显,这样的值是无法完成真实的HTTP协议的模拟的,所以,必须要将值改掉。可以参照下图:

           

      其实只需要最后的URL和联系邮箱格式正确就可以了,可以随便设置。

    (5)、完成Job的创建

      在完成上述的设置之后,任务就创建成成功了,点击下图"Submit job"按钮提交任务。

       

       提交任务后,会跳转到如下页面,表示任务创建成功。

       

       从图中看到,有一个Pending Jobs,也就是我们之前创建的任务sina_blog。接下来,我们就去启动我们的任务,开始抓取网页。

       

      三、启动Job,抓取网页

      1、点击“Console”按钮回到Console界面,可以看到刚刚创建的任务已经启动了,等待我们开始它

       

      点击"Start"按钮,“Pending”状态的抓取任务激活,开始抓取网页。

      2、分析抓取页面的一些信息。

      当我们点击"Start"开始抓取网页后,控制台界面如下:

       

      界面中Rates框中显示的是抓取的速度。Mermory框中反应的是java虚拟机的内存状态。Load框中显示的是抓取的线程数以及队列的负载以及一些其他信息。Totals框中则是已经处理的链接数和总共分析出的链接数的比值,但这个值往往不是准确的,因为当页面在不断被抓取分析时,链接的数量也会不断的增加,因此,这个百分比的数字也在不断的变化。如图所示:此时总共抓取到的链接数已经达到了78560个,处理了2712个,它的百分比数量为3%。

      到这里,已经把Heritrix成功的运行起来,并且抓取了一定的内容。接下来,看一下heritrix是如何存储抓取下来的内容的。

  

     四、Heritrix的镜像存储结构

    由于在前面设置了Writer的类型为MirrorWriter。因此,磁盘上应该留有了所抓取到的网页的各种镜象。那么,究竟Heritrix是如何存储下镜象信息的呢?打开Eclipse的workspace目录,进入heritrixProject的工程,里面有一个jobs目录。进入后,找到以刚才job的名称打头的文件夹,这里面的内容,就是Heritrix在运行时实时生成的。其中,有一个mirror目录,进入后,如下图所示:

     

     其实所谓镜象方式存储,就是将URL地址按“/”进行切分,进而按切分出来的层次存储,比如一个URL地址为:http://blog.sina.com.cn/index.html

那么它在mirror目录中的保存位置就该是blog.sina.com.cn目录下的index.html文件。

         

     五、停止抓取任务

     当用户进行某个抓取任务时,有两种方法会让任务停止下来。

     1.正常终止

     第一种方法当然就是任务的自然结束,其条件为所有队列中的URI都已经被处理过了。此时,任务将自然终止。在“Jobs”面版上会看到任务已经完成,被加入到“Completed jobs”列表中。

     2.强行终止

     当然,任务不可能总是运行完,这可能是因为对任务的控制不够,结果抓取了太多不相关的信息,进而造成URL队列无限制膨胀,无法终止。在这种情况下,就需要强行将任务终止。在Console面版上有如下图所示的一排链接,最后一个“Terminate”链接,就是用来终止当前运行的任务。

                                             

      单击“Terminate”链接后,当前在运行的抓取任务就会立即终止,并同样将任务放置到“Jobs”面版上的“Completed jobs”列表中,只不过在“status”上,它会显示“Finished - Ended by operator”这样的提示。

      当然,如果用户希望关闭Heritrix,并终止所有正在运行的任务,也可以单击Console面版上的“Shutdown Heritrix software”的链接,此时,Heritrix会弹出一个警告,告诉你如果关闭Heritrix,则当前一切正在运行的任务都将被终止。如下图所示。

                                                       

      如果选择“I’m sure, shut it down”,则Heritrix的WebUI将会终止,虚拟机进程结束。

     

      六、接下来的目标

        关于heritrix的配置及初次使用,就写到这里了,接下来将进行heritrix的部分源码分析及扩展,改造成自己想要的爬虫。欢迎各位博友们拍砖交流,指点接下来的研究线路!

       



0 0