Manual de Periodismo de Datos 1.0
Cargando

Obtener datos de la red

Ha probado todo y no ha logrado obtener los datos que quiere. Encontró los datos en la red pero lamentablemente no hay opciones de descarga y fracasó en el intento de copiar y pegar. No tema, aún puede haber una manera de obtener los datos. Por ejemplo, puede:

  • Obtener datos de APIs (interfaces de programación de aplicaciones) online, tales como interfaces provistas por bases de datos y muchas aplicaciones modernas (incluyendo Twitter, Facebook y otras). Esta es una manera fantástica de acceder a datos oficiales o comerciales, así como datos de redes sociales.

  • Extraer datos de PDF. Esto es muy difícil, dado que PDF es un lenguaje para impresoras y no retiene mucha información sobre la estructura de los datos presentados en el documento. Extraer información de PDF va más allá del alcance de este libro, pero hay algunas herramientas y tutoriales que pueden ayudarlo a hacerlo.

  • Usar "screen scraping" para obtener datos de sitios de la red. Se trata de extraer contenido estructurado de una página normal de la red con la ayuda de un programa de de recuperación de información o escribiendo una pequeña pieza de software. Si bien este método es muy poderoso y puede ser usado en muchos lugares, requiere comprender un poco cómo funciona la red.

Con todas esas opciones técnicas, no olvide las opciones simples: a menudo vale la pena invertir un poco de tiempo en buscar un archivo con datos que pueden ser interpretados por una computadora o llamar a la institución que tiene los datos que usted quiere.

En este capítulo presentamos un ejemplo muy básico de scrapear datos de una página HTML.

¿Qué son los datos procesables por computadora?

Para la mayoría de estos métodos, el objetivo es obtener acceso a datos que puedan ser nterpretados por una computadora. Tales datos son creados para ser procesados por una computadora en vez de ser presentados a un usuario humano. La estructura de estos datos se relaciona con la información contenida en ellos, y no la manera en que será presentada eventualmente. Entre los ejemplos de formatos que son fáciles de interpretar por una computadora se incluyen CSV, XML, JSON, y los archivos Excel, mientras que formatos como los de documentos Word, páginas HTML, y archivos PDF están más relacionados con la presentación visual de la información. Por ejemplo, PDF es un lenguaje que le habla directamente a su impresora; le interesa la posición de líneas y puntos en una página, en vez de caracteres distinguibles.

===="Scrapear" sitios de la red: ¿Para qué?

Todos lo han hecho: se va a un sitio de la red, uno ve una tabla interesante y trata de copiarla a Excel de modo de poder agregar algunas cifras o guardarla para después. Pero a menudo esto no funciona realmente, o la información que quiere está desparramada en una gran cantidad de sitios. Copiar a mano se puede volver rápidamente muy tedioso, por lo que tiene sentido usar un poco de código para hacerlo.

La ventaja del "scraping" es que se puede hacer prácticamente con cualquier sitio, desde el pronóstico del tiempo hasta el gasto gubernamental, incluso si el sitio no tiene una API para acceso a los datos en crudo.

Lo que se puede y lo que no se puede "scrapear"

Por supuesto, hay límites a lo que se puede_scrapear_. Entre los factores que dificultan scrapear en un sitio se incluyen:

  • Código HTML mal formateado con poco o nada de información estructural (por ejemplo, sitios oficiales más antiguos).

  • Los sistemas de autenticación que se supone impiden el acceso automático (códigos CAPTCHA y exigencia de suscripción paga).

  • Sistemas basados en sesiones que usan cookies de navegador para rastrear lo que hace el usuario.

  • Falta de listados completos de ítems y ausencia de posibilidades de búsquedas con comodines.

  • Bloqueado de acceso por administradores de servidores.

Otro conjunto de limitaciones son las barreras legales: algunos países reconocen los derechos de bases de datos, lo que puede limitar su derecho a reutilizar información que ha sido publicada online. A veces se puede ignorar la licencia y usarla de todos modos, dependiendo de su jurisdicción, puede tener derechos especiales como periodista. No debería haber problema en "scrapear" datos del estado de libre disponibilidad, pero quizás sea mejor cerciorarse antes de publicarlos. Organizaciones comerciales -–y ciertas ONGs-- reaccionan con menos tolerancia y pueden tratar de sostener que usted está “saboteando” sus sistemas. Otras informaciones pueden violar la privacidad de individuos, y por tanto, violar las leyes de privacidad de datos o la ética profesional.

