爬虫程序开发指南(java)

来源:互联网 发布:java获取12时间戳 编辑:程序博客网 时间:2024/06/04 00:24

sosoo spider开发指南                                           Sosoo 1.0网络爬虫程序

---用户开发手册

编写人:王建华(rimen/jerry)

编写目的:基于sosoo定 制web spider程序的编程人员。

                             目录

       

 

一: 安装sosoo. 2

二:功能定制... 2

1.基本功能参数的设置。... 2

2.配置机器人对 url的检查... 3

3:实现文件管理。... 4

4.定制html文档下载规则。... 4

5.设 置对下载后http文档的过滤处理... 5

6.启用机器人运行期监控。... 5

7.启用对http协议分析的监 控。... 5

三:sosoo描述... 6

四:应用开发指南... 6

1.Roboter 类,spider程序的主类。... 6

2.TaskList接口,解决对处理任务的存储。... 7

3.Http客户 端实现。... 7

4.实现网页存储或处理... 7

5.实现运行期的监控... 8

五.程序例 子... 9

六.参考依赖... 10

       

 

 

 

 

 

 

 

 

 

 

一: 安装sosoo
sosoo提供的是一个sosoo-core.jar包,其中并没有提供可运行的程序入口。如果要使用可以通过test中的 examples进行体验。开发者可以基于在这上开发出基于UI,j2ee等spider程序

       把sosoo-core包加 入到你应用的classpath中。

       Sosoo 提供一个基于多线程的来代表一个机器人com.sosoo.robot.spider. Roboter。

       通过一个测试类

      public static void main(String[] args) 

    throws Exception

      {

    Roboter robby = new Roboter();

robby.setStartURL(new URL("http://10.25.101.173:7001/pa18Web/framework/images/framevork_04.gif"));

    robby.setMaxDepth(0);                //设置最大连接访问深度

    robby.setSleepTime(0);

robby.setWalkToOtherHosts(true);

robby.run();                               //启动

}

       这样就启动了一个spider程序,sosoo将根据你对javaBean参数的设置进行 对网络上html

的抓取.

       停止机器人.

robot.stopRobot();  

二: 功能定制
Sosoo利用回调的方式实现了aop,用户可以通过进行功能Bean的实现加入程序在处理http连接时的动作。

1. 基本功能参数的设置。
就像上面例子上提到的roboter的原生类型参数(或String),例如:startURL,maxDepth等。

 

设 置开始处理的url【startURL】:必须参数,roboter会根据这个地址开始在网络上进行查找。

robby.setStartURL(URL url);

 

设 置从开始路径能找的最大深度【maxDepth】:程序会判断当前处理的连接深度是否超过最大连接深度,如果超过这个连接将忽略,当然你可以通过设置 depthIsEffect来屏蔽这个功能。默认值为1。

robby.setMaxDepth(0);

 

设 置处理文档的时间间隔【sleepTime】:当处理完一个url时,设置这个间隔时间处理下一个url。单位为s,默认值为60,推荐使用5s。

robby.setSleepTime(0);

                     

          设 置http连接超时时间:在连接服务器时,可能由于网络或者本身服务的原因,可

能会出现超时的情况,通过设置超时时间来限制对某个url 连接的最大时间,这样就可以达到提供处理的速度,但是如果这个值设置太小,可能很多连接都回连接不到,建议使用大于30的值,默认为60s。

robby.setUrlConnectTimeOut(30);

 

停 止robby线程【stopIt】:你可以通过对robby对象进行操作来停止当前的线程。
robby.stopRobot();

 

暂 停robby线程【sleep】:可以对当前运行的robby线程进行暂停。

robby.setSleep(true);

2. 配置机器人对url的检查
              sosoo spider会根据用户的设置对在收集url过程中过滤掉不符合条件的 url。

              过滤的顺序:walkToOtherHosts—allowWholeHost—flexibleHostCheck—

allowWholeDomain—用户提供url列表。

 

设置 是否访问其他的主机【walkToOtherHosts】:如果你需要进行整个互联网的搜索,而不现有你开始提供的url中的主机,把这个参数设置为true。默认为false。

 

robby.setWalkToOtherHosts(true);

 

 

设 置是否访问本主机【allowWholeHost】:如果你只想要对开始url代表的主机进行访问,你可以通过设置这个参数进行过滤url。

