泰然处之,网络爬虫程序实例

原创 2007年10月16日 10:21:00

最近跟朋友开始研究搜索引擎的实现,下面是朋友参照jobo改的一个给予java的spider

ps:里面的英文可以略过了,这家伙英语水平实在是烂= =

      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包,其中并没有提供可运行的程序入口。如果要使用可以通过src中的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,用户可以通过回调的方式注入javaBean对象,以实现其外部功能
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 two 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 smaller than the value
# > size ,express the doc contact byte size is larger 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文档的信息处理能力
提供各种文件类型的处理工具
提供对rss的支持

四:应用开发指南
 sosoo提供很强的编程扩展,很容易把他集成到你的j2ee项目中。在中小型搜索引擎中,
特别对某一些特定的行业网站的数据进行分析时,Sosoo提供方便和安全的解决方案。
通过上述对功能的定制,我们可以看到在应用中我们对sosoo的编程接口并不多,而且目前系统都是基于set的方式注入aop注入对象,这样很容易和spring等基于set方式的依赖注入(IOC)框架集成。
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 提供的正值表达式操作器

    王建华Mail:  yityt@hotmail.com 
    王建华Blog:  http://jerry_blog.blogcn.com

 

一个简单网络爬虫示例

在学生时期,可能听到网络爬虫这个词会觉得很高大上,但是它的简单实现可能学生都不难懂。 网络爬虫应用,就是把整个互联网真的就当做一张网,像蜘蛛网那样,应用就像一个虫子,在网上面按照一定的规则爬动。 现在...
  • wenhuayuzhihui
  • wenhuayuzhihui
  • 2016年02月04日 11:17
  • 10581

网络爬虫实例教学

网络爬虫实例教学 目录 网络爬虫框架 网络爬虫的逻辑顺序 网络爬虫实例教学 modelmainutilparsedb再看main方法 爬虫效果展示 ...
  • u014344668
  • u014344668
  • 2017年02月10日 17:33
  • 430

网络爬虫讲解(附java实现的实例)

网络蜘蛛即Web Spider,是一个很形象的名字。把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。网络蜘蛛是通过网页的链接地址来寻找网页,从 网站某一个页面(通常是首页)开始,读...
  • zhushuai1221
  • zhushuai1221
  • 2016年07月26日 21:17
  • 804

Python]网络爬虫

[Python]网络爬虫(一):抓取网页的含义和URL基本构成 分类: 爬虫 Python2013-05-13 22:30 1597人阅读 评论(0) 收藏 举报 一、网络爬虫...
  • pi9nc
  • pi9nc
  • 2013年08月03日 20:56
  • 34878

C# 网络爬虫类

/// /// 类说明:HttpHelper类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理 /// /// /// using S...
  • zuoyefeng1990
  • zuoyefeng1990
  • 2017年03月15日 14:17
  • 229

编写简单的网络爬虫 (python3.2)

我这里分几个部分谈谈 网络爬虫的原理:-->搜索引擎? 一、爬虫爬取网页的基本步骤大致相同:1) 人工给定一个URL 作为入口,从这里开始爬取。 万维网的可视图呈蝴蝶型,网络爬虫一般从蝴蝶...
  • database_zbye
  • database_zbye
  • 2014年08月25日 22:30
  • 14788

python 网络爬虫入门(一)———第一个python爬虫实例

最近两天学习了一下python,并自己写了一个网络爬虫的例子。 python版本: 3.5 IDE : pycharm 5.0.4 要用到的包可以用pycharm下载: File->Defau...
  • Bo_wen_
  • Bo_wen_
  • 2016年03月13日 15:58
  • 73820

Java之——简单的网络爬虫实现

最近在学习搜索方面的东西,需要了解网络爬虫方面的知识,虽然有很多开源的强大的爬虫,但本着学习的态度,自己写了一个简单的网络爬虫,以便了解其中原理。 首先介绍每个类的功能: DownloadPage...
  • l1028386804
  • l1028386804
  • 2015年10月08日 23:46
  • 17469

python爬虫实例项目大全

WechatSogou [1]- 微信公众号爬虫。基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典。 DouBanSpider [...
  • baidu_21833433
  • baidu_21833433
  • 2017年04月21日 14:59
  • 10932

python小实例一:简单爬虫

本文所谓的爬虫就是通过本地远程访问url,然后将url的读成源代码形式,然后对源代码进行解析,获取自己需要的数据,相当于简单数据挖掘。本文实现的是将一个网页的图片爬出保存到本地的过程,例子很简单,用的...
  • xqn2017
  • xqn2017
  • 2017年03月27日 11:52
  • 2034
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:泰然处之,网络爬虫程序实例
举报原因:
原因补充:

(最多只允许输入30个字)