Emparchar, "Scrapear", compilar, limpiar

El desafío con muchos datos británicos no es lograr obtenerlos, si no ponerlos en un formato que se pueda usar. Se publican muchos datos sobre hospitalidad, los intereses de los parlamentarios fuera de su función pública, lobbys, y más como cosa habitual, pero en formatos difíciles de analizar.

Para algunos datos, la única alternativa es el trabajo duro: unir docenas de archivos Excel, cada uno conteniendo solo una docena de registros, fue la única manera de hacer listas completas de reuniones ministeriales. Para otros datos, "scrapear" la red se demostró increíblemente útil.

Usar un servicio como ScraperWiki para pedir a programadores que produzcan un scraper que permita reunir información como el Registro de intereses de parlamentarios, nos ahorró la mitad del trabajo: tuvimos toda la información de los parlamentarios en una hoja, lista para la “larga” tarea de analizarla y expurgarla.

Servicios como éste (o herramientas tales como Outwit Hub) son de inmensa ayuda para periodistas que tratan de compilar datos complicados y que son capaces de programar.

James Ball, the Guardian

Herramientas que lo ayudan a "scrapear"

Hay muchos programas que pueden ser usados para extraer información en masa de un sitio, incluyendo extensiones de navegadores y algunos servicios de la red. Según el navegador que use, herramientas como Readability, que ayuda a extraer texto de una página o DownThemAll, que le permite descargar muchos archivos al mismo tiempo), le ayudarán a automatizar algunas tareas tediosas, mientras que la extensión Scraper de Chrome fue creada explícitamente para extraer tablas de sitios de la red. Extensiones para programadores como FireBug para Firefox, lo mismo ya viene incluido en Chrome, Safari e IE) le permite ver exactamente como está estructurado un sitio y qué comunicaciones se dan entre su navegador y el servidor.

ScraperWiki es un sitio que le permite crear scrapers en una cantidad de lenguajes de programación diferentes., incluyendo Python, Ruby y PHP. Si quiere comenzar a scrapear sin la complicación de instalar una plataforma de programación en su computadora esta es la manera de hacerlo. Otros servicios de la red, tales como las Hojas de Cálculo de Google y Yahoo! Pipes, también permiten realizar extracciones de otros sitios.

¿Cómo funciona un "Scraper" de la red?

Los "scrapers" de la red por lo general son piezas pequeñas de código escritas en un lenguaje de programación tal como Python, Ruby o PHP. Escoger el lenguaje adecuado depende en gran medida de a qué comunidad tiene acceso: si en su redacción o ciudad hay alguien que ya trabaja con uno de estos lenguajes, entonces tiene sentido adoptar el mismo lenguaje.

Si bien algunas de las herramientas de "scraping" con las que basta cliquear y apuntar mencionadas más arriba pueden ser de ayuda para comenzar, lo verdaderamente complejo a la hora de scrapear en un sitio es encontrar las páginas indicadas y los elementos indicados dentro de estas páginas para extraer la información deseada. Estas tareas no tienen que ver con programación, sino con comprender la estructura del sitio y la base de datos.

Al presentar un sitio, su navegador casi siempre usará dos tecnologías, HTTP, para comunicarse con el servidor y pedir recursos específicos, tales como documentos, imágenes o videos; y HTML, el lenguaje en el que se componen los sitios.

La anatomía de una página de la red

Toda página HTML está estructurada como una jerarquía de módulos (que están definidos por etiquetas de HTML). Un módulo grande contiene muchos módulos más pequeños –por ejemplo una tabla que tiene muchas divisiones más pequeñas: filas y celdas. Hay muchos tipos de etiquetas que realizan distintas funciones: algunas producen módulos, otras tablas, imágenes o vínculos. Las etiquetas también pueden tener propiedades adicionales (por ejemplo, pueden ser identificadores únicos y pueden pertenecer a grupos llamados “clases” que hacen posible apuntar a y capturar elementos individuales dentro de un documento). Escoger elementos apropiados de esta manera y extraer su contenido es la clave para escribir un "scraper".

Viendo los elementos en una página de la red, todo puede dividirse en módulos dentro de módulos.