robby.setAllowWholeHost(true);

 

设 置非www开始的主机【flexibleHostCheck】:当你提供的开始url,不是以www开头,你可以通过设置 flexibleHostCheck参数来达到访问本主机的目的。

robby.setFlexibleHostCheck(true);

 

设 置是否访问本域【allowWholeDomain】:如果你只想要对开始url代表的域进行访问,你可以通过设置下面这个参数进行过滤url。

robby.setAllowWholeDomain(true);

 

设 置要访问的url列表【allowedURLs】:这是一个Vector类型的变量,用户可以把这些url放在配置文件中,用户可以在运行时提供这个变 量。

robby.setAllowedURLs(allowed);

 

 

定制url检 查规则【URLCheck】:用户除了通过上面的规则进行url过滤,用户还可以通过实现urlCheck接口来进行url检测。系统已经提供了 RegExpURLCheck实现。支持对properties文件的支持。

robby.setURLCheck(check);

 

设 置是否要找网站跟目录下的/robot.txt文件【ignoreRobotsTxt】:用户可以通过设置这个值来忽略网站提供对robot的支持。默认 为false

robby.setIgnoreRobotsTxt(true);

 

设置url可以重复访 问【visitMany】:系统提供了一个访问过的列表缓存,当spider程序发现这个url已经访问过,他将不进行这个url的处理。可以通过这个参 数来定制可以重复访问的url列表,这是一个Vector类型。

robby.setVisitMany(visitMany);

 

设 置spider客户端的【proxy】:spider可以通过代理连接internate,但是目前只支持匿名的代理服务器。

robby.setProxy("10.16.111.5:80");

3: 实现文件管理。
Spider程序下载url对应的html文档的时候,系统提供一个回调接口HttpDocManager。你可以通过的持接口的 实现,把spider获得html数据进行存储,例如你可以把这些文件以文本流存入数据,存入文件系统等。系统提供了HttpDocToFile实现,把 下载的文件存入文件系统。你可以在启动spider程序的时候通过robby.setDocManager(dm);进行注入管理对象。

4. 定制html文档下载规则。
              当你对各种html文件的格式处理有要求的时候,例如你觉得下载exe,rar文件比较

              慢 的时候,你可以通过自己的需求定制下载规则。通过实现HttpDownloadCheck

接口可以设定下载的规则。

DownloadRuleSet rules=new DownloadRuleSet("downrules.properties");

robby.setDownloadRuleSet(rules);

 

系 统已经提供了DownloadRuleSet实现,这个是想通过classpath properties来定义下载规则.

文件的内容:

# the file must contain tow field,allow[deny] and MIME Type/sub type

# allow stand for if the doc match the conditions,will down the file

# deny stand for if the doc match the conditions,will not down the file

# < size ,express the doc content byte size is small than the value

# > size ,express the doc contect byte size is much than the value

# can't hold out the >= or <=

# the scope of size is optional.

allow image/gif  <100000 >10000000

deny image/gif  <100000 >10000000

当 然你可以自定义自己的实现,只要实现HttpDownloadCheck的boolean 

downloadAllowed(Vector httpHeaders) ; 方法。

注意:如果这个文档没有下载,这个文档中的连接将不能进行处理,所以一般不建议

过滤掉text/html.

 

5. 设置对下载后http文档的过滤处理
       下载文档后,用户可以对这个doc对象进行一系列的处理。Spider提供了一个

FilterChain 类。用户可以把自己过滤器加入FilterChain中。

你可以实现DocumentFilter接口定制自己的功能,系统实现提供了一 个LinkLocalizer实现,用户替换相对连接。

    FilterChain filters=new FilterChain();

    DocumentFilter filter=new LinkLocalizer();

    filters.add(filter);

    robby.setFilters(filters);  

6. 启用机器人运行期监控。
当启动spider程序后,程序利用回调接口提供给用户运行期的状态。例如你要要显示机器人对应的处理过的任务,处理中的 任务,处理是的状态。通过实现RobotCallback接口来实现,当然你也可以直接取roboter对象的属性来监控。

系统提供RobotMonitor实现,用户打印在cosole上运行期的状态。

 

RobotCallback monitor=new Monitor();

robby.setWebRobotCallback(monitor);

 

