Está en la página 1de 4

Recuperacin y Acceso a la Informacin

Implementacin de un Crawler Bsico


Objetivo
Creacin de un crawler sencillo para obtener documentos de la Web (pginas HTML) y construir un corpus documental sobre el que funcionar el motor de bsqueda.

Requisitos
El crawler se desarrollar en C#, y se deber implementar una librera con toda la funcionalidad. Esta librera ser utilizada posteriormente por el motor de bsqueda. Las URLs que el crawler visita debern almacenarse con un mecanismo de persistencia. Para ello, se utilizar una base de datos SQLite en la que almacenar toda la informacin relevante de crawling. Adems, el contenido de las pginas deber almacenarse en un directorio del disco duro.

Recursos
Se entrega una solucin de Visual Studio 2005 con el cdigo base, en el cual habr que rellenar varios huecos. La solucin contiene un proyecto llamado RAI.Crawler, que es la librera con toda la funcionalidad del crawler, y otro proyecto llamado Run, que se usar simplemente para instanciar un crawler e iniciarlo. Adems, se incluye tambin la librera System.Data.SQLite, para trabajar con la base de datos desde el crawler. Tambin, se entrega una pequea herramienta con GUI para manipular manualmente el contenido de la base de datos.

Estructura
La estructura del crawler se muestra a continuacin:

Recuperacin y Acceso a la Informacin


La clase Uri2 nos servir como contenedor de las URLs que se visiten, conteniendo cierta informacin de control necesaria para el proceso. Cada instancia deber corresponderse con una fila de la base de datos. Tanto las instancias como las filas de la base de datos contienen: Id: identificador de la URL (clave primaria en la tabla de la base de datos). Uri: URL correspondiente. Parent: identificador de la URL de la pgina que contena el enlace a esta pgina. Las URLs semilla no tienen Parent. Level: nivel de la pgina en el correspondiente rbol de enlaces (siempre uno ms que el padre). El nivel de las URL semilla ser 1. Cache: path del archivo local que contiene el contenido de la pgina. Success: estado de la URL. Null si no se ha procesado, y true o false dependiendo de si se proces bien o hubo algn error.

La clase Uri2 provee 3 formas de construir instancias: CreateSeed, para crear URLs que se usarn como semilla en el proceso de crawling. CreateFromDatabase, para instanciar las URLs que se lean de la base de datos. CreateCustom, para crear URLs nuevas sacadas de los enlaces de alguna pgina.

IUriProvider especifica las operaciones del mecanismo de persistencia a usar. Habr que inicializarlo primeramente, y despus se le podrn pedir URLs para procesar con GetUri(), se podrn aadir URLs nuevas con AddUri(Uri2) y se actualizarn despus de ser procesadas con Update(Uri2). En nuestro caso, SQLiteUriProvider ser la clase encargada de ofrecer persistencia con la base de datos. Contiene una conexin a la misma y tres comandos SQL, uno para cada operacin. La clase Settings se usa para encapsular la configuracin del crawler, que se guarda en un archivo XML. Contiene 3 parmetros: DBFile: path al archivo de la base de datos SQLite. DownloadAttempts: nmero mximo de intentos para bajar una pgina. MaxLevels: nmero mximo de niveles por los que navegar en el rbol de enlaces.

La clase Crawler es la encargada de juntar todo lo anterior. Contiene una configuracin en _settings, y un proveedor de URLs en _uriProvider. Deber instanciarse con el path del archivo de configuracin. Se podr usar para aadir semillas con la operacin AddSeed(string), y se iniciar el proceso de crawling con el mtodo Start(). Adems, internamente, ofrece la operacin GetCacheFilename(), que se encargar de devolver un path nico para guardar el contenido de la pgina correspondiente. La estructura local de archivos estar formada por 100 directorios, del 00 al 99. Dentro de cada uno, estarn los archivos correspondientes a las caches de las pginas. Cuando se pida un nombre de archivo con el mtodo GetCacheFilename(), se escoger uno de los directorios aleatoriamente y despus un archivo con nombre nico dentro del mismo.

Partes a Completar
Se debern completar los tres constructores de Uri2. Tambin la operacin Update(Uri2) del SQLiteUriProvider. Dentro de la clase Crawler, debe inicializarse el _uriProvider en el constructor, e implementar las operaciones AddSeed(string), Start() y GetCacheFilename().

Recuperacin y Acceso a la Informacin

Discusin e Implementacin de Mejoras


Uso del Crawler en la Asignatura
El crawler que se desarrolla se usar para obtener documentos y crear un repositorio local que servir de base para el motor de bsqueda. Como se trata de una prueba de concepto, y no de un sistema a gran escala, las semillas que se darn al crawler sern pginas que nos proporcionen documentos relevantes, en principio, para nuestros propsitos. El motor de bsqueda de las siguientes prcticas se evaluar con una serie de consultas. La forma que vamos a tener de obtener documentos relevantes es utilizar Google como ayuda. De esta forma, al crawler se le dar una semilla por cada una de las consultas que se realizarn sobre el motor de bsqueda, y estas semillas sern simplemente consultas sobre Google que nos den documentos relativos a esa consulta. Por ejemplo: si una de nuestras consultas es relativa a la influencia del vino tinto sobre la probabilidad de sufrir un ataque al corazn, la semilla correspondiente podra ser una consulta a Google con los trminos vino tinto ataque corazn. Es decir, la semilla para el crawler sera http://www.google.es/search?q=vino+tinto+ataque+corazn. A partir de ella, el crawler ir navegado por las pginas de resultados que, potencialmente, sern relevantes a la hora de realizar la consulta sobre nuestro motor de bsqueda. Este proceso se repetira por cada consulta que vayamos a evaluar en la asignatura.

Posibles Mejoras
De todas las mejoras que se muestran a continuacin, cada grupo deber implementar al menos una en su crawler, a elegir entre: 1. Captura de enlaces. Muchas pginas no siguen el estndar XHTML, por lo que la sintaxis seguida para los enlaces no es necesariamente <a href="http://...">...</a>. Algunas pginas usan comillas simples (<a href='http://...'>...</a>). Otras no usan delimitadores (<a href=http://...>...</a>). Adems, es posible que las URLs de inters estn incrustadas dentro de otras (por ejemplo con Google): <a href="http://origen.es/redirige.php?destino=http://destino.es/pagina.html">...</a> . Incluso, puede que la etiqueta est en mayscula: <A Href="...">...</a>. Comprobacin de tipo de documento. No todos los enlaces que aparezcan sern pginas HTML, muchos sern imgenes, documentos PDF, etc. Se podra comprobar cul es el tipo MIME (campo content-type de la cabecera HTTP), y guardar el documento slo si es una pgina HTML. Podra incluso implementarse un pequeo filtro para asegurarse, porque muchos servidores Web no devuelven el tipo MIME correcto. Limitacin del tamao del documento. Puede darse el caso en que una pgina sea demasiado grande (incluso del orden de gigabytes). Se podra limitar el tamao de los archivos a bajar (campo content-length de la cabecera HTTP). Almacenamiento de archivos en memoria. Para no dar demasiado trabajo al disco duro, en lugar de descargar todos los archivos a disco, y despus borrarlos si no nos interesa el documento (ver mejora 2), podra almacenarse en un buffer de memoria y guardarlo en disco slo si es de inters, incluso considerando lmites de tamao en el buffer (ver mejora 3). Tratamiento especfico de semillas. Dado que las semillas sern consultas a Google, se podran tratar de forma especfica para capturar enlaces a documentos, ignorar los enlaces a bsquedas en otros servicios (News, Books, Youtube, etc), navegar por las pginas de resultados, etc. Peticiones avanzadas. Para evitar que los sites se den cuenta de que les est visitando un crawler, se pueden hacer peticiones ms avanzadas. Por ejemplo, incluir el campo user-agent con informacin del sistema del cliente (sistema operativo, navegador, etc.), uso del campo referer, utilizacin de las cookies del servidor, etc. Tambin se pueden controlar las redirecciones que un servidor intente hacer ante una peticin, o hacer peticiones cada cierto tiempo, para evitar sobrecargar los servidores. Uso de varios protocolos. Puede haber resultados con protocolos diferentes a HTTP, por ejemplo FTP o HTTPS. Se podran incluir estos documentos tambin, incluso permitiendo que el certificado de un site HTTPS no sea vlido. Control de duplicados. Puede que un mismo documento corresponda a URLs diferentes. Podra controlarse esto mediante algn campo UNIQUE en la base de datos que no permita insertar duplicados (esto ya se hace con el campo Uri). Por ejemplo, se podra calcular el hash MD5 de los documentos. 3

2.

3.

4.

5.

6.

7.

8.

Recuperacin y Acceso a la Informacin


9. Normalizacin de URLs. Podran tratarse como idnticas URLs que cambien slo en el orden de sus parmetros. Por ejemplo http://dev.es/show.php?id=34&order=author es equivalente a http://dev.es/show.php?order=author&id=34. Tambin es posible que aparezcan caracteres de escape en los enlaces: http://es.wikipedia.org/wiki/Espaa se escapara como http://es.wikipedia.org/wiki/Espa%C3%B1a, pero son la misma URL. 10. Tratamiento inteligente de niveles. Si una URL ya est en la base de datos con el nivel mximo permitido, ya no seguir utilizndose para obtener nuevos enlaces. Sin embargo, si aparece repetida, por venir de otra pgina padre (ver mejoras 8 y 9) podra ser con nivel menor. En ese caso, se podra actualizar el nivel en la base de datos para seguir navegando por ella. 11. Distribucin del proceso. Lo normal es que un crawler funcione en varias mquinas y con varios threads. Ello implica implementar ciertos mecanismos de concurrencia para evitar que distintos threads procesen las mismas pginas, intenten guardarlas en el mismo archivo local, etc.

Sugerencias
Para controlar ms las cabeceras y protocolos, se pueden utilizar las clases System.Net.WebRequest y System.Net.WebResponse, que tienen una propiedad Headers. Para utilizar buffers en memoria se puede utilizar la clase System.IO.MemoryStream. Para calcular hashes consultar la clase System.Security.Cryptography.MD5. Para trabajar con certificados de HTTPS, consultar la propiedad ServerCertificateValidationCallback de la clase System.Net.ServicePointManager. Para utilizar threads consultar System.Threading.Thread y la construccin lock the C# para sincronizacin. Para posibles valores del user-agent, mirar http://www.user-agents.org. Para posibles valores del tipo MIME mirar http://www.webmaster-toolkit.com/mime-types.shtml.

Entrega
Deber entregarse la solucin de Visual Studio con el cdigo del crawler de cada grupo, adems de una pequea memoria explicando la mejora implementada. La prctica deber entregarse por Aula Global. El da de la entrega se proceder a la correccin presencial en clase, por lo que todos los grupos debern asegurarse de que su crawler funciona en los ordenadores del aula.

Evaluacin
La primera parte (crawler bsico) se evaluar hasta un mximo de 7 puntos, considerando la correccin de la solucin implementada. La segunda parte (mejoras) se evaluar hasta un mximo de 3 puntos, teniendo en cuenta el nmero de mejoras y su complejidad.

También podría gustarte