Para "scrapear" en páginas de la red tendrá que aprender un poco acerca de los distintos tipos de elementos que pueden encontrarse en un documento HTML. Por ejemplo, el elemento <table> abarca toda una tabla, que tiene <tr> (table row) elementos para sus filas, que a su vez contienen <td> (table data) para cada celda. El tipo de elemento más común que encontrará es <div>, que puede significar básicamente cualquier bloque de contenido. La manera más fácil de conocer estos elementos es usar la barra de desarrolladores, developer toolbar, de su navegador: le permitirá posicionarse sobre cualquier parte de una página de la red y ver el código correspondiente.

Las etiquetas funcionan como el comienzo y el fin de un libro, marcando el comienzo y el fin de una unidad. Por ejemplo <em> significa el comienzo de un tramo de texto en itálica o destacado y </em> significa el fin de ese tramo. Fácil.

Un ejemplo: "Scraping" de incidentes nucleares con Python

NEWS es el portal de la Agencia Internacional de Energía Atómica (AIEA) que sigue los incidentes de radiación en todo el mundo (y disputa el título máximo del club de los títulos raros). La página tiene listas de incidentes en un sitio simple, tipo blog, que puede ser fácilmente "scrapeado".

Figure 4. El portal de la Agencia Internacinal de Energía Atómica (IAEA) (news.iaea.org)

Para empezar, cree un nuevo scraper Python en ScraperWiki y se le presentará un área para texto mayormente vacía, salvo por algo de código de soporte. En otra pestaña del navegador abra el http://www-news.iaea.org/EventList.aspx[sitio de AIEA y abra la barra para desarrolladores de su navegador. En la vista de “elementos” trate de encontrar el elemento HTML de uno de los títulos de noticias. La barra para desarrolladores de su navegador le ayudará a relacionar los elementos en la página con el código HTML correspondiente.

Al investigar esta página se revelará que los títulos son elementos <h4> dentro de una <table>. Cada evento es una fila <tr>, que también contiene una descripción y una fecha. Si queremos extraer los títulos de todos los eventos, debiéramos buscar la manera de seleccionar cada fila en la tabla secuencialmente, recopilando todo el texto dentro de los elementos de título.

Para convertir este proceso en código, tenemos que tomar conciencia de todos los pasos. Para tener idea del tipo de pasos requeridos, juguemos un juego simple: en su ventana de ScraperWiki trate de escribir instrucciones individuales para cada cosa que va a hacer mientras escribe este "scraper", como los pasos de una receta (ponga al comienzo de cada línea un signo de numeral para indicarle a Python que no es un verdadero código de computación). Por ejemplo:

# Buscar todas las filas en la tabla
# Unicornio no debe desbordar el lado izquierdo.

Trate de ser lo más preciso posible y no suponga que el programa sabe algo acerca de la página que intenta scrapear.

Una vez que haya escrito algo de este seudo-código, comparemos esto con el código esencial para nuestro primer scraper:

import scraperwiki
from lxml import html

En esta primera sección estaba importando funcionalidad existente de bibliotecas, recortes de código ya escrito. Scraperwiki nos dará la capacidad de descargar sitios de la red, mientras que lxml es una herramienta para el análisis estructurado de documentos HTML. Buena noticia: si está escribiendo un scraper con ScraperWiki, estas dos líneas siempre serán las mismas.

url = "http://www-news.iaea.org/EventList.aspx"
doc_text = scraperwiki.scrape(url)
doc = html.fromstring(doc_text)

A continuación el código hace un nombre (variable): url, y asigna el URL de la página de la AIEA como su valor. Esto le dice al "scraper" que esta cosa existe y que queremos prestarle atención. Nótese que el URL mismo está entre comillas ya que no es parte del código del programa sino un string, una secuencia de caracteres.

Entonces usamos la variable del url como entrada de una función, scraperwiki.scrape. Una función que producirá una tarea definida, en este caso, descargará una página de la red. Cuando termine, asignará su producto a otra variable, doc_text. doc_text ahora contendrá el texto del sitio; no la forma visual que ve en su navegador, sino el código fuente, incluyendo todas las etiquetas. Dado que esta forma no es muy fácil de analizar, usaremos otra función, html.fromstring, para generar una representación especial, en la que podamos fácilmente referirnos a elementos, el así llamado modelo de documento de objeto o document object model (DOM).

