知识点

相关文章

更多

最近更新

更多

Heritrix源码分析(十二) Heritrix的控制中心(大脑)CrawlController(一)(转)

2019-03-27 01:04|来源: 网路

  本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/650694 

      本博客已迁移到本人独立博客: http://www.yun5u.com/

      欢迎加入Heritrix群(QQ):109148319,10447185  , Lucene/Solr群(QQ) :  118972724  

      CrawlController的确是Heritrix的大脑,在Heritrix中拥有无上的权利!可以控制Heritrix的启动、暂停、停止,也定时进行数据统计、数据汇报和文件管理。同时CrawlController也基本上贯穿整个Heritrix代码,和CrawlURI一样。同时CrawlController纯代码页进2000行,下面就先介绍里面的属性和主要方法,同时对一些灵活用法也加以介绍:

         1.属性:

Java代码   收藏代码
  1. //状态,Checkpoinging:表示正在备份  
  2. private static final Object CHECKPOINTING = "CHECKPOINTING".intern();  
  3. //状态,FINISHED:表示抓取结束  
  4. private static final Object FINISHED = "FINISHED".intern();  
  5. //状态,NASCENT:表示正在生成一个JOB  
  6. private static final Object NASCENT = "NASCENT".intern();  
  7. //状态,PAUSED:表示暂停结束,该状态Heritrix正暂停任何抓取  
  8. private static final Object PAUSED = "PAUSED".intern();  
  9. //状态,PAUSING:表示正在暂停,传达一个暂停命令到每一个线程暂停中间需要时间  
  10. private static final Object PAUSING = "PAUSING".intern();  
  11. //状态,PREPARING:表示抓取结束  
  12. private static final Object PREPARING = "PREPARING".intern();  
  13. //状态,RUNNING:表示正在运行  
  14. private static final Object RUNNING = "RUNNING".intern();  
  15. //状态,STARTED:表示已经启动  
  16. private static final Object STARTED = "STARTED".intern();  
  17. //状态,STOPPING:表示正在停止,传达一个停止命令到每一个线程暂停中间需要时间  
  18. private static final Object STOPPING = "STOPPING".intern();  
  19.   
  20. //当前类的日志管理器  
  21. private final static Logger LOGGER = Logger.getLogger(CrawlController.class  
  22.         .getName());  
  23. // 活动的日志文件名后缀   
  24. public static final String CURRENT_LOG_SUFFIX = ".log";  
  25.   
  26. // 日志crawl.log.txt的文件名  
  27. private static final String LOGNAME_CRAWL = "crawl";  
  28. // 日志local-errors.log.txt的文件名  
  29. private static final String LOGNAME_LOCAL_ERRORS = "local-errors";  
  30. // 日志progress-statistics.log.txt的文件名  
  31. private static final String LOGNAME_PROGRESS_STATISTICS = "progress-statistics";  
  32. // runtime-errors.txt的文件名  
  33. private static final String LOGNAME_RUNTIME_ERRORS = "runtime-errors";  
  34. // 日志uri-errors.txt的文件名  
  35. private static final String LOGNAME_URI_ERRORS = "uri-errors";  
  36.   
  37. // 日志manifest-report的文件名前缀  
  38. public final static String MANIFEST_REPORT = "manifest";  
  39. //processors-report.txt的文件名前缀  
  40. public final static String PROCESSORS_REPORT = "processors";  
  41.   
  42. // crawl-manifest日志文件中中配置文件标签缩写   
  43. public static final char MANIFEST_CONFIG_FILE = 'C';  
  44. // crawl-manifest日志文件中中日志文件标签缩写   
  45. public static final char MANIFEST_LOG_FILE = 'L';  
  46. // crawl-manifest日志文件中中报告文件标签缩写   
  47. public static final char MANIFEST_REPORT_FILE = 'R';  
  48.   
  49. //报告文件名数组  
  50. protected final static String[] REPORTS = { PROCESSORS_REPORT,  
  51.         MANIFEST_REPORT };  
  52. //应急内存,当内存不够时Heritrix会释放这个内存去做一些紧急动作如数据备份  
  53. private static final int RESERVE_BLOCK_SIZE = 6 * 2 ^ 20// 6MB  
  54. private static final int RESERVE_BLOCKS = 1;  
  55.       
  56. //BDB数据库,Heritrix自己封装  
  57. private transient EnhancedEnvironment bdbEnvironment = null;  
  58. //用于Checkpoint备份,存储需要备份的数据  
  59. private transient Map<String, CachedBdbMap<?, ?>> bigmaps = null;  
  60. //备份器  
  61. private Checkpointer checkpointer;  
  62. //备份对象  
  63. private transient Checkpoint checkpointRecover = null;  
  64.   
  65. //备份目录  
  66. private transient File checkpointsDisk;  
  67. //整个Heritrix目录  
  68. private transient File disk;  
  69. //日志文件目录  
  70. private transient File logsDisk;   
  71. //scratch文件  
  72. private transient File scratchDisk;  
  73. //BDB数据库文件  
  74. private transient File stateDisk;  
  75.   
  76. //日志处理器跟文件处理器关联  
  77. transient private Map<Logger, FileHandler> fileHandlers;  
  78. //调度器  
  79. private transient Frontier frontier;  
  80.   
  81. // 日志处理器,关联local-errors.log  
  82. public transient Logger localErrors;  
  83. // 日志处理器,关联 progress-statistics.log  
  84. private transient Logger progressStats;  
  85. //日志处理器,关联报告文件  
  86. public transient Logger reports;  
  87. // 日志处理器,关联runtime-errors.log  
  88. public transient Logger runtimeErrors;  
  89. // 日志处理器,关联uri-Errors.log  
  90. public transient Logger uriErrors;  
  91. // 日志处理器,关联crawl.log  
  92. public transient Logger uriProcessing;   
  93.   
  94. //记录Hertrix创建的日志文件名  
  95. private StringBuffer manifest;  
  96.   
  97. //最大字节数,来源于配置文件  
  98. private long maxBytes; //   
  99. //抓取限制, 最大文档数,来源于配置文件  
  100. private long maxDocument;  
  101. // 抓取限制,最大时间,来源于配置文件  
  102. private long maxTime;   
  103. //管理order.xml  
  104. private transient CrawlOrder order;  
  105. //处理器链  
  106. private transient ProcessorChainList processorChains;  
  107.   
  108. //事件监听器,比如正在运行、停止  
  109. private transient List<CrawlStatusListener> registeredCrawlStatusListeners = Collections  
  110.         .synchronizedList(new ArrayList<CrawlStatusListener>());  
  111. //抓取状态监听器,这里监听哪些URl被忽略,哪些URL抓取失败等  
  112. private transient CrawlURIDispositionListener registeredCrawlURIDispositionListener;  
  113.   
  114. //抓取状态监听器数据  
  115. protected transient ArrayList<CrawlURIDispositionListener> registeredCrawlURIDispositionListeners;  
  116.   
  117. // 应急储备内存  
  118. private transient LinkedList<char[]> reserveMemory;  
  119.   
  120. //抓取范围管理  
  121. private transient CrawlScope scope;  
  122.   
  123. // CrawlServer和CrawlHost的缓存  
  124. private transient ServerCache serverCache;   
  125.   
  126. //配置文件,如order.xml  
  127. private transient SettingsHandler settingsHandler;  
  128. //Heritrix状态,表示已经存在  
  129. private transient String sExit;  
  130.   
  131. // 锁,控制同时只能一个线程运行使用本类  
  132. private transient ReentrantLock singleThreadLock = null;  
  133.   
  134. //是否是单线程模式  
  135. private volatile transient boolean singleThreadMode = false;  
  136. // 表示当前爬虫状态,新生的  
  137. transient private Object state = NASCENT;   
  138.   
  139. // 统计跟踪器  
  140. protected StatisticsTracking statistics = null;   
  141. //线程池  
  142. private transient ToePool toePool;  

 

