Web Crawler usando el nuevo AjAgents

Hace poco escribí una nueva implementación de mi proyecto AjAgents, descripta en:

AjAgents: a new implementation
AjAgents: una nueva implementación

Ahora, quiero describir una aplicación de prueba, de nuevo el Web Crawler: visitar y bajar la página desde una URL inicial, ir descubriendo enlaces al mismo sitio, y procesar el resto de las páginas. Anteriores versiones:

Web Crawler Using Agents and AjSharp
Web Crawler usando AjSharp
Distributed Web Crawler using AjMessages
Web Crawler distribuido usando AjMessages

La nueva versión del web crawler usa la nueva interface:

    public interface IAgent<T>
    {
        void Post(Action<T> action);
    }


En vez de escribir un tipo que hereda o implementa un agente, éste es un “wrapper” aplicado a un tipo normal cualquiera de .NET.



La nueva implementación de AjAgentes, y el ejemplo de web crawler (Proyecto AjAgents.WebCrawler), puede ser bajado desde:



http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/AjAgents



En una de mis anteriores implementaciones tenía:





Ahora, descarté el Dispatcher. Tengo tres clases:







El Resolver recibe un enlace a bajar y procesar. Decide si lo procesa o no (puede que el enlace ya haya sido procesado, o que el link no corresponda al sitio de partida, o se alcanzó un límite en la profundidad de enlaces desde la página inicial de proceso). Si el enlace es aceptado, la inforación es enviada al Downloader. Este objeto baja el contenido de la página, y lo envía al Harvester (podría enviarlo a otros agentes, también). El Harvester examina el contenido, extrae nuevos enlaces para procesar, y a cada uno lo envía al Resolver.



Estas clases son tipos .NET. Pero las referencias que mantienen entre sí son del tipo Agent<Downloader>, Agent<Harvester>, Agent<Resolver>. El código que arma un grupo inicial de objetos/agentes interconectados está en Program.cs:



       static Agent<Resolver> MakeAgent()
        {
            Resolver resolver = new Resolver();
            Harvester harvester = new Harvester();
            Downloader downloader = new Downloader();
            Agent<Resolver> aresolver = new Agent<Resolver>(resolver);
            Agent<Harvester> aharvester = new Agent<Harvester>(harvester);
            Agent<Downloader> adownloader = new Agent<Downloader>(downloader);
            resolver.Downloader = adownloader;
            harvester.Resolver = aresolver;
            downloader.Harvester = aharvester;
            return aresolver;
        }


 



La aplicación de consola AjAgents.WebCrawler aceptar un parámetro, con el enlace inicial:



AjAgents.WebCrawler http://ajlopez.zoomblog.com



Su salida:





Este ejemplo es un “proof of concept”. Me gustaría mejorarlo:



- Agent<IDownloader>, que haga balanceo de carga con varias instancias de Agent<Downloader>.
- Agent<T> instanciado en diferentes máquinas, implementando así un web crawler distribuido.



Nos leemos!



Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

This entry was posted in 12677, 1389, 7338. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>