for row in doc.cssselect("#tblEvents tr"):
link_in_header = row.cssselect("h4 a").pop()
event_title = link_in_header.text
print event_title

En este paso final, usamos el DOM para encontrar cada fila de nuestra tabla y extraer el título del evento de su encabezado. Se usan dos conceptos nuevos: el riso "for loop" y selección de elemento o "element selection" (.cssselect). El "for loop" hace esencialmente lo que implica su nombre; atraviesa una lista de ítems, asignando a cada uno un alias temporal (row en este caso) y luego aplicará las instrucciones con sangría para cada ítem.

El otro concepto nuevo, selección de elemento o "element selection", es hacer uso de un lenguaje especial para encontrar elementos en el documento. Los selectores CSS son usados normalmente para agregar información de diseño a elementos HTML y puede ser usado para extraer con precisión un elemento de una página. En este caso (línea 6) estamos seleccionando #tb1Events tr, que hará corresponder cada <tr> en el elemento tabla con el ID tb1Events (el signo numeral simplemente significa ID). Nótese que esto producirá una lista de elementos <tr>.

Eso puede verse en la siguiente línea (línea 7i), donde estamos aplicando otro selector para encontrar cualquier <a> (que es un hipervínculo) dentro de un <h4> (un título). Aquí sólo queremos ver un elemento (solo hay un título por fila), de modo que tenemos que sacarlo del encabezado de la lista creada por nuestro selector con la función .pop().

Nótese que algunos elementos en el DOM contienen texto (es decir, aneder usando la sintaxis [element].text que se ve en la línea 8. Finalmente en la línea 9 estamos imprimiendo ese texto a la consola ScraperWiki. Si hace clic en "run" en su "scraper", la ventana más pequeña ahora debiera comenzar a listar los nombres del evento del sitio de la AIEA.

Figure 5. Un scraper en acción (ScraperWiki)

Ahora puede ver un "scraper" básico operando: descarga la página, la transforma a la forma DOM, y luego le permite seleccionar y extraer cierto contenido. Dado este esqueleto, puede tratar de resolver algunos de los problemas que quedan usando la documentación del ScraperWiki y Python:

  • ¿Puede encontrar la dirección del vínculo en el título de cada evento?

  • ¿Puede seleccionar el pequeño módulo que contiene la fecha y el lugar usando su nombre de clase CSS y extraer el texto del elemento?

  • ScraperWiki ofrece una pequeña base de datos para cada scraper, de modo que pueda almacenar los resultados; copie el ejemplo correspondiente de sus docs y adáptelo de modo que guarde los títulos, vínculos y fechas del evento.

  • La lista de eventos tiene muchas páginas; ¿puede scrapear múltiples páginas para obtener eventos históricos también?

Mientras intenta resolver estos desafíos, investigue un poco el ScraperWiki: hay muchos ejemplos útiles en los "scrapers" existentes; a menudo los datos son bastante interesantes también. De este modo no necesita comenzar su "scraper" de cero: simplemente escoja uno similar, tómelo y adáptelo a su problema.

Friedrich Lindenberg, Open Knowledge Foundation

"Scrapear" en una base de datos pública

Algunos médicos franceses pueden establecer libremente sus honorarios, por lo que uno puede pagar entre € 70 y € 500 por una consulta de 30 minutos con un oncólogo, por ejemplo. Los datos sobre honorarios por ley son públicos, pero la administración solo ofrece una base de datos online difícil de navegar. Para tener una buena visión de los honorarios de los médicos para Le Monde, decidí "scrapear" toda la base de datos.

Ahí comenzó la diversión. De entrada, el formulario de búsqueda era una aplicación Flash que redirigía a una página de resultados HTML vía un pedido POST. Con ayuda de Nicolas Kayser-Bril, nos llevó algo de tiempo descubrir que la aplicación usaba una tercera página como paso “oculto” entre el formulario de búsqueda y la página de resultado. Esta página se usaba en realidad para almacenar un cookie con valores del formulario de búsqueda al que entonces accedía la página de resultados. Hubiese sido difícil imaginarse un proceso más enredado, pero las opciones de la biblioteca cURL en PHP permiten superar fácilmente las vallas, una vez que se sabe cuáles son. Finalmente apoderarnos de la base de datos llevó 10 horas, pero valió la pena.

Alexandre Léchenet, Le Monde