同时属性中有三个地方需要补充下:

     1)"CHECKPOINTING".intern(); 为什么采用intern()方法?知道intern()方法的人都知道,intern在创建String对象时会先无内存里查看有没有该对象,有的话直接返回,没有则重新创建。而普通的new一般都是直接创建对象,如此在一定程序上可以节省开销

     2)transient LinkedList<char[]> reserveMemory;应急内存。Heritrix在初始化的时候会先占用一部分内存,这里是6M。当发生内存溢出的时候则释放这部分内存,然后做一些日志、报告方面的操作

     3)private transient ReentrantLock singleThreadLock,重入锁.大脑只能有一个,所以需要用这个来保证一个大脑的存在,而不是多个。这里为什么不用单例模式来取代,而采用这种方法?我这里没有用单例模式和这种方法进行实验比较,但直觉上告诉我,由于Heritrix是个多线程爬虫,并且可以同时有多个抓取Job,但同时只能有一个job运行。单例模式的synchronized不能保证当一个job发生线程中断时,其他job可以获得CrawlController的锁来运行他们的抓取,因为synchronized会一直锁住CrawlController对象.而使用ReentrantLock则可以做到这一点...我的想法,欢迎大家拍砖...

 

 由于贴上方法介绍后本文章会太长,故方法介绍方法下一篇博客介绍,博客地址:http://guoyunsky.iteye.com/blog/650744


