¿No os ha pasado que según en qué foro o tutorial leáis os dicen una u otra forma de cómo configurar nutch para hacer recrawl de las páginas? Pues a mí sí...
En un primer momento intenté llamar a la clase Crawl con la opción de -addDays, después de unos días me dí cuenta de que no hacía mucho caso.
Después vino la gran idea de crearme mi propia clase Crawl y a la hora de hacer el fetch, establecer el tiempo como el actual más 7 días, por ejemplo. Tampoco me hizo mucho caso.
Y finalmente, ¡creo que he encontrado la solución más práctica y que funciona!
Realmente es tan simple como realizar unos cambios en la configuración de nutch. Esto es lo que deberíais añadir en el archivo nutch-site.xml.
<property> <name>db.fetch.interval.default</name> <value>2592000</value> <description>The default number of seconds between re-fetches of a page (30 days). </description> </property> <property> <name>db.fetch.interval.max</name> <value>7776000</value> <description>The maximum number of seconds between re-fetches of a page (90 days). After this period every page in the db will be re-tried, no matter what is its status. </description> </property> <property> <name>db.fetch.schedule.class</name> <value>org.apache.nutch.crawl.AdaptiveFetchSchedule</value> <description>The implementation of fetch schedule. DefaultFetchSchedule simply adds the original fetchInterval to the last fetch time, regardless of page changes.</description> </property> <property> <name>db.signature.class</name> <value>org.apache.nutch.crawl.TextProfileSignature</value> <description>The default implementation of a page signature. Signatures created with this implementation will be used for duplicate detection and removal. Default: org.apache.nutch.crawl.MD5Signature</description> </property>
Una breve explicación de estas tres propiedades:
- db.fetch.interval.default: Segundos ha transcurrir entre re-fetches de una página. El valor por defecto es 30 días.
- db.fetch.interval.max: Tiempo máximo en segundos a transcurrir entre re-fetches de una página. Cuando pase este tiempo, las páginas volverán a ser obtenidas sin importar su estado. El valor por defecto es de 90 días.
- db.fetch.schedule.class: Esta propiedad indica la implementación del fetch schedule que se utilizará. La implementación por defecto es la proporcionada por DefaulFetchSchedule.
- db.signature.class: clase que generará la firma de la página.
Cambiando el valor a org.apache.nutch.crawl.TextProfileSignature conseguimos que la firma se haga únicamente teniendo en cuenta el contenido de la página.
En cuanto a las implementaciones del fetch schedule, hay dos opciones: org.apache.nutch.crawl.DefaultFetchSchedule y org.apache.nutch.crawl.AdaptiveFetchSchedule (éste último es el que he decidido utilizar en mi proyecto).
DefaultFetchSchedule es una buena elección si casi todas las páginas que visita el crawler cambian con la misma frecuencia ya que simplemente añade una constante (db.fetch.interval.default) al tiempo actual para establecer la siguiente fecha de obtención de la página. Es decir, si se establece db.fetch.interval.default a 10 minutos, se volverán a recoger todas las páginas cada 10 minutos.
AdaptiveFetchSchedule por el contrario, tiene en cuanta la frecuencia con que cambian las páginas a obtener. En resumen lo que hace es, si la página ha cambiado, reducir el intervalo de tiempo hasta la próxima obtención y, si no ha cambiado, lo aumenta. De esta forma las páginas que cambien frecuentemente serán visitadas con mayor frecuencia por el crawler.
Si se decide utilizar AdaptiveFetchSchedule hay algunas propiedades más que podemos cambiar a nuestro gusto. De nuevo, habría que añadirlas al nutch-site.xml.
<property> <name>db.fetch.schedule.adaptive.inc_rate</name> <value>0.4</value> <description>If a page is unmodified, its fetchInterval will be increased by this rate. This value should not exceed 0.5, otherwise the algorithm becomes unstable.</description> </property> <property> <name>db.fetch.schedule.adaptive.dec_rate</name> <value>0.2</value> <description>If a page is modified, its fetchInterval will be decreased by this rate. This value should not exceed 0.5, otherwise the algorithm becomes unstable.</description> </property> <property> <name>db.fetch.schedule.adaptive.min_interval</name> <value>60.0</value> <description>Minimum fetchInterval, in seconds.</description> </property> <property> <name>db.fetch.schedule.adaptive.max_interval</name> <value>31536000.0</value> <description>Maximum fetchInterval, in seconds (365 days). NOTE: this is limited by db.fetch.interval.max. Pages with fetchInterval larger than db.fetch.interval.max will be fetched anyway.</description> </property> <property> <name>db.fetch.schedule.adaptive.sync_delta</name> <value>true</value> <description>If true, try to synchronize with the time of page change. by shifting the next fetchTime by a fraction (sync_rate) of the difference between the last modification time, and the last fetch time.</description> </property> <property> <name>db.fetch.schedule.adaptive.sync_delta_rate</name> <value>0.3</value> <description>See sync_delta for description. This value should not exceed 0.5, otherwise the algorithm becomes unstable.</description> </property>


5 comentarios:
Hola, he seguido tus indicaciones pero tengo un problema. Siempre que pasa el intervalor por defecto me actualiza las páginas, incluso si no han estado modificadas. Te ocurre los mismo?? Porque yo solo quiero que las indexe de nuevo si han estado modificadas. Tengo puesto que solo haga la firma con el texto (sin el header http).
No sé si exactamente será este tu problema, pero por lo que he entendido de tu comentario el problema viene con el valor de db.fetch.interval.max.
Ten en cuenta que cuando pasen los segundos indicados en esa propiedad la página se volverá a rastrear, se haya o no modificado. No estoy segura de que pueda desactivarse esa opción simplemente con la configuración, pero si encuentro algo te avisaré.
Suerte
Esa seria una opción, pero no es lo que me pasa. Tengo puesto el db.fetch.interval.max a 90 dias en segundos.
Cuando uso el script para indexar, cuando hago el "generate crawl/crawldb crawl/segments -adddays 2" me encuentra para indexar la única página html que tengo, que ya habia sido indexada y que no ha sido modificada. Por lo tanto como el adddays es de 2 dias y el maximo del intervalo es de 90, no me la tendria que volver a indexar hasta de aqui a 90 dias.
Por eso pienso que a lo mejor el nutch no me detecta que la página no ha sido modificada.
Uso nutch 1.2 Tu que script utilizas para reindexar la web?
Gracias!!
Yo ahora utilizo nutch 1.0 por problemas de compatibilidad de lucene, pero creo que no me ha pasado nunca lo que comentas. Has mirado después de hacer todos los pasos, al menos hasta el update del crawldb a ver qué te deja escrito en el crawldb?
Quizás en el generate te genera la web pero luego no hace el fetch.. Aunque realmente sólo estoy divagando...
Prueba a seguir todos los pasos y luego haz un dump del crawldb y mira si realmente te la ha actualizado o simplemente te la ha marcado como sin cambios.
Hola, estoy buscando la manera para reanudar el crawler después de haber sido interrumpido, espero me puedas apoyar, saludos
Publicar un comentario