Web-Crawler con .NET


Para obtener datos de la Web de una forma fácil podemos utilizar la clase WebClient del .NET Framework. Dicha clase tiene dos métodos para recuperar datos: DownloadFile y DownloadData, y sus variantes asíncronas: DownloadFileAsync y DownloadDataAsync.

Como su nombre lo sugiere DownloadFile nos permite guardar un recurso de la web en un archivo, mientras que DownloadData se utiliza para almacenarlo en un arreglo de bytes.

Así por ejemplo podemos usarlos para obtener un archivo de imagen y almacenarlo en disco, o bien mantenerlo en memoria sólo para visualizarlo:

System.Net.WebClient myWebClient = new System.Net.WebClient();
myWebClient.DownloadFile(new Uri(urlTextBox.Text), fileName);
myWebClient.Dispose();

System.Net.WebClient myWebClient = new System.Net.WebClient();
byte[] data = myWebClient.DownloadData(new Uri(urlTextBox.Text));
System.IO.MemoryStream stream = new System.IO.MemoryStream(data);
Bitmap bitmap = new Bitmap(stream);
imgPictBox.Image = bitmap;
myWebClient.Dispose();

Pero si deseamos obtener todas las imágenes a partir una página web, entonces primero tendremos que “rascarla” para obtener las URLs de las imágenes a obtener. Para ello podemos apoyarnos del control WebBrowser.

Nota: Para .NET 1.x utilizar el Objeto COM MSHTML.

myWebBrowser.Navigate(urlTextBox.Text);

En el manejador del evento DocumentCompleted del WenBrowser llamamos al método realice la búsqueda y listado los recursos que nos interesan. En el siguiente fragmento se coloca en un ListBox.

HtmlElementCollection imgs = 
    myWebBrowser.Document.GetElementsByTagName("img"); 
foreach (HtmlElement img in imgs) 
{ 
  try 
  { 
    string imgUrl = img.GetAttribute("src");
      imgsListBox.Items.Add(imgUrl);     
  } 
  catch 
  { 
    continue; 
  } 
}

Finalmente utilizando WebClient guardamos los recursos seleccionados en el ListBox.

DialogResult dr = folderDialog.ShowDialog(); 
if (dr == DialogResult.OK) 
{   
  foreach (string imgUrl in imgsListBox.SelectedItems)   
  {     
    System.Net.WebClient myWebClient = new System.Net.WebClient();
    string fileName = folderDialog.SelectedPath + "\\" + getFileName(imgUrl);
    myWebClient.DownloadFileAsync(new Uri(imgUrl), fileName);
    myWebClient.Dispose();
  } 
}

TODO: (Tarea para el lector) Validar las URL de entrada, verificando/limpiando caracteres inválidos. Así mismo manejar el caso cuando no se encuentra el recurso.

web-crawler

Esta es la forma fácil. Pero para un mayor control y rendimiento podríamos utilizar las clases HttpWebRequest/Response (o bien Sockets) y emplear hilos para la comunicación. Pero para prescindir del WebBrowser tendríamos que crear nuestro propio Analizador HTML ya que el .NET Framework no lo tiene. Esto último sería muy útil, pero ya será para otro día…

Acerca de Willy Mejia

Developer, Techie, Human... http://about.me/willyxoft
Esta entrada fue publicada en .NET, Informática e Internet. Guarda el enlace permanente.

4 respuestas a Web-Crawler con .NET

  1. Fer dijo:

    Como prodría se algo similar a esto pero en visual basic .net, osea digo utilizar algo parecido a al WebBrowser y poder declarar variables tipo HtmlElementCollection , para poder recorrer el html y leer los tags?

    • Willy Mejia dijo:

      De hecho lo que ilustro aquí para C# sería lo mismo para VB.NET, con los respectivos cambios de sintaxis por el lenguaje.
      Ahora bien, ésta es la forma “´fácil y rápida” que aprovecha componentes y clases del .NET Framework. Pero para algo más ad-hoc que prescinda del WebBrowser tendríamos entonces que buscar un Analizar HMTL de terceros, o bien darnos a la tarea de hacer uno por nuestra cuenta.
      Saludos.

  2. Hola. Me ha gustado mucho tu articulo. Estoy trabajando en algo parecido y ando un poco perdido. Podrias ayudarme a como iniciar un Analizador HTML? He visto analizadores de terceros, pero no me convencen y necesito controlar muchas mas cosas. Por eso he decidido crear el mio propio, pero no se por donde empezar.
    Gracias.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s