Regex + WebClient = mi primer Spider

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 q
ue 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.