Cómo configurar la dirección de almacenamiento de archivos del rastreador Crawler4j
Hay muy pocos artículos en línea sobre el uso de Crawler4j. Google no sabe casi nada al respecto y solo puede modificarlo de acuerdo con el código fuente de Crawler4j. La característica más importante de este rastreador es que es simple y fácil de usar y ni siquiera proporciona una API. Al principio realmente no podía acostumbrarme. Afortunadamente, se proporcionan algunos ejemplos en su código fuente. Para aplicaciones generales, sus ejemplos se pueden modificar directamente.
El método de uso es muy sencillo, basta con abrir el proyecto directamente con Eclipse. Puede ver tres ejemplos de demostración en src. Hablemos del ejemplo más simple.
Utilice la clave de Crawler4j para heredar la clase WebCrawler e implementar su propia clase de rastreador MyCrawler y luego reescriba varias funciones de WebCrawler según sea necesario.
public boolean mustVisit(WebURL url) //Realiza análisis de páginas web según la URL y rastrea páginas web que devuelven VERDADERO.
visita pública vacía(Página) // Analiza el contenido de la página. La clase Page contiene un rico conjunto de métodos que se pueden utilizar para obtener el contenido y las propiedades de la página.
Paquete de rastreadores
Crawler.CrawController controla los rastreadores, primero agrega semillas, luego abre varios rastreadores y monitorea continuamente el estado de supervivencia de cada rastreador.
Rastreador Crawler.WebCrawler
1.Run(): bucle constante, obtiene 50 URL de Frontier cada vez y, para cada URL, ejecuta ProcessPage(curUrl).
2.processPage(curURL): use PageFetcher.fetch para rastrear la página. Si curURL tiene una redirección, agregue la URL de la redirección a Frontier y prográmela más tarde si el rastreo es normal; analice primero, genere la página y coloque la nueva URL en Frontier (en este momento, determine la profundidad de la URL recién agregada) y llame a visit(Page) {operación definida por el usuario}.
Crawler.Configurations lee información de crawler4j.properties
Crawler.PageFetcher inicia IdleConnectionMonitorThread y llama a fetch(Page, ignoreIfBinary) para rastrear una sola página. Esta es una clase estática.
Crawler.Page una página
Crawler.PageFetchStatus se utiliza para la configuración del rastreo de una sola página, como devolver el significado del número de estado de rastreo, etc.
Crawler.HTMLParser analiza el código fuente HTML y lo almacena en Page.
Crawler.LinkExtractor extrae todos los enlaces contenidos en una página HTML.
Crawler.IdleConnectionMonitorThread se usa para escuchar el conector (usado para enviar solicitudes de obtención para obtener la página), y su connMgr es responsable de las solicitudes HTML. Frontier
Init() (si se puede reanudar), lee la URL procesada desde env y la reenvía a inicio, ScheduleAll la agrega a la cola de trabajos programados.
Frontier.workQueues (workueue) Una colección de páginas pendientes. Si es recuperable, la base de datos (PendingURLsDB) en el entorno correspondiente se abrirá en el momento de la compilación para recuperar las URL no procesadas que quedaron de la última vez.
Frontier.inprocessPages (páginas en proceso) Una colección de páginas que se están procesando actualmente, heredadas de workQueues y almacenadas en la base de datos InProcessPagesDB.
Frontier.DocIDServer corresponde a la base de datos DocIDs, que registra las URL de las páginas que se han visto.
Proceso de procesamiento: newurl-->workQueues-->inprovessPages-->eliminar
El paquete de software Robotstxt se utiliza para determinar si la URL está permitida.
Paquete de software util, utilizado para proporcionar algunas herramientas pequeñas.
Nota:
1. La profundidad de la página semilla es 0.
La deduplicación de 2.url utiliza DocIDServer.newdocid(url). Si el valor es mayor que 0, significa que la URL se ha visto antes. A través de este mecanismo se pueden registrar e identificar todas las páginas vistas anteriormente.
3. Cuando se configura como reanudable, PendingURLsDB y DocID se guardarán después de que se ejecute el programa.
4. Cuando no se configura la opción reanudable, el directorio de inicio correspondiente a env se borrará antes de ejecutar el programa.
------------------------------------------- -- ----------------------------------
Porque experimentos recientes requieren una gran cantidad de Encontré algunos corpus de noticias en línea pero no encontré lo que buscaba, así que decidí escribir un pequeño programa yo mismo. Entonces decidí escribir un pequeño programa para rastrear el New York Times (NYT).
Hay muchos programas de rastreo escritos en Java. Encontré un programa de rastreo de código abierto llamado crawler4j. Este es un rastreador de subprocesos múltiples con funciones relativamente simples y el código fuente es relativamente fácil de entender, porque quiero. Para entenderlo, hice algunas modificaciones en los enlaces capturados por el rastreador y agregué mi propio proyecto directamente en el código fuente de Crawler4j.
Luego proceso las páginas web capturadas y uso la herramienta htmlparser para obtener el título, hora de publicación, descripción, texto y otra información de la noticia. Para organizar mejor esta información, la almacené en un documento XML.
Me tomó dos noches preparar el programa rastreador para ejecutarlo. Encontré varios problemas mientras escribía el programa.
1. En xml, "\n" se usa para representar saltos de línea, mientras que en Windows, "\r\n" se usa para representar saltos de línea, por lo que si guarda el texto que contiene saltos de línea en el xml, convertirá automáticamente "\r" en el carácter de escape " ". Para resolver este problema, puede eliminar directamente "\r" en el texto.
2. El uso de la función String.replaceAll (regex, reemplazo) de Java comete un error de muy bajo nivel, es decir, si el valor de str en sí no se cambia cuando str.replaceAll (regex, reemplazo) es ejecutado, luego cuando desee reemplazar alguna cadena de str. Cuando necesitas reemplazar algunas cadenas en el propio str, str = str.re replaceAll(regex,replacement) La consecuencia de no darte cuenta de este problema es que tienes que pasar mucho tiempo preguntándote qué salió mal con mi programa. la tercera vez Cometí este error por segunda vez y no puedo volver a hacerlo en el futuro.
3. La obtención de recursos de redes extranjeras es demasiado lenta. El programa tardó aproximadamente dos horas en ejecutarse para rastrear 3000 noticias. Es muy lento. Espero abrir más hilos para ver si se puede lograr el efecto. mejorado, si se debe a la velocidad de la red, el efecto puede no ser muy bueno.
------------------------------------------- ----------------------------------
Problema de salida de Crawler4j
He estado buscando este problema en línea durante mucho tiempo, pero no hay una buena solución. El dicho en línea es que este rastreador solo admite el apagado forzado manual. No tuve más remedio que mirar su código fuente yo mismo. Afortunadamente, no tenía mucho código fuente. La solución actual es escribirlo directamente en el código
A. clase edu.uci.ics.crawler4j.crawler.CrawlController
public CrawlController(String StorageFolder) lanza una excepción { p> p>
.
// Crea un nuevo hilo de monitoreo, no sé qué le importa
/ PageFetcher.startConnectionMonitorThread();
}
público
.
//Establece la señal de stop
sign_stop = false;
while (true) {
.
}
//Detener hilo
if(sign_stop){
for (int i = 0; i < rastreadores.size (); i++) {
crawlers.get(i).setStop(true);
}
return;
}
if (!someoneIsWorking) {
.
}
parada vacía pública() {
sign_stop = true;
}
II.edu.uci.ics.crawler4j.crawler.WebCrawler clase
}
parada booleana privada ;
ejecución pública void() {
onStart();
stop = false;
mientras (!stop) {
.
}
}