转自:http://www.cnblogs.com/seurain/p/3200628

相关问答

更多
  • 1.下载heritrix-1.14.1.zip和heritrix-1.14.1.src 并解压,解压heritrix-1.14.1.jar. 2.在eclipse下创建java project,命名为比如heritrix,进入其工程的目录,我的是F:\workspace\myeclipse\heritrix,删除src文件夹。 3.copy解压后的heritrix-1.14.1.zip文件夹下的lib,webapps,heritrix-1.14.1到F:\workspace\myeclipse\heritr ...
  • 问题是地址被占用,一是通过cmd查看端口使用(命令:netstat -ao),关闭占用的应用程序后再运行,二是更改自己使用的地址至空闲地址。我也是初学者,不一定对,试试吧~
  • 你要把下面的问题原因贴出来啊,就是这个错误下面一行的due to:信息
  • 登录的,建议你用jsoup带着cookie进去。 动态的,建议你用htmlunit。 webmagic和jsoup都很好学。有时间学学,虽然不是必会,但是这种小工具说不定什么时候就用得上。
  • 目前没有很少 刚帮你找了
  • 你需要在Modules页面中将ARCWriterProcessor这项,修改成MirrorWriterProcessor才会保存为镜像文件的。 如果你在Modules页面中不能选择,需要在Eclipse里面设置conf为Classpath( 在Eclipse的Run Dialog中,Classpath标签Table,选中User Entries,然后右边会有Advance选项,选Add External Folder,把你的Conf加进去就行了)
  • 需要用正则表达式来过滤到你不想要的东西,抓取和过滤的原理是一样的,就是具有共性的头和尾,把中间部分抓出来. 正则表达式在抓取中应用比较多,也可以称之为一种规则,你抓取内容要按照一定的规则来抓取,无用的你还得按照一定的规则过滤.
  • 如果你打算制作一个ajax网站的“副本”,显然没有。 如果要通过分析网站内容来获取某些数据,可以使用Extractor自定义爬网程序,以确定要遵循的URL。 在大多数网站上,您可以轻松猜出对您的案例感兴趣的网址,而无需解释javascript。 然后将抓取ajax回调并将其提供给处理器链。 默认情况下,这会将ajax回调答案存储在存档文件中。 制作自己的Extractor看起来像这样: import org.archive.modules.extractor.ContentExtractor; ...
  • 我还在Heritrix表单上提出了这个问题: http : //tech.groups.yahoo.com/group/archive-crawler/message/8235和Noah Levitt有想法将登录页面添加为我的爬行种子。 现在一切似乎都没有太多问题。 我的结论是我在配置文件中正确设置了所有内容,但是缺少了我需要的实际页面种子。 I also asked this question on the Heritrix forms: http://tech.groups.yahoo.com/grou ...