当前位置: 首页 > 工具软件 > JSpider > 使用案例 >

Jspider的學習应用

奚卓
2023-12-01

Jspider的學習应用

 

  最近想写一個小东东,功能如下:

    根据一個根网站的站点开始抓取信息,同时检索网站的url,然后依次检索url抓取网站信息.

  考虑提取的url的方式:

   1.采用读取网站网页,抓取url,实现如下:采用HttpClient或URLConnection获取网页信息,利用HTMLParser解析html网页获取url方式.

   2.使用Jspider抓取,輸出到一個文件,读取文件并获取URL.

 

  1.2.1.2.1 JSpider整体结构:
  JSpider用于抓取WEB资源、解析内容结果、再从解析的结果中寻找新URL,再抓取等

  目前只支持下载HTML,不支持下载动态网页

 

 

事件转发流程(我们能自定义这种事件过滤链):


Rules决定Jspider去取什么资源(定义它的行为和范围),Rules一直执行,直到decision出现,decision类型有:不关心:接受:忽略:禁止:

Plugins是事件发生后我们采取的行动,这些行动可以是:写一个报告文件、在控制台上显示消息、写资源到磁盘、发邮件等。

Events filter能选择哪些事件被哪些Plugis处理。

API包括:

对象模型(站点、URL、内容、资源中的参考、Cookies等);

事件系统:

   Engine事件(引擎开始、结束、配置、选择)

   Spdering事件(站点发现、资源抓取、取资源错误)

   Monitoring事件(给信息关于进程与线程中断)

  在JSpiderEvent类中有定义:

    public static final int EVENT_TYPE_ENGINE = 1;

    public static final int EVENT_TYPE_MONITORING = 2;

    public static final int EVENT_TYPE_SPIDER = 3;

  

2.1.2.2 相关类
事件相关:

 

Model类图:


Site对象的状态(依赖于文件robots.txt):

   STATE_DISCOVERED

   STATE_ROBOTSTXT_HANDLED

   STATE_ROBOTSTXT_ERROR

   STATE_ROBOTSTXT_UNEXISTING

   STATE_ROBOTSTXT_SKIPPED

Resource的状态

   Discovered

   Fetch_Ignored

   Fetch_Error

   Fetch_Forbidden

   Fetched

   Parse_Ignored

   Parse_Error

   Parse

2.1.2.3配置
   配置分三个级别:

   公共(common)级别:如日志配置。在蜘蛛的common目录下

   蜘蛛(generally)级别:适用于所有站点

   站点(per-site)级别:每个站点定制

 

公共级别。日志配置:

   日志信息不记录事件信息,事件信息被转发到事件系统中(插件可选择将事件信息也输入日志)。

日志支持Log4j与JDK1.4 loggin (javax.util.loggin)

为了区别日志输出与插件输出,可以将日志系统关掉。即在jspider.properies file将jspider.log.provider改为:net.javacodeing.jspider.core.logging.impl.DevNullLogProvider。

(直接将日志信息输往控制台

jspider.log.provider=net.javacodeing.jspider.core.logging.impl.SystemOutLogProvider)

   用Log4j日志系统时配置log4j.xml文件

   用JDK1.4的日志时配置loggin.properties文件。(直接将Log4j.jar包移即用这个)

 

蜘蛛级别(jspider.properties):

   用代理,但验证未通过时,会返回407错误(FORBIDDEN)。

   有两组线程池(Spider)与(Thinkers)。一个thinker线程能保持几个spider线程,默认是1对5。

  用户代理配置(由Jspider往外发的每一个HTTP请求能改变,用户代理也被用于去决定从一个站点的robots.txt的什么规则去应用,改变用户代理也改变obeyed rules)

 

规则:

  Net.javacodeing.jspider.mod.rule.OnlyHttpProtocolRule。只抓以http://开头的URL

TextHtmlMimeTypeOnlyRule只抓取mime type里包含"text/html"的URL

AccepAllRule 接受所有URLS

BaseSiteOnlyRule 仅仅URL是base site的一部分才接受.(即只比较URL的host部分)

BoundedDepthRule URL的深度要满足。有两个参数(depth.min与depth.max)

OnlyDeeperInSiteRule 仅仅接受在同一站点中但是比base url深度要深的URL

