Llevo tiempo dándole vueltas a adentrarme en el estudio de una nueva carrera (sí, soy un poco masoquista), aunque la aparición de Bolonia con sus pros y sus contras (más de estos últimos, según parece) me daba que pensar en cuanto a mi decisión. Obviamente, con el trabajo únicamente me puedo plantear estudios a distancia, por lo que acceder a mi más deseada titulación (Biología) queda, de momento, un poco lejos. Ya el año pasado estuve dándole vueltas a los másteres homologados para el EEES (Espacio Europeo de Educación Superior), en concreto a uno de redes y seguridad informática que me llamaba poderosamente la atención. Sin embargo, y mientras nuestra titulación no obtenga por parte de quienes gobiernan la deferencia que merecen, y se nos otorguen las atribuciones (es decir, tanto obligaciones como derechos) que deberíamos ostentar creo que dejaré correr lo del máster y, a lo sumo, me adentraré en algún estudio por el mero placer de aprender.

En fin, volviendo a lo que iba, este fin de semana he estado mirando alguna información sobre los Grados que empiezan a impartirse este curso académico, y algunos de los que se iniciarán en el próximo, siempre en la UNED. Además de las guías de la carrera y las de cada asignatura, resulta interesante echar un vistazo a los exámenes de años anteriores, para hacerse a la idea del nivel que alcanzan los conocimientos esperados y los contenidos que entran en juego a la hora de evaluar nuestro trabajo.

Uno de los centros asociados más interesantes a este respecto es el de Calatayud, que cuenta en su página web con un depósito de exámenes realmente apabullante. Accedemos a la carrera deseada, marcamos las asignaturas de las que queremos consultar los exámenes y tenemos ante nosotros los correspondientes a los últimos años (desde 2005 en adelante). Según sea la carrera, pueden rondar cerca de los mil exámenes en total para cada una de ellas. Los exámenes aparecen en PDF, y se pueden descargar o visualizar simplemente con pulsar sobre el enlace correspondiente. Así que nada, me dispuse a descargar unos pocos y aunque sólo quería los de los últimos años, el proceso era harto engorroso: “Botón derecho->Guardar enlace cómo…->Aceptar” y con Google Chrome, en el mejor de los casos (ya que descarga los PDF directamente) ir pulsando en cada enlace. Cuando llevaba unos pocos, como habréis imaginado, me he dicho: ¿por qué no hago un programita para automatizar esto? Dicho y hecho, se tarda menos en ello que en descargar los exámenes de una asignatura. El programa no es nada del otro mundo, y lo cierto es que tiene poco interés, pero ya que está hecho, me he dicho: ¿por qué no divago un poco en el blog y dejo el código fuente?

C#:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. using System.Net;
  7. using System.IO;
  8.  
  9. namespace Lobosoft.Utilidades
  10. {
  11. public class Downloader
  12. {
  13. WebClient webClient = new WebClient();
  14. Regex urlRegEx = new Regex(@"(((f|ht){1}tp://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)");
  15.  
  16. ///
  17. /// Descarga los archivos apuntados por los enlaces al path indicado.
  18. ///
  19. ///
  20. La lista de enlaces.   ///
  21. La ruta donde descargarlo.   public void GetLinksContent(string html, string extension, string outputPath)
  22. {
  23. string filename;
  24.  
  25. foreach (string url in GetLinksUrl(html, extension))
  26. {
  27. filename = url.Substring((url.LastIndexOf('/') + 1), url.Length - url.LastIndexOf('/') - 1);
  28. webClient.DownloadFile(url, Path.Combine(outputPath , filename));
  29. }
  30. }
  31.  
  32. // Obtiene todas las URL dentro de los enlaces existentes en la web cuyo código HTML examinamos
  33. List GetLinksUrl(string htmlSource, string extension)
  34. {
  35. List links = new List();
  36.  
  37. // Obtiene todas las URL de la web
  38. foreach (Match match in urlRegEx.Matches((htmlSource)))
  39. {
  40. //Pero únicamente agrega aquellas que terminen con la extensión dada.
  41. // Podría sustituirse la expresión regular en tiempo de ejecución para devolver únicamente
  42. // las que nos interesan, pero así puede quedar algo más genérico.
  43. if (match.Value.EndsWith(extension))
  44. {
  45. links.Add(match.Value);
  46. }
  47. }
  48.  
  49. return links;
  50. }
  51. }
  52. }

Como veis, no tiene demasiado misterio. Un método, GetLinksUrl() se encarga de buscar en el código HTML de la página las URLs que contenga, y lo devuelve como una lista de enlaces a GetLinksContent(), que se encarga de ir recorriéndola y descargando los archivos a una determinada carpeta que habremos creado previamente. La llamada a este método se llevaría a cabo con el código fuente de la página en cuestión. Podemos haberlo leído de un archivo local, o bien recuperarlo de Internet mediante un WebClient (con su método estático DownloadString(url)), o si lo usamos desde una aplicación Windows, utilizando un objeto WebBrowser y accediendo a su propiedad DocumentText en un momento determinado). El misterio (o no tanto) estará en saber de qué carrera ando buscando información ;)

Bueno, y ahora, a hacer lo mismo en Python. Estoy mirando una librería, PycURL, que pinta bastante bién, y vamos a ver si consigo lograrlo. Si me pongo a ello os contaré algo por aquí, claro está. ¡Vamos a ello!


Entradas relacionadas:
  • La gacela encontradiza
  • Error 404… ¡no!
  • Protección ante XSRF
  • Control de acceso de un usuario en ASP.NET
  • ¿Cómo saber si Google ha pasado a indexar nuestra web?
  • Etiquetas: , , ,