7. 启用对http协议分析的监控。
              Spdier循环处理缓存中未处理的url,对于每个url的处理,系统提供一些监 控方

法。当然你只要实现HttpToolCallback接口。系统提供了SystemOutHttpToolCallback实现。

HttpToolCallback toolMonitor=new SystemOutHttpToolCallback();

robby.setHttpToolCallback(toolMonitor);

三:sosoo 描述
       sosoo实际于jobo提供的核心算法。利用对访问的历史记录存储来替换spider的递给算

法。在处理的 效率上有不错的体验,但是它也是牺牲存储为代价的。在程序启动是,系

统将建立两个Vector数组对访问url进行记录。因此sosoo 并不使用于大数据量信息抓取,但是对于行业网站,中小企业绝对足够。

 

目前sosoo提供对的处理功能:

支 持跨域跨主机的访问

支持多种文件格式的下载

支持对html中连接的递规处理

支持http1.1协议但不 支持1.0

支持匿名代理(http),但不知道需要验证代理。

 

待扩展的功能:

提供全 功能http协议处理

提供javasript的支持

提供表单from的处理支持

提供对ftp协议的支持

提 供全方位的代理(http,sock等)。

完善系统监控功能

加强对html文档的信息处理能力

提供各种 文件类型的处理工具

 

四:应用开发指南
       sosoo提供很强的编程扩展,很容易把他集成到你的j2ee项目中。在中小型搜索引擎中,

特别对某一些特定的行业网站的数据进行分析时,Sosoo提供方便和安全的解决方案。

通 过上述对功能的定制,我们可以看到在应用中我们对sosoo的别称接口并不多,而且目前系统都是基于set的方式注入aop注入对象,这样很容易和 spring等基于set方式的依赖注入框架集成。

1.Roboter类,spider程序的主类。
当你需要把sosoo应用到 你的应用中事,roboter提供一个基于线程的工具类。它体可在程序中启动,暂停,退出一个spdier程序。这个类有sosoo提供,并不支持扩展, 它标识spider的主体。它是整个spider程序所有功能的入口,包括回调功能,都是通过set方式注入到roboter中。

com.sosoo.robot.spider.Roboter

例 如你要启动一个spider线程:

 

    Roboter robby = new Roboter();

robby.setStartURL(new URL("http://10.25.101.173:7001/pa18Web/framework/images/framevork_04.gif"));

    robby.setMaxDepth(0);                //设置最大连接访问深度

    robby.setSleepTime(0);

robby.setWalkToOtherHosts(true);

robby.run();                               //启动

2.TaskList接口,解决对处理任务的存储。
对于sosoo而言,每个url对于一个任务。系统已经提供其默认的实 现,你可以根据自己的需求实现这个接口。然后在启动spdier的时候用register方法进行注册。

        robby .registerVisitedList(new HashedMemoryTaskList(false));

        robby .registerToDoList(new HashedMemoryTaskList());

              com.sosoo.robot.spider.TaskList

       主 要解决是对com.sosoo.robot.spider.RobotTask对象的存储。和常用的操作方

法,例如删除,

添 加,查找等。具体参见@JAVADOC

3.Http客户端实现。
目前对sosoo1.0客户端而言,主要的用途就是提供模拟浏览 器进行对http文档的获取。同时把他转换为HttpDoc对象。同时对http请求资源的管理,例如cookie管理。

Sosoo主要 是通过com.sosoo.robot.http.HttpTool工具类来提供此工能。你也可以自己定制更优化的处理方案替换,同样通过register方法进行注册。由于重载这个工具需要对http协议有深刻的连接,一般不建议替换系统的实现。

Robby.RegisterHttpParser(new HttpTool);

4. 实现网页存储或处理
当spider程序下载完以后,spider会用docManager管理其和filter来处理html文档和其内容。

HttpDocManager 接口主要用来对HttpDoc对象的管理,例如把它存储在文件系统,或存入数据库等。系统提供了实现HttpDocToFile用来把HttpDoc对象 存放在在文件系统中。

FilterChain主要用来进行httpDoc内容的一系列过滤功能。例如你主要取其中的某些信息。或者替换其 中某些内容。它是实现了一个数组存储,你可以根据自己的需求加入多个实现DocumentFilter接口的对象,系统提供了一个实现LinkLocalizer,用来替换其中的相对连接。

 