ExternallyReferencedOnlyRule 仅仅接受被其他站点的资源引用的URL

InternallyReferencedOnlyRule 仅仅接受被相同站点的资源引用的URL

ForbiddenPathRule 不充许被接受的路径,只和robots.txt中同,参数(path)

MaxNumberOfURLParamsRuls 设置接收URL的最大个数,参数(max)

  MaxResourcesPerSiteRule 为每个站点设置接收URL的最大个数,参数(max)

  NoURLParamsRule 仅仅接受没有参数的URL,即”?name=quqi“之类

  RejectAllRule 拒绝所有的规则

 

站点级配置(per-site):

   对一个站台的一部分限制访问的配置:

   site.rules.spider.count=1 

site.rules.spider.1.class= net.javacoding.jspider.mod.rule.ForbiddenPathRule 

site.rules.spider.1.config.path=/apidocs 

robots.txt文件:任何web服务器上如果放有robots.txt文件,那么JSpider会去遵守robots.txt所定的访问权限。如果有robots.txt文件但是是取robots.txt文件失败那么这个站点上的文件均被忽略。

扼杀(throtting):用来防止web服务器崩溃,,而去设置Jspider多经常什么时候去发送请求。Throtting控制线程,如果必要阻塞它们直到他们被充许去做下一个请求。即控制上一个请求与发出下一个请求之时的时间隔。

设置Cokees:设置它的一个最大目的可能是可在一个session中做完任务,不用每次都去建立连接。

规则Rools:想看这些可在velocity-dump.out文件中看。

 

插件配置(Plugin.properties):插件是对事件的action,是我们着重感兴趣的地方。它接收事件通知,访问model完成相关行动。

   默认插件类型:

   Console:往控制台上打信息

   Velocity: 通过客户化模板写报告文件

   FileWriter: 写信息到文件系统中

   StatusBasedFileWriter: (根据URL状态写文件,200.out是所有良好的资源,404.out是错误的资源,301.out 是所有转发的资源等)

  DiskWriter: 每抓取下来一个文件就往文件系统中写,写资源内容,用于下载资源)

nutch安装,使用,二次开发入门 分类:程序人生2007.5.16 11:36 作者:quqi99 | 评论:0 | 阅读:2220
                

1 Nutch(windows环境下)
1.1 Nutch安装
    参考资料:http://www.blogjava.net/dev2dev/archive/2006/02/01/29415.aspx Nutch在Windows中安装之细解

由于运行Nutch自带的脚本命令需要Linux的环境,所以必须首先安装Cygwin来模拟这种环境。

1)安装cgwin

2) 下载nutch-0.9.tar.gz, 用winrar解压后,例如放在g:/nutch-0.9

3) 安装nutch,打开cgwin,运行命令:

   cd /cygdrive/g/nutch-0.9  (也就是进入nutch解压的目录)

   bin/nutch                  (执行nutch脚本安装)

4) OK !

1.2 Nutch使用入门
资料:http://blog.csdn.net/zjzcl/archive/2006/02/06/593138.aspx

Nutch 使用之锋芒初试  (包括下载及检索两部分)

注意:请使用JDK1.5,用JDK1。4会报错误:unsupported major.minor version 49.0 n

设置环境变量:NUTCH_JAVA_HOME = c:/jdk1.5

1.2.1 抓取少量网站1) 在nutch的安装目录新建一个文件url.txt,指明要抓取网站的顶级网址,写入:

   http://www.aerostrong.com.cn

2) 编辑conf/crawl-urlfilter.txt,修改MY.DOMAIN.NAME部分

   # accept hosts in MY.DOMAIN.NAME

#+^http://([a-z0-9]*\.)*MY.DOMAIN.NAME/

+^http://www.aerostrong.com.cn

    3) 运行脚本命令抓取,脚本命令全是linux下的shell命令,在window下运行它需要cgwin,打开cgwin,运行命令:

   cd /cygdrive/g/nutch-0.9  (也就是进入nutch解压的目录)

   bin/nutch crawl url.txt -dir crawled -depth 3 -threads 4 >& crawl.log

   参数解释:

      -dir dir names the directory to put the crawl in.

-depth depth indicates the link depth from the root page that should be crawled.

