Web Scraping y XPath (I)

Nuestro problema es simple de enunciar y no tan difícil de resolver ad-hoc, pero extremadamente complejo de solucionar con eficiencia y de forma genérica . Nuestro reto es extraer periodicamente los titulares o contenido específico de una serie de páginas web no colaborativas (no disponen de sistemas de sindicación de contenidos como RSS o similares). Y más en concreto, no sólo queremos poder extraer contenido específico, sino que el objetivo final es que cualquier usuario medio de Internet [1] pueda seleccionar a golpe de ratón la zona a “monitorizar” periódicamente.

Para empezar la discusión, pongamos como ejemplo la siguiente página web: http://www.web-caching.com . Podemos empezar descomponiendo nuestro problema en dos subproblemas: cómo descargar periódicamente el contenido de la web que queremos monitorizar y cómo realizar el scraping (el rascado de la zona exacta a poner en nuestro punto de mira) Continúa leyendo Web Scraping y XPath (I)

Descarga de páginas web con wget

A partir de este mes, estaré inmerso en un trabajo de investigación y desarrollo para obtener mi título de “suficiencia investigadora”. Más adelante comentaré en detalle cuál es el objetivo y en qué consiste este trabajo, pero durante una temporada, escribiré aquí sobre distintas herramientas open-source que integraré en la herramienta final que quiero conseguir como “prueba de concepto”. Una de las herramientas en las que me basaré es el conocido GNU Wget, una utilidad para la descarga no-interactiva de ficheros web. Soporta los protocolos http, https y ftp, así como el uso de proxys http.

Veamos algunas de las más importantes opciones de este versátil comando:

-r Descarga recursiva. Sin más parámetros se seguirán todos los enlaces para descargar de forma masiva todo un site.
-l # : Profundidad de descarga # (cuántos niveles de enlaces se deben seguir)
-x : crear estructura de directorios en el disco duro mapeando la estructura de carpetas del servidor web
-np: (no-parent) al descargar de forma recursiva, no seguir los enlaces que lleven a niveles superiores al inicial en la estructura de carpetas
– N : time-stamping. Esta opción es una de las más importantes si tu intención es descargar periodicamente cierta web y traerte sólo las actualizaciones ocurridas desde la última descarga. Es decir, con esta opción conseguiremos una actualización incremental, con lo que no sólo se ahorra en ancho de banda, ¡sino también en tiempo! Un fichero se marcará para descarga si se cumple alguna de las siguientes condiciones: 1. no tenemos ya un fichero local con el mismo nombre que el archivo a descargar y 2) existe un fichero con el mismo nmbre, pero el archivo remoto fue modificado más recientemente que el local. Para implementar esas condiciones, debemos de conocer la fecha de última modificación tanto del fichero local como del remoto. Esta información se conoce como time-stamps.

Según la documentación, Wget se fija también en cambios en el tamaño del archivo. En caso de diferencia entre el tamaño local y remoto, se descargará el fichero, independientemente de la fecha del time-stamp.

– P : directorio prefijo, es decir, el directorio local de destino a partir del cual se guardarán todos los ficheros remotos que descarguemos. Por defecto es . (el directorio actual).–cookies=on : activar el uso de cookies. Algunas páginas sólo permiten ser visitadas si nuestro navegador dispone de ciertas cookies (generalmente, estas cookies se instalan en una página inicial de login. A partir de ahí, con el login correcto y las cookies cargadas, podremos visitar/descargar cualquier otra página)

–load-cookies=cookie_file : acompaña a la opción anterior. cookie_file es el nombre del fichero de donde wget leerá las cookies que enviará al servidor en cada petición.

–save-cookies=cookie_file : precede o acompaña a la anterior. Con esta opción, podremos visitar una página y guardar sus cookies (las cookies de la página visitada) en nuestro fichero local cookie_file.

–timeout=# : fija un tiempo de # segundos de espera. Si se cumple ese tiempo sin haber conseguido acceder al fichero web remoto, la conexión se dará por terminada. Es equivalente a especificar –dns-timeout, –connect-timeout, y –read-timeout, con un valor #.

Por defecto, wget fija el valor de –read-timeout a 900 segundos. Si ponemos un timeout de 0, deshabilitaremos todos los valores de espera (de timeout).

-R patrón : indica que no queremos descargar ningún fichero cuyo nombre case con el patrón especificado. Por ejemplo -“R aif,au,avi,class,gif,java,jpg,mid,mov,mp3,mpeg,mpg,png,ram,rm,swf,wmv,zip” evitaría la descarga de los ficheros gráficos, de vídeo y música asociados a una página web que estemos descargando.

-o fichero.log : guarda un log de toda la actividad de GNU Wget en el fichero fichero.log.

En DevArticles.com podemos leer un artículo con ejemplos básicos de utilización de algunas de las opciones mencionadas.

Y si queremos experimentar con todas sus posibles opciones por nosotros mismos, en la Universidad de Cornell han preparado un circuito de páginas con distintas opciones y enlaces, para probar GNU Wget y otros web spider. Que os divirtáis!