|
Regex + WebClient = mi primer Spider
Publicado: 09/02/2007
Leído: 5315 veces
Lectura: 0 minutos
|
Categoría: C#
Valoracion: 2,166667
|
|
Sólo como curiosidad y nunca para que lo useis en la práctica, en este artículo veremos cómo averiguar los enlaces salientes que tiene una página.
Dicho de otro modo, lo que haremos será descargarnos el contenido de una página determinada y ubicarlo en un string. Luego, utilizaremos expresiones regulares (ver artículos expresiones regulares y uso de expresiones regulares en ASP.NET) para determinar el contenido del atributo "href" dentro del tag de enlazado "a".
Veamos el código:
/// <summary> /// Función que hace las veces de robot o spider /// </summary> /// <param name="url"></param> /// <returns></returns> private static string spider(Uri url) { // Expresión regular que lee el contenido del href string pattern_Href = @"(?<=<a[^<>]+href=""?)[^""<>]+(?=""?[^<>]*>)";
// Recogemos el contenido de la url como un string string html = getHTML(url);
// Recogemos la colección de resultados que nos da Regex MatchCollection col = Regex.Matches(html, pattern_Href, RegexOptions.IgnoreCase);
StringBuilder sb = new StringBuilder(); // Añadimos al stringbuilder cada uno de los resultados foreach (Match match in col) { sb.Append(match.Value); sb.Append("<br />"); }
return sb.ToString(); }
/// <summary> /// Recoger el contenido de una Uri como string /// </summary> /// <param name="url"></param> /// <returns></returns> private static string getHTML(Uri url) { // Absolutamente sencillo!! WebClient wc = new WebClient(); return wc.DownloadString(url); }
/// <summary> /// Recoger el contenido de una Uri como string de forma más trabajada /// </summary> /// <param name="url"></param> /// <returns></returns> private static string getHTML2(Uri url) { string retorno = string.Empty;
// Creamos un HttpWebRequest HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); try { // Recogemos la respuesta using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { // Leemos el resultado de "Status Code" if (response.StatusCode == HttpStatusCode.OK) { // Tampoco es demasiado difícil leer el contenido como un string ;) StreamReader sr = new StreamReader(response.GetResponseStream()); retorno = sr.ReadToEnd(); } } } catch { retorno = string.Empty; }
return retorno; }
Como vemos, el código se explica a sí mismo.
Los puntos más importantes son: - La expresion regular pattern_Href... esta me la he inventado yo, pero seguramente habrá mejores. - La recogida de la url como un string. Vemos que hay dos modos de hacerlo. El más sencillo simplemente sirve para lo que sirve y poco más... el más complejo se asegura de que la Web a la que intentamos acceder existe y además devuelve un código "200 OK", es decir que es correctamente legible.
|
Ante cualquier duda o sugerencia sobre este artículo, coméntalo en el
foro de ASP.NET
de nuestra Web Amiga sobre
asp.net
|