-delay delay determines the number of seconds between accesses to each host.

-threads threads determines the number of threads that will fetch in parallel.

1.2.2 抓取整个因特网http://hedong.3322.org/archives/000247.html 试用nutch

1、概念解释:

   1) web database: nutch所知道的page,以及在这些page里头的links (由injector通过DMOZ往里添加page,Dmoz(The Open Directory Project/ODP)是一个人工编辑管理的目录集合,为 搜索引擎提供结果或数据。)

   2)  segments.:是指page的一个集合,对它进行抓取与索引都作为同一个单元对待。它包含以下类型:

       Fetchlist 这些page的名称的集合

       Fetcher output: 这些page文件的集合

       Index:  lucene格式的索引输出

2、 建立web database与segments

  

初始准备
 
 
 
 
 mkdir db
 建立目录存放web database
 
 
 mkdir segments
 
 
 
 bin/nutch admin db -create
 建一个新的空的数据库(这步出错了)
 
第一轮抓取
 
 
 
 
 bin/nutch inject db -dmozfile content.rdf.u8 -subset 3000
 从DMOZ列表中取得URL并加入数据库
 
 
 bin/nutch generate db segments
 根据数据库内容,生成一个抓取列表(fetchlist)
 
 
 s1=`ls -d segments/2* | tail -1`
 刚才生成的抓取列表放在最后一个目录中,取其名
 
 
 bin/nutch fetch $s1
 利用机器人抓页面
 
 
 bin/nutch updatedb db $s1
 利用抓取结果更新数据库
 
第二轮抓取
 
 
 
 
 bin/nutch analyze db 5
 迭代5次分析页面的链接
 
 
 bin/nutch generate db segments -topN 1000
 将排行前1000个URL生成新的抓取列表
 
 
 s2=`ls -d segments/2* | tail -1`
 执行抓取、更新、并迭代2次分析链接
 
 
 bin/nutch fetch $s2
 
 
 
 bin/nutch updatedb db $s2
 
 
第三轮抓取
 
 
 
 
 bin/nutch analyze db 2
 
 
 
 bin/nutch generate db segments -topN 1000
 
 
 
 s3=`ls -d segments/2* | tail -1`
 
 
 
 bin/nutch fetch $s3
 
 
 
 bin/nutch updatedb db $s3
 
 
 
 bin/nutch analyze db 2
 (为下一次做准备?)
 
索引并去重
 
 
 
 
 bin/nutch index $s1
 
 
 
 bin/nutch index $s2
 
 
 
 bin/nutch index $s3
 
 
 
 bin/nutch dedup segments dedup.tmp
 
 
1.2.3 检索   1) 将nutch-0.9.war包丢到tomcat发布目录

   2) 修改配置文件指定索引库.( WEB-INF\classes下的nutch-site.xml):

     <?xml version="1.0"?>
  <?xml-stylesheet type="text/xsl" href="nutch-conf.xsl"?>

   <nutch-conf>
   <property>
    <name>searcher.dir</name>
    <value>G:/nutch-0.9/crawled</value>
   </property>
   </nutch-conf>

注意,当复制上述配置文件时,如果出现下列错误,是因为复制文件时带有空格或编码格式,重敲一遍即可: java.io.UTFDataFormatException: Invalid byte 1 of 1-byte UTF-8 sequence

3) 测试http://172.17.1.122:8081

  注意,若查询字符串输出中文时出现编码问题,这个问题和nutch关系不大,主要是tomcat有关系,修改tomcat的server.xml,在Connector元素中增加属性:

  URIEncoding="UTF-8" useBodyEncodingForURI="true"

1.3 nutch的二次开发
  参考:

http://www.mysoo.com.cn/news/2007/200721679.shtml Google式的搜索引擎实现

http://today.java.net/pub/a/today/2006/01/10/introduction-to-nutch-1.html Introduction to Nutch, Part 1: Crawling

http://today.java.net/pub/a/today/2006/02/16/introduction-to-nutch-2.html Introduction to Nutch, Part 2: Searching

 

资料
Nutch相关资料收集整理 http://www.gispark.com/html/spatial/2006/1008/294.html

你可以通过这个链接引用该篇文章:http://quqi99.bokee.com/viewdiary.15931511.html

 类似资料: