Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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:
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().
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.
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.