系统先进行filter处理,然后在进行HttpDocManager

 

具体编程参考@javadoc

 

5.实现运行期的监控
Sosoo 提供了两个监控的接口。用户可以实现这写接口的某些或全部方法,达到载

运行期内某些状态的监控。

Spider监 控:com.sosoo.robot.spider.RobotCallback

主要提供文档的处理,spider的睡眠,spider 当前任务的监控。

  void webRobotRetrievedDoc(String url, int size);

    // 实现对获取url对应的HttpDoc对象的监控

  void webRobotUpdateQueueStatus(int length);

    // 实现当前处理任务的监控

  void webRobotDone();

    //处理完成

  void webRobotSleeping(boolean sleeping);

    //spider 暂停

http分析监控:com.sosoo.robot.http.HttpToolCallback

/** 

   * After initiating a download, this method will be called to

   * inform about the URL that will be retrieved

   *  @param URL url that will be retrieved now

   */

  void setHttpToolDocUrl(String url);

  

  /** 

   * After HttpTool got a Content-Length header

   * this method will be called to inform about the size of

   * the document to retrieve

   * @param size document size in 

   */

  void setHttpToolDocSize(int size);

  

 

  /** 

   * after a block of bytes was read (default after every 1024 bytes,

   * this method will be called 

   * @param size the number of bytes that where retrieved 

   */

  void setHttpToolDocCurrentSize(int size);

 

  /** 

   * informs about the current status of the HttpTool 

   * @param status an integer describing the current status

   * constants defined in HttpTool

   * @see HttpTool

   */

  void setHttpToolStatus(int status);

系 统提供了SystemOutHttpToolCallback默认实现。

五.程序例子
package com.sosoo.robot.examples;

 

/*********************************************

    Copyright (c) 2005 by rimen sosoo

*********************************************/

 

import java.net.URL;

 

import com.sosoo.robot.http.DownloadRuleSet;

import com.sosoo.robot.http.HttpDocManager;

import com.sosoo.robot.http.HttpDocToBean;

import com.sosoo.robot.http.HttpToolCallback;

import com.sosoo.robot.http.SystemOutHttpToolCallback;

import com.sosoo.robot.spider.RobotCallback;

import com.sosoo.robot.spider.RobotMonitor;

import com.sosoo.robot.spider.Roboter;

import com.sosoo.robot.spider.docfilter.DocumentFilter;

import com.sosoo.robot.spider.docfilter.FilterChain;

import com.sosoo.robot.spider.docfilter.LinkLocalizer;

 

/**

 * This example program downloads a web page. It does not

 * store the documents but only logs the visited URLs.

 *

 * @author jerry[wangjianhua] sosoo 

 * @version $Revision: 1.1 $

 */

public class SpiderMain {

 

  public static void main(String[] args) 

    throws Exception

  {

    System.out.println("URLs will be logged to urls.txt\n\n");

 

    Roboter robby =new Roboter();

    System.out.println(robby);

    robby.setStartURL(new URL("http://www.sina.com.cn/"));

    robby.setMaxDepth(0);

    robby.setDepthIsEffect(true);

    robby.setSleepTime(0);

    robby.setIgnoreRobotsTxt(true);   

    robby.setWalkToOtherHosts(true);

    

 

    

    FilterChain filters=new FilterChain();

    DocumentFilter filter=new LinkLocalizer();

    filters.add(filter);

    //html 流过滤器

    

    DownloadRuleSet rules=new DownloadRuleSet("downrules.properties");

    HttpDocManager dm = new HttpDocToBean();

    // 进行文档管理,可以存放在数据库也可以存放在本地。

    

    RobotCallback monitor=new RobotMonitor();

    HttpToolCallback toolMonitor=new SystemOutHttpToolCallback();

    

    robby.setDocManager(dm);    

    robby.setDownloadRuleSet(rules);

    robby.setFilters(filters);

    robby.setWebRobotCallback(monitor);

    robby.setHttpToolCallback(toolMonitor);

   

    robby.run();    // 启动

 

  }

}

  

六.参考依赖
       Jobo spider 实现

       Tidy html解析器

       Log4j日志记录器

       Apach 提 供的正值表达式操作器

0 0
原创粉丝点击