首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Heritrix3.0课程 使用入门(四) 载入种子的四种方式

2012-10-29 
Heritrix3.0教程 使用入门(四) 载入种子的四种方式Heritrix3.0新特性一大亮点就是,相比以前版本载入种子更

Heritrix3.0教程 使用入门(四) 载入种子的四种方式

Heritrix3.0新特性一大亮点就是,相比以前版本载入种子更灵活(甚至你可以动态载入种子),同时可以载入N个种子.以前版本载入种子是全部加载到内存

,而一旦种子过多,那容易导致内存溢出.而新版本会分批次写入硬盘(通过调度器写入).所以避免了这个问题.下面就说一下Heritrix3.0

载入种子的四种方式,分别是:直接载入,通过seeds.txt载入,通过ActionDirectory动态载入(注意是动态,你随时可以载入),自定义载入.
1. 直接载入:
直接载入比较方便,只需直接在crawler.beans.cxml中设置就可以,具体设置如下.

view plaincopy to clipboardprint?
  1. <bean?class="org.archive.modules.seeds.TextSeedModule">??<property>??
  2. <bean>??<property>??
  3. <value>??#?your?seeds??
  4. </value>??</property>??
  5. </bean>??</property>??
  6. -->??<!--?<property?name='sourceTagSeeds'?value='false'/>?-->??
  7. <!--??</bean>??


其中只要把your seeds替换成你想要抓取的URL即可,如http://www.yun5u.com.其中sourceTagSeeds表示是否让新抽取出来的URL记录它的种子.
这个最方便,缺点就是如果种子太多,会使得crawler-beans.xml文件过于庞大,不美观
2. 通过seeds.txt载入
也只需要在crawler.beans.cxml中配置,同时将种子填充到seeds.txt中即可:

view plaincopy to clipboardprint?
  1. <bean?class="org.archive.modules.seeds.TextSeedModule">??<property>??
  2. <bean>??<property?value="seeds.txt"?/>??
  3. </bean>??</property>??
  4. <property?name='sourceTagSeeds'?value='false'/>??</bean>??


也很方便,同时保持了crawler-beans.cxml的美观.缺点其实1)也有,没有动态性,不能自定义扩展.比如想从数据库导入,甚至加上自己的属性.
3. 通过ActionDirectory动态载入
我觉得ActionDirectory是Heritrix3.0最有作用的新特性.因为可以动态控制抓取.比如想新增抓取的种子,想临时存放一些你不想抓取的URL,以及
临时让Heritrix抓取一些URL.ActionDirectory都可以很好的满足.我想这个还是以后要着重介绍下.下面先介绍动态载入种子的适用方法:
首先需要在crawler-beans.cxml中配置ActionDirectory:

view plaincopy to clipboardprint?
  1. <bean?class="org.archive.crawler.framework.ActionDirectory">??<property?name="actionDir"?value="action"?/>??
  2. <property?name="initialDelaySeconds"?value="10"?/>??<property?name="delaySeconds"?value="30"?/>??
  3. </bean>??


其中actionDir表示你的action目录,你得把动态加载的URL文件放到该目录下.默认为action,表示在Heritrix运行的目录下.
initialDelaySeconds表示,初始化时需要延迟的时间,这里是10秒
delaySeconds表示定时扫描actionDir的间隔时间,这里是30秒.
其中启动actionDirectory这个bean并且运行Heritrix3.0之后,你就会在你的抓取目录下看到action这个目录.当然这里你也可以自己指定.
随后可以生成一个文件,但必须以.seeds或.seeds(.gz)结尾.Heritrix会把以这两种文件名结尾的文件当做种子文件来处理.其中.seeds(.gz)
表示压缩文件.将你的种子写入.seeds文件,如test.seeds,再放入action目录,30秒后会发现该文件转移到./action/done目录下,格式为时间.test.seeds.
这个时候就表示test.seeds这个种子文件已经被加载了.你再观察下控制台,或者crawl.log就有可能发现你的种子已经被处理了.
当然,这种载入方式,你可以根据你的需要随时运行.
4. 自定义载入.
相信很多人,都有自定义载入种子的这个需求.比如从数据库中载入,或者加上自己的属性.这个就要扩展Heritrix的SeedModule了.我写了一个示例,代码如下:

view plaincopy to clipboardprint?
  1. import?java.io.File;??import?java.util.Vector;??
  2. import?org.apache.commons.httpclient.URIException;??import?org.archive.modules.CrawlURI;??
  3. import?org.archive.modules.SchedulingConstants;??import?org.archive.modules.seeds.SeedModule;??
  4. import?com.crawl.config.CrawlGlobal;??import?com.crawl.controller.MyHeritrixController;??
  5. public?class?MySeedModule?extends?SeedModule?{??private?static?final?long?serialVersionUID?=?1L;??
  6. public?static?MyHeritrixController?mhc=MyHeritrixController.getInstance();?//?单例模式,实现获得种子??/**?
  7. *?对ActionDirectory下.seeds或.seeds.gz的处理?*/??
  8. @Override??public?void?actOn(File?f)?{??
  9. }??/**?
  10. *?添加种子,比如动态添加了种子,这里既要将其载入,又要将其记录下来?*/??
  11. @Override??public?void?addSeed(CrawlURI?curi)?{??
  12. }??/**?
  13. *?载入种子?*/??
  14. @Override??public?void?announceSeeds()?{??
  15. Vector?seeds=mhc.getSeeds();?//?获得种子,这里需要根据你的需要自己实现.??String?url=null;??
  16. CrawlURI?curi=null;??try?{??
  17. for(int?i=0;?i<?seeds?.size();i++){?url=seeds.get(i);?if(url!=null&&!url.equals("")){?curi=HeritrixUrlUtil.urlToCrawlURI(url,?SchedulingConstants.MEDIUM);?//?自己实现的方法,将String类型的URL转换为CrawlURI?curi.setSeed(true);?//?设置为种子?curi.setSourceTag(curi.toString());?//?记录该URL来源的种子URL?curi.getData().put(CrawlGlobal.SITE_ID,new?Integer(i)?);?//?自定义属性?curi.makeHeritable(CrawlGlobal.SITE_ID);?//?持久化自定义属性?curi.setForceFetch(true);?//?设置为强制抓取,已经抓取过也继续抓取?publishAddedSeed(curi);?//?提交种子?}?}?}?catch?(URIException?e)?{?//?TODO?Auto-generated?catch?block?e.printStackTrace();?}?}?}??

?

view plaincopy to clipboardprint?
  1. //?HeritrixUrlUtil.urlToCrawlURI(url,?SchedulingConstants.MEDIUM);?代码??/**?
  2. *?将字符串形式的URL转换为CrawlURI?*?@param?url?
  3. *?@param?priority?*?@return?
  4. *?@throws?URIException?*/??
  5. public?static?CrawlURI?urlToCrawlURI(String?url,int?priority)?throws?URIException{??if?(!url.matches("[a-zA-Z][\\w+\\-]+:.*"))?{??
  6. url?=?"http://"?+?url;??}??
  7. url=url.replace("&",?"&");??UURI?uuri=UURIFactory.getInstance(url);??
  8. CrawlURI?curi=new?CrawlURI(uuri);??curi.setSchedulingDirective(priority);??
  9. return?curi;??}??

热点排行