Heritrix Content Filtering
У меня есть требование агрегировать контент с нескольких разных веб-сайтов (в первую очередь, HTML-страниц и PDF-документов). В настоящее время я экспериментирую с Heritrix (3.2.0), чтобы посмотреть, будет ли он соответствовать моим потребностям.
В то время как документация довольно подробная, двигатель, кажется, не работает, как я ожидал. Я настроил несколько простых заданий и настроил DecideRules множеством разных способов, но независимо от того, что я делаю, я обнаружил, что Heritrix тянет слишком много контента или вообще ничего.
Вот пример того, что я пытаюсь сделать. Я указываю Heritrix на URL, как этот...example.com/news/speeches. Это веб-страница с таблицей HTML со ссылками на отдельные выступления (например, example.com/news/speech/speech1.html, xample.com/news/speech/speech2.html и т. Д. И т. Д.). Мне действительно нужны только документы HTML и PDF на один уровень ниже родительской страницы. Я хочу, чтобы Heritrix не перемещался глубже, чем на 1 уровень, запрещал извлекать контент, если он не находится ниже этого конкретного пути в домене example.com, не позволял переходить в другой домен и ограничивал его содержимым html и pdf.
Следующая конфигурация - то, что я думаю, должно работать, но не
<bean id="longerOverrides" class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
<property name="properties">
<props>
<prop key="seeds.textSource.value">
# URLS HERE
example.com/news/speeches
</prop>
</props>
</property>
</bean>
<bean id="scope" class="org.archive.modules.deciderules.DecideRuleSequence">
<!-- <property name="logToFile" value="false" /> -->
<property name="rules">
<list>
<!-- Begin by REJECTing all... -->
<bean class="org.archive.modules.deciderules.RejectDecideRule">
</bean>
<!-- ...then ACCEPT those within configured/seed-implied SURT prefixes... -->
<bean class="org.archive.modules.deciderules.surt.SurtPrefixedDecideRule">
<!-- <property name="seedsAsSurtPrefixes" value="true" /> -->
<!-- <property name="alsoCheckVia" value="false" /> -->
<!-- <property name="surtsSourceFile" value="" /> -->
<!-- <property name="surtsDumpFile" value="${launchId}/surts.dump" /> -->
<property name="surtsSource">
<bean class="org.archive.spring.ConfigString">
<property name="value">
<value>
example.com/news/speeches
</value>
</property>
</bean>
</property>
</bean>
<!-- ...and REJECT those from a configurable (initially empty) set of URI regexes... -->
<bean class="org.archive.modules.deciderules.MatchesListRegexDecideRule">
<property name="decision" value="REJECT"/>
<property name="listLogicalOr" value="true" />
<property name="regexList">
<list>
<value>.*(?i)(\.(avi|wmv|mpe?g|mp3))$</value>
<value>.*(?i)(\.(rar|zip|tar|gz))$</value>
<value>.*(?i)(\.(xls|odt))$</value>
<value>.*(?i)(\.(xml))$</value>
<value>.*(?i)(\.(txt|conf|pdf))$</value>
<value>.*(?i)(\.(swf))$</value>
<value>.*(?i)(\.(js|css))$</value>
<value>.*(?i)(\.(bmp|gif|jpe?g|png|svg|tiff?))$</value>
</list>
</property>
</bean>
<!-- ...but REJECT those more than a configured link-hop-count from start... -->
<bean class="org.archive.modules.deciderules.TooManyHopsDecideRule">
<!-- <property name="maxHops" value="20" /> -->
</bean>
<!-- ...but ACCEPT those more than a configured link-hop-count from start... -->
<!--bean class="org.archive.modules.deciderules.TransclusionDecideRule"-->
<!-- <property name="maxTransHops" value="2" /> -->
<!-- <property name="maxSpeculativeHops" value="1" /> -->
<!--/bean-->
<!-- ...but REJECT those from a configurable (initially empty) set of REJECT SURTs... -->
<bean class="org.archive.modules.deciderules.surt.SurtPrefixedDecideRule">
<property name="decision" value="REJECT"/>
<property name="seedsAsSurtPrefixes" value="false"/>
<property name="surtsDumpFile" value="${launchId}/negative-surts.dump" />
<!-- <property name="surtsSource">
<bean class="org.archive.spring.ConfigFile">
<property name="path" value="negative-surts.txt" />
</bean>
</property> -->
</bean>
<!-- ...and REJECT those from a configurable (initially empty) set of URI regexes... -->
<bean class="org.archive.modules.deciderules.MatchesListRegexDecideRule">
<property name="decision" value="REJECT"/>
<!-- <property name="listLogicalOr" value="true" /> -->
<!-- <property name="regexList">
<list>
</list>
</property> -->
</bean>
<!-- ...and REJECT those with suspicious repeating path-segments... -->
<bean class="org.archive.modules.deciderules.PathologicalPathDecideRule">
<!-- <property name="maxRepetitions" value="2" /> -->
</bean>
<!-- ...and REJECT those with more than threshold number of path-segments... -->
<bean class="org.archive.modules.deciderules.TooManyPathSegmentsDecideRule">
<!-- <property name="maxPathDepth" value="20" /> -->
</bean>
<!-- ...but always ACCEPT those marked as prerequisitee for another URI... -->
<bean class="org.archive.modules.deciderules.PrerequisiteAcceptDecideRule">
</bean>
<!-- ...but always REJECT those with unsupported URI schemes -->
<bean class="org.archive.modules.deciderules.SchemeNotInSetDecideRule">
</bean>
</list>
</property>
</bean>
Я ожидал, что при сканировании будет сброшено всего около десятка HTML-документов, поскольку это все, что содержится в пути / speech. Примерно через полчаса я прекратил сканирование, когда он загружал более 800 документов, и обнаружил, что он перемещается назад до путей родительского уровня. Я также экспериментировал с правилами RegEx без удачи. Любая помощь будет оценена.
1 ответ
Одна хорошая вещь для отладки такой проблемы - включить протоколирование решений по объему. (Раскомментируйте строку с logToFile
и сделать это true
, Это предоставит вам для каждого URI правило, которое приняло решение включить или отклонить его. Таким образом, вы сможете увидеть, какое из ваших правил не настроено должным образом и принимает URI, который должен был быть отклонен.