zoukankan      html  css  js  c++  java
  • Heritrix源码分析(二) 配置文件order.xml介绍

    本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.javaeye.com/blog/613412
    欢迎加入Heritrix群(QQ):10447185 , Lucene/Solr群(QQ) : 118972724
    order.xml是整个Heritrix的核心,里面的每个一个配置都关系到Heritrix的运行情况,没读源码之前我只能从有限的渠道去获知这些配置的运用.读完之后才知道Heritrix竟然有如此灵活的运用,如可以控制抓取速度,可以优化电脑性能,可以在某一次的抓取上继续抓取.当然整个order.xml里我也没有全部掌握,只知道大部分配置的作用,希望大家指点改正以及补充,谢谢!
    1.<meta></meta> 代表着该抓取JOB的元素,相当于Html的meta
    <meta>
      <name>myheritrix</name> <!-- Heritrix抓取JOB的名字,由用户输入,用来区分不同的抓取JOB,Heritrix没有默认值 -->
      <description>my heritrix</description> <!-- Heritrix抓取JOB的描述,由用户输入,用来描述该抓取JOB,Heritrix没有默认值-->
      <operator>Admin</operator> <!--Heritrix抓取JOB的操作者,由用户输入,Heritrix没有默认值 -->
      <organization></organization> <!--Heritrix抓取JOB的操作者所属组织,由用户输入,Heritrix没有默认值,可以为空 -->
      <audience></audience> <!--Heritrix抓取JOB的用户或客户,由用户输入,Heritrix没有默认值,可以为空 -->
      <date>20090520051654</date> <!--提交该Heritrix抓取JOB的时间,由系统生成 -->
    </meta>
    2.<controller></controller> 跟抓取有关的所有参数,由于内容较多,并且Heritrix也已将他们分成不同模块,所以这里我也将他们拆分来说明.
    <controller>
      <string name="settings-directory">settings</string> <!-- Heritrix的顶级目录 -->
      <string name="disk-path"></string><!-- order.xml所在目录,单个Heritrix实例的目录 -->
      <string name="logs-path">logs</string><!-- 用于保存Heritrix的日志文件,可以是绝对路径,也可以是相对路径,相对路径是相对于disk-path-->
      <string name="checkpoints-path">checkpoints</string><!-- 用于保存checkpoints(定点备份)文件的目录, 可以是绝对路径,也可以是相对路径,相对路径是相对于disk-path-->
      <string name="state-path">state</string> <!-- 用于保存crawler-state文件的目录,,可以是绝对路径,也可以是相对路径,相对路径是相对于disk-path -->
      <string name="scratch-path">scratch</string> <!-- 用于保存网页内容临时文件的目录,,可以是绝对路径,也可以是相对路径,相对路径是相对于disk-path-->
      <long name="max-bytes-download">0</long> <!-- 最大下载字节数,当下载字节超出该值爬虫将停止下载。如果该值为0则表示没有限制-->
      <long name="max-document-download">0</long> <!-- 最大文档下载数,当下载文档超出该值时爬虫将停止下载。如果该值为0则表示没有限制-->
      <long name="max-time-sec">0</long> <!-- 最大时间抓取(秒),如果抓取时间超过该值,则爬虫将停止抓取。如果该值为0则表示没有限制-->
       <integer name="max-toe-threads">30</integer> <!-- 最大线程数用于同时处理多个URI-->
    <integer name="recorder-out-buffer-bytes">4096</integer> <!-- 每一个线程的输出缓冲区大小,也就是在内存里存放多大的字节数才写入到文件中-->
    <integer name="recorder-in-buffer-bytes">65536</integer> <!-- 每一个线程的输入缓冲区大小,也就是在内存里存放多大的字节数才写入到文件中-->
    <integer name="bdb-cache-percent">0</integer> <!--分配给DBB缓存堆的百分比,默认为0则表示没有其他要求(通常BDB是需要60%或者是最大值) -->
    <newObject name="scope" class="org.archive.crawler.deciderules.DecidingScope"> <!-- 抓取范围,构造CrawlScope,等下拆分来说明-->
    </newObject> <map name="http-headers"> <!-- HTTP协议,当处理爬虫HTPTP协议时需要构造,等下拆分说明-->
    </map> <newObject name="robots-honoring-policy" class="org.archive.crawler.datamodel.RobotsHonoringPolicy"> <!--Robots.txt协议控制,等下拆分来说明 -->
    </newObject> <newObject name="frontier" class="org.archive.crawler.frontier.BdbFrontier"> <!-- Frontier 调度器,等下拆分来说明-- > </newObject> <map name="uri-canonicalization-rules"> <!-- URL规范化规则,URL规范化规则有序列表,规则适用于从上至下列出的顺序,等下拆分来说明-->
    </map> <map name="pre-fetch-processors"> <!--预先处理链,在抓取前需要从网络获取或配置相关参数,等下拆分来说明 -->
    </map> <map name="fetch-processors"> <!-- 获取链,等下拆分来说明 -->
    </map> <map name="extract-processors"> <!-- 抽取链,等下拆分来说明 -->
    </map> <map name="write-processors"> <!--写链,等下拆分来说明 -->
    </map> <map name="post-processors"> <!-- 请求链:清理URI和在URI范围内填充新的URI ,等下拆分来说明-->
    </map> <map name="loggers"> <!-- 统计跟踪链.统计跟踪模块,指定用于监视抓取和写日志,以及报告和提供信息给用户接口,等下拆分来说明-->
    </map> <newObject name="credential-store" class="org.archive.crawler.datamodel.CredentialStore"> <!--凭证存储,如登陆凭证,等下拆分来说明 -->
    </newObject> </controller>
    3.接下来拆分每个组件的配置文件一一进行说明,最后对Heritrix主要的配置也就是我们可以影响抓取的配置进行说明。
    3.1:抓取范围<newObject name="scope" class="org.archive.crawler.deciderules.DecidingScope">
    <newObject name="scope" class="org.archive.crawler.deciderules.DecidingScope"><!-- 抓取范围,构造CrawlScope-->
    <boolean name="enabled">false</boolean> <!-- 是否运行这个组件 -->
    <string name="seedsfile">seeds.txt</string> <!--种子文件名-->
    <boolean name="reread-seeds-on-config">true</boolean> <!-- 是否每一个配置发生变法都要引发重新读取原始种子文件 -->
    <newObject name="decide-rules" class="org.archive.crawler.deciderules.DecideRuleSequence"> <!--抓取范围限定的规则,由于自己一直做的是垂直抓取,没有使用以及研究它 -->
    <map name="rules"><!-- 不同的规则-->
    <newObject name="rejectByDefault" class="org.archive.crawler.deciderules.RejectDecideRule"> <!-- -->
    </newObject> <newObject name="acceptIfSurtPrefixed" class="org.archive.crawler.deciderules.SurtPrefixedDecideRule"><!-- -->
    <string name="decision">ACCEPT</string> <!-- -->
    <string name="surts-source-file"></string> <!--用于推断SURT前缀的文件,文件里的任何文件将转换为所提供的SURT前缀,显示在行里的SURT前缀都会通过+开始 -->
    <boolean name="seeds-as-surt-prefixes">true</boolean> <!--种子文件是否也应当解析成SURT前缀 -->
    <string name="surts-dump-file"></string> <!--保存SURT前缀的文件,用于实际调试SURTS时 -->
    <boolean name="also-check-via">false</boolean><!--是否也检查该CrawlURI中的via -->
    <boolean name="rebuild-on-reconfig">true</boolean><!-- 当配置文件更改后,是否也跟着更改-->
    </newObject> <newObject name="rejectIfTooManyHops" class="org.archive.crawler.deciderules.TooManyHopsDecideRule"><!-- -->
    <integer name="max-hops">20</integer><!--最大跃点数,也就是抓取深度 -->
    </newObject> <newObject name="acceptIfTranscluded" class="org.archive.crawler.deciderules.TransclusionDecideRule"><!-- -->
    <integer name="max-trans-hops">3</integer><!--除去链接L,PathFromSeed的最大长度 -->
    <integer name="max-speculative-hops">1</integer><!--抽取的链接X,可能是链接L或者嵌入式E,在JS里的最大个数,通过pathFromSeed判断 -->
    </newObject> <newObject name="rejectIfPathological" class="org.archive.crawler.deciderules.PathologicalPathDecideRule"><!-- -->
    <integer name="max-repetitions">2</integer><!--一个URL相同目录段名最大重复次数,超过该值返回REJECT,如http://www.baidu.com/a/a/a/index.html ,其中/a出现三次,超过了2次,所以返回REJECT(拒绝)-->
    </newObject> <newObject name="rejectIfTooManyPathSegs" class="org.archive.crawler.deciderules.TooManyPathSegmentsDecideRule"><!-- -->
    <integer name="max-path-depth">20</integer><!--URL中段的次数是否超过该值,超过返回REJET,段表示http://www.baidu.com/a/b,其中a和b表示一个段 -->
    </newObject> <newObject name="acceptIfPrerequisite" class="org.archive.crawler.deciderules.PrerequisiteAcceptDecideRule"><!-- -->
    </newObject> </map> </newObject> </newObject>
    3.2: HTTP协议<map name="http-headers">
    <map name="http-headers"><!-- HTTP协议,当处理爬虫HTPTP协议时需要构造 -->
    <string name="user-agent">Mozilla/5.0 (compatible; heritrix/1.14.3 +http://127.0.0.1)</string><!-- 用户代理,这个值字段必须包含有效的URL,如此才可以用爬虫访问个人或者组织的网站 -->
    <string name="from">guoyunsky@hotmail.com</string><!--联系人信息,该字段必须包含有效的email,来代表使用本爬虫的个人或组织 -->
    </map>
    3.3:爬虫协议 <newObject name="robots-honoring-policy" class="org.archive.crawler.datamodel.RobotsHonoringPolicy">
    <newObject name="robots-honoring-policy" class="org.archive.crawler.datamodel.RobotsHonoringPolicy"><!--Robots.txt协议控制 -->
    <string name="type">classic</string> <!-- 爬虫协议类型,有classic,ignore,custom,most-favored,most-favored-set 5种类型 -->
    <boolean name="masquerade">false</boolean> <!-- 我们应当在当爬虫遵循所有它声明的规则时伪装另一个代理,唯一相关的类型是:most-favored和most-favored-set-->
    <text name="custom-robots"></text> <!-- 如果type是custom,则机器人自定义-->
    <stringList name="user-agents"> <!-- 如果type是most-favored-set,代替的user-agents,这里列表多个 -->
    </stringList> </newObject>
    3.4:Frontier 调度器<newObject name="frontier" class="org.archive.crawler.frontier.BdbFrontier"><!-- Frontier 调度器-->
    <newObject name="frontier" class="org.archive.crawler.frontier.BdbFrontier"><!-- Frontier 调度器-->
    <float name="delay-factor">4.0</float><!-- 从同一个服务器(host)获取需要等待的间隔时间,可以预防无节制的抓取一个网站.通常是用该值去乘以上一个url的抓取时间来表示为下一个url需要等待的时间 -->
    <integer name="max-delay-ms">20000</integer><!-- 最大的等待时间,单位毫秒 -->
    <integer name="min-delay-ms">2000</integer><!-- 最小等待时间,单位毫秒-->
    <integer name="respect-crawl-delay-up-to-secs">300</integer><!--当读取robots.txt时推迟抓取的时间,单位毫秒 -->
    <integer name="max-retries">30</integer><!-- 已经尝试失败的URI的重新尝试次数,很多人在跑Heritrix的时候,发现只跑了30个URL就停止了,其实是一个URL都没成功,它这里重试了30次 -->
    <long name="retry-delay-seconds">900</long><!--默认多长时间我们重新去抓取一个检索失败的URI -->
    <integer name="preference-embed-hops">1</integer><!--嵌入或者重定向URI调度等级,例如,该值为1(默认也为1),调度时将比普通的link等级高.如果设置为0,则和link一样 -->
    <integer name="total-bandwidth-usage-KB-sec">0</integer><!--爬虫所允许的最大宽带平均数,实际的读取速度是不受此影响的,当爬虫使用的宽带接近极限时,它会阻碍新的URI去处理,0表示没有限制 -->
    <integer name="max-per-host-bandwidth-usage-KB-sec">0</integer><!--爬虫允许的每个域名所使用的最大宽带数,实际的读取速度不会受此影响,当爬虫使用的宽带接近极限时,它会阻碍新的URI去处理,0表示没有限制 -->
    <string name="queue-assignment-policy">org.archive.crawler.frontier.HostnameQueueAssignmentPolicy</string><!--定义如何去分配URI到各个队列,这个类是相同的host的url就属于同一个队列 -->
    <string name="force-queue-assignment"></string><!--强制URI的队列名字, -->
    <boolean name="pause-at-start">false</boolean><!-- 在URI被尝试前,当爬虫启动后是否暂停?这个操作可以在爬虫工作前核实或调整爬虫。默认为false -->
    <boolean name="pause-at-finish">false</boolean><!-- 当爬虫结束时是否暂停,而不是立刻停止工作.这个操作可以在爬虫状态还是可用时,有机会去显示爬虫结果,并有可能去增加URI和调整setting,默认为false-->
    <boolean name="source-tag-seeds">false</boolean><!-- 是否去标记通过种子抓取的uri作为种子的遗传,用source值代替.-->
    <boolean name="recovery-log-enabled">true</boolean><!--设置为false表示禁用恢复日志写操作,为true时候表示你用checkpoint去恢复crawl销毁的数据 -->
    <boolean name="hold-queues">true</boolean><!--当队列数量未达到时,是否不让其运行,达到了才运行。是否要去持久化一个创建的每个域名一个的URI工作队列直到他们需要一直繁忙(开始工作)。如果为false(默认值),队列会在任何时间提供URI去抓取。如果为true,则队列一开始(还有收集的url)会处于不在活动中的状态,只有在Frontier需要另外一个队列使得所有线程繁忙的时候才会让一个新的队列出于活动状态. -->
    <integer name="balance-replenish-amount">3000</integer><!--补充一定的数量去使得队列平衡,更大的数目则意味着更多的URI将在它们处于等待队列停用之前将被尝试 -->
    <integer name="error-penalty-amount">100</integer><!-- 当队列中的一个URI处理失败时,需要另外处罚的数量.加速失活或问题队列,反应迟钝的网站完全退休。,默认为100-->
    <long name="queue-total-budget">-1</long><!--单个队列所允许的活动的开支,队列超出部分将被重试或者不再抓取,默认为-1,则表示没有这个限制 -->
    <string name="cost-policy">org.archive.crawler.frontier.ZeroCostAssignmentPolicy</string><!-- 用于计算每个URI成本,默认为UnitCostAssignmentPolicy则认为每个URI的成本为1-->
    <long name="snooze-deactivate-ms">300000</long><!--任何snooze延迟都会影响队列不活动,允许其他队列有机会进入活动状态,通常设置为比在成功获取时暂停时间长,比连接失败短,默认为5分钟 -->
    <integer name="target-ready-backlog">50</integer><!--准备积压队列的目标大小,这里多个队列将会进入准备状态即使线程不再等待.只有hold-queues为true才有效,默认为50 -->
    <string name="uri-included-structure">org.archive.crawler.util.BdbUriUniqFilter</string><!-- -->
    <boolean name="dump-pending-at-close">false</boolean><!-- -->
    </newObject>
    3.5:URL规范化规则,主要用来规范化每个URL,用Heritrix默认的就好了,这里不做说明了,其实也是通过各种规则
    3.6:预先处理链组件:

      <map name="pre-fetch-processors">
      <map name="pre-fetch-processors"> <!--预先处理链,在抓取前需要从网络获取或配置相关参数 -->
      <newObject name="Preselector" class="org.archive.crawler.prefetch.Preselector"><!--该组件使用的类 -->
      <boolean name="enabled">true</boolean><!--是否启用该组件 -->
      <newObject name="Preselector#decide-rules" class="org.archive.crawler.deciderules.DecideRuleSequence"><!-- 该组件的规则,可以忽略不符合  规则的URL不处理-->
      <map name="rules"><!-- 该组件的规则-->
      </map> </newObject> <boolean name="override-logger">false</boolean><!-- 如果启用则覆盖这个类的默认日志器,默认日志器将日志打印在控制台.覆盖的日志器将把所有日志发送到在日志目录下的以本类命名的日志文件中。在heritrix.properties中设置好日志等级和日志格式,这个属性在重启后知获取一次. -->
    <boolean name="recheck-scope">true</boolean><!--是否需要在这一步重新检索Crawl Scope -->
    <boolean name="block-all">false</boolean><!--指定所有的URIS(通常是由host给定)在这一步阻止 -->
    <string name="block-by-regexp"></string><!-- 指定允许所有在这里匹配这个正则表达式的则阻止-->
    <string name="allow-by-regexp"></string><!-- 指定允许在这里所有匹配正则表达式的则允许,会对每个url都进行判断-->
    </newObject> <newObject name="Preprocessor" class="org.archive.crawler.prefetch.PreconditionEnforcer"><!-- -->
    <boolean name="enabled">true</boolean><!-- -->
    <newObject name="Preprocessor#decide-rules" class="org.archive.crawler.deciderules.DecideRuleSequence"><!-- -->
    <map name="rules"><!-- -->
    </map> </newObject> <integer name="ip-validity-duration-seconds">86400</integer><!--DNS有效的最低时间间隔(单位为秒),如果记录的DNS TTL较大,那将被用来代替,设置为0则表示永久有效 -->
    <integer name="robot-validity-duration-seconds">86400</integer><!--提取robots.txt信息有效时间(单位为秒),如果该设置为0则robots.txt信息永不过期 -->
    <boolean name="calculate-robots-only">false</boolean><!--是否只计算一个URI的robots状态,没有任何实际应用的除外.如果该值为true,排除的url只将记录在crawl.log,但仍将抓取,默认为false(false的话,排除的url是不应该被抓取的)-->
    </newObject> </map>
    3.7:获取组件:

    <map name="fetch-processors">
    <map name="fetch-processors"> <!-- 获取链 -->
    <newObject name="DNS" class="org.archive.crawler.fetcher.FetchDNS"><!--获取DNS使用的类 -->
    <boolean name="enabled">true</boolean><!-- 是否启用该组件 -->
    <newObject name="DNS#decide-rules" class="org.archive.crawler.deciderules.DecideRuleSequence"><!--规则,用于忽略不符合规则的URL -->
    <map name="rules"> </map> </newObject> <boolean name="accept-non-dns-resolves">false</boolean><!-- -->
    <boolean name="digest-content">true</boolean><!-- 是否执行文摘(将DNS类容通过以下算法转换为指纹值,用于区别不同的DNS) -->
    <string name="digest-algorithm">sha1</string><!-- 用什么算法转换指纹-->
    </newObject> <newObject name="HTTP" class="org.archive.crawler.fetcher.FetchHTTP"><!--获得HTTP使用的类 -->
    <boolean name="enabled">true</boolean><!-- 是否启用该组件-->
    <newObject name="HTTP#decide-rules" class="org.archive.crawler.deciderules.DecideRuleSequence"><!-- 规则,用于忽略不符合规则的URL -->
    <map name="rules"><!-- -->
    </map> </newObject> <newObject name="midfetch-decide-rules" class="org.archive.crawler.deciderules.DecideRuleSequence"><!-- 适用于中间抓取规则,在我们开始去下载网页前相应header.如果最后决定拒绝,在所有内容读取之前停止抓取-->
    <map name="rules"> </map> </newObject> <integer name="timeout-seconds">1200</integer><!--如果抓取在规定时间内(秒)没有完成,即使它还正在处理中,也是放弃。设置为0则没有这个限制,但这里不推荐设置为0,因为线程会一直等到抓取结束 -->
    <integer name="sotimeout-ms">20000</integer><!--如果一个Socket在规定时间内(毫秒)没有反应,则将放弃连接或者读取。这里不一定是在抓取期间立即放弃,会尝试重新连接和重新读取直到这个设置的时间到了.设置为0则没这个限制,但这里不推荐,因为Socket会无限期处理 -->
    <integer name="fetch-bandwidth">0</integer><!--从一个服务器抓取数据最大速度(KB/秒),0表示没有限制 -->
    <long name="max-length-bytes">0</long><!-- 最大抓取长度,超过这个长度将被截取,0表示没有限制-->
    <boolean name="ignore-cookies">false</boolean><!--是否禁用cookie处理 -->
    <boolean name="use-bdb-for-cookies">true</boolean><!-- 是否在BDB中保存Cookie-->
    <string name="load-cookies-from-file"></string><!-- 预先载入cookie的来源文件路径-->
    <string name="save-cookies-to-file"></string><!-- 当抓取结束,保存cookie的文件-->
    <string name="trust-level">open</string><!--SSL证书信任等级,等级范围包括open(默认值,信任所有证书,包括过期,自签名,还有那些我们没有CA的)、loose(只信任自签名的证书)、normal(所有不包括自签名的证书)、strict(最严格的,证书必须有效并且DN必须匹配服务器名) -->
    <stringList name="accept-headers"><!--在每个请求里接受完整的Header,如:Accept-Language: en -->
    </stringList> <string name="http-proxy-host"></string><!-- 代理IP设置,如果需要只能设置一个,配置这里可以使用代理IP去抓取-->
    <string name="http-proxy-port"></string><!-- 代理端口设置,如果需要只能设置一个-->
    <string name="default-encoding">GB2312</string><!--文件编码,如果没有在Http Header指定,将采用默认的ISO-8859-1 -->
    <boolean name="digest-content">true</boolean><!-- 是否去执行一个正在运行中的要重试context-bodies的digest hash-->
    <string name="digest-algorithm">sha1</string><!-- 去执行正在运行中的要重试context-bodies的digest hash的算法,如MS5,SHA1-->
    <boolean name="send-if-modified-since">true</boolean><!--是否发送'If-Modified-Since' header,如果上次的Last-Modified抓取历史消息在URI历史中有效-->
    <boolean name="send-if-none-match">true</boolean><!--是否发送'If-Node-Match' header,如果上次的Etag抓取历史信息在URI历史中有效 -->
    <boolean name="send-connection-close">true</boolean><!-- 每次请求是否发送'Connection: close' header-->
    <boolean name="send-referer">true</boolean><!--每次请求是否发送'Referer' header,'Referer' header包含crawler来自哪里,在目前发现的URI页面里。'Referer'通常记录在远程服务器上,可以协助网站管理员去找出爬虫抓取了哪些特定的区域。 -->
    <boolean name="send-range">false</boolean><!--是否发送'Range' header当文档尺寸最大下载字节数限制。要有礼貌的道HTTP服务器并且发送'Range' header,说明你只是对前n个字节感兴趣。如果文档尺寸最大下载字节数大于0,在'206 Partial Content'相应状态里发送'Range' header,这样比只是截断超出下载字节数要好,不过很少的情况下发送'Range',将会得到'416 Request Range Not Satisfiable'回应 -->
    <string name="http-bind-address"></string><!--连接时使用本地IP地址和域名(绑定socket),当没有指定时使用本地默认的地址 -->
    </newObject> </map>
    3.8:抽取组件<map name="extract-processors"> <!-- 抽取链 -->
    <map name="extract-processors"> <!-- 抽取链 -->
    <newObject name="ExtractorHTTP" class="org.archive.crawler.extractor.ExtractorHTTP"><!-- 抽取HTTP-->
    <boolean name="enabled">true</boolean><!-- 是否启用该组件 -->
    <newObject name="ExtractorHTTP#decide-rules" class="org.archive.crawler.deciderules.DecideRuleSequence"><!-- 规则,用于忽略不符合规则的URL -->
    <map name="rules"><!-- -->
    </map> </newObject> </newObject> <newObject name="ExtractorHTML" class="org.archive.crawler.extractor.ExtractorHTML"><!-- 抽取HTML,主要的抽取类 -->
    <boolean name="enabled">true</boolean><!-- 是否启用该组件 -->
    <newObject name="ExtractorHTML#decide-rules" class="org.archive.crawler.deciderules.DecideRuleSequence"><!-- 规则,用于忽略不符合规则的URL -->
    <map name="rules"><!-- -->
    </map> </newObject> <boolean name="extract-javascript">true</boolean><!-- 是否在Javascript里找链接,默认为true -->
    <boolean name="treat-frames-as-embed-links">true</boolean><!-- 如果以上值为true,FRAME/IFRAME被当做嵌入式链接(像图片,hop-type是E),否则就把他们当做导航链接,默认为true -->
    <boolean name="ignore-form-action-urls">true</boolean><!-- 如果为true,uri中再HTML FORM中出现的Action属性将被忽略,默认为false -->
    <boolean name="extract-only-form-gets">true</boolean><!-- 如果为true,则uri中HTML FORM中只抽取Method为get的URL,Method为post的将被忽略-->
    <boolean name="extract-value-attributes">true</boolean><!--如果为true,则抽取那些像链接的字符串,这种操作可能会抽取到有效的和无效的链接,默认为true-->
    <boolean name="ignore-unexpected-html">true</boolean><!-- 如果为true,则那种特殊格式的URL,比如图片将不会被扫描,默认为true -->
    </newObject> </map>
    3.9:写组件<map name="write-processors">
    <map name="write-processors"> <!--写链 -->
    <newObject name="Archiver" class="com.steel.heritrix.extend.MyWriterMirror"><!--这里我是用的自己的写链-->
    <boolean name="enabled">true</boolean><!-- 是否启用该组件 -->
    <newObject name="Archiver#decide-rules" class="org.archive.crawler.deciderules.DecideRuleSequence"><!--规则,用于忽略不符合规则的URL -->
    <map name="rules"><!-- -->
    </map> </newObject> <boolean name="case-sensitive">true</boolean> <!--true表示操作系统区分大小写 -->
    <stringList name="character-map" /> <!--这是一个键值对组,用value代替key.-->
    <stringList name="content-type-map" /> <!--这是一个键值对组,用value代替key -->
    <string name="directory-file">index.html</string> <!-- 如果给定的URL不是明确的HTML,则从这个URL去获取-->
    <string name="dot-begin">%2E</string> <!--如果一个段以.开头,则用这个值替换它。 -->
    <string name="dot-end">.</string> <!--如果一个目录以.结尾,则用这个值替换它.所有的操作系统出了Windows,.是建议使用的.但Windws,%%2E才是建议的 -->
    <stringList name="host-map" /> <!--这是一个键值对组,如果一个host名字里匹配该key,则用value值替换它。当一个host使用多个name时这个可以保持一致性,如:[12.34.56.78 www42.foo.com] -->
    <boolean name="host-directory">true</boolean> <!--是否创建在url在host命名中的子目录.如www.baidu.com创建www.baidu.com这个目录,而www.baidu.com/zhidao,则在www.baidu.com目录后面再创建知道这个子目录 -->
    <string name="path">mirror</string> <!-- 用于下载html文件的头目录-->
    <integer name="max-path-length">1023</integer> <!--文件系统路径最大长度 -->
    <integer name="max-segment-length">255</integer> <!-- 文件系统路径中段路径的最大长度-->
    <boolean name="port-directory">false</boolean> <!--在url中是否创建一个以port命名的子目录 -->
    <boolean name="suffix-at-end">true</boolean> <!--如果为true,则后缀放在url中查询段的后面.如果为false则放在前面 -->
    <string name="too-long-directory">LONG</string> <!--如果url中目录都超过或者接近超过文件系统最大长度,超过部分它们都将用这个代替. -->
    <stringList name="underscore-set" /> <!--如果一个目录名在列表里忽略大小写,那么_将放在它前面.所有的文件系统除了Windows,这个是不需要的.Windows里需要注意的是:[com1 com2 com3 com4 com5 com6 com7 com8 com9 lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9 con nul prn] -->
    </newObject> </map>
    3.10:请求链组件<map name="post-processors">里面可以配置自己的调度器
    <map name="post-processors"> <!-- 请求链:清理URI和在URI范围内填充新的URI -->
    <newObject name="Updater" class="org.archive.crawler.postprocessor.CrawlStateUpdater"><!-- -->
    <boolean name="enabled">true</boolean><!-- -->
    <newObject name="Updater#decide-rules" class="org.archive.crawler.deciderules.DecideRuleSequence"><!-- -->
    <map name="rules"><!-- -->
    </map> </newObject> </newObject> <newObject name="LinksScoper" class="org.archive.crawler.postprocessor.LinksScoper"><!-- -->
    <boolean name="enabled">true</boolean><!-- -->
    <newObject name="LinksScoper#decide-rules" class="org.archive.crawler.deciderules.DecideRuleSequence"><!-- -->
    <map name="rules"> </map> </newObject> <boolean name="override-logger">false</boolean><!-- 如果启用则覆盖这个类的默认日志器,默认日志器将日志打印在控制台.覆盖的日志器将把所有日志发送到 在日志目录下的以本类命名的日志文件中。在heritrix.properties中设置好日志等级和日志格式,这个属性在重启后知获取一次. -->
    <boolean name="seed-redirects-new-seed">true</boolean><!-- 如果为true,任何种子重定向的URL,同样当做一个种子对待 -->
    <integer name="preference-depth-hops">-1</integer><!-- 种子重定向url hop等级设置.-->
    <newObject name="scope-rejected-url-rules" class="org.archive.crawler.deciderules.DecideRuleSequence"><!-- -->
    <map name="rules"> </map> </newObject> </newObject> <newObject name="Scheduler" class="com.steel.heritrix.extend.MyFrontierScheduler"><!-- 我自己的调度器 -->
    <boolean name="enabled">true</boolean><!-- -->
    <newObject name="Scheduler#decide-rules" class="org.archive.crawler.deciderules.DecideRuleSequence"><!-- -->
    <map name="rules"><!-- -->
    </map> </newObject> </newObject> </map>
    3.11:统计跟踪链组件<map name="loggers">
    <map name="loggers"> <!-- 统计跟踪链.统计跟踪模块,指定用于监视抓取和写日志,以及报告和提供信息给用户接口-->
    <newObject name="crawl-statistics" class="org.archive.crawler.admin.StatisticsTracker"><!--统计类 -->
    <integer name="interval-seconds">20</integer><!--写日志消息的时间间隔(秒) -->
    </newObject> </map>="crawl-statistics" class="org.archive.crawler.admin.StatisticsTracker"><!--统计类 --> <integer name="interval-seconds">20</integer><!--写日志消息的时间间隔(秒) --> </newObject> </map>

  • 相关阅读:
    瀑布流布局——JS+绝对定位
    浏览器事件的思考
    css的hack详解
    主流浏览器的Hack写法
    [HTML&CSS] 未知高度多行文本垂直居中
    HTML标签的默认样式列表
    推荐的 CSS 书写顺序
    高效整洁CSS代码原则 (上)
    高效整洁CSS代码原则 (下)
    Xcode升级导致插件失效的解决办法
  • 原文地址:https://www.cnblogs.com/loveyakamoz/p/2264526.html
Copyright © 2011-2022 走看看