Archive for September, 2014

Recolectando Datos de Internet

La cantidad de datos en Internet es enorme. Pero que los datos existan no significa que podamos obtener un beneficio de ellos inmediatamente. Se necesitan herramientas para obtenerlos y analizarlos. En este relanzamiento del blog de Ingeniería Simple, vamos a revisar algunas técnicas sencillas y útiles para obtener datos de Internet, analizarlos y convertirlos en información y conocimiento que tenga valor para todos.

Crear hoja electrónica en Google Drive

Paso 1: Crear hoja electrónica en Google Drive

Las hojas electrónicas modernas como Microsoft Excel, Google Spreadsheet, o LibreOffice Calc, incluyen ambientes de programación integrados que son especialmente adecuados para esta tarea. Claro, si la cantidad de datos es muy grande entonces puede ser necesario pasarlos a una base de datos especializada, pero para lo que nos proponemos hacer ahora el uso de VBA en Excel o JavaScript en Google Apps o en Calc será suficiente.

Empezaremos recolectando tweets de una cuenta de Twitter y colocándolos en una hoja electrónica de Google. Al final tendremos una hoja electrónica en la que se escribe el usuario de la cuenta de Twitter en la primera celda y con una opción de menú se obtienen los últimos 20 tweets de esa cuenta.

Para recolectar los tweets se necesita leer la página del usuario en Twitter, limpiarla de otros contenidos, y escribirlos de regreso en la hoja electrónica debajo del nombre del usuario. El código que lo hace debe ir dentro de una función que para ser ejecutada debe llamarse al seleccionar una opción de menú.

Así que el primer paso es crear una hoja electrónica en Google Drive ponerle un nombre adecuado y acceder al editor de scripts. La secuencia de imágenes incluida en este artículo muestra cómo hacer esto.

Cambiar nombre a hoja electrónica

Paso 2: Cambiar o poner nombre a hoja electrónica

Ingresar al editor de scripts

Paso 3: Ingresar al editor de scripts

El tipo de script es el de hoja electrónica, solo lo pregunta una vez

Paso 4: El tipo de script es el de hoja electrónica, solo lo pregunta una vez

Cambiar el nombre del proyecto

Paso 5: Cambiar el nombre del proyecto, es importante para saber siempre dónde se codifica

Código que se ejecuta al abrir la hoja electrónica

Paso 6: Revisar el código que se ejecuta al abrir la hoja electrónica y que Google incluye automáticamente

La función onOpen se ejecuta automáticamente cada vez que se abre el documento de hoja electrónica, así que es el lugar ideal para realizar ajustes iniciales como agregar una opción de menú que permita listar los tweets de un usuario.

Es necesario modificar el código de la función onOpen para que la opción de menú luzca mejor e indique de qué se trata esta funcionalidad:

function onOpen() {
 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 var entries = [{
 name : "Read tweets",
 functionName : "readTweets"
 }];
 spreadsheet.addMenu("Tweet Collector", entries);
};

El código de la función readTweets() busca en la celda A1 el nombre del usuario para leer sus tweets y si no lo encuentra entonces lo pregunta directamente, luego llama a la función que recupera los tweets del usuario, de la que recibe un vector con la lista de tweets, que recorre poniéndolos en celdas sucesivas debajo del nombre de usuario en la hoja electrónica, queda así:

function readTweets() {
  var tweetCell = SpreadsheetApp.getActiveSheet().getRange("A1");
  var TwitterUser = tweetCell.getValue();
  if (!TwitterUser) {
    TwitterUser = Browser.inputBox(
      "Twitter User", 
      "Enter the Twitter username to read tweets", 
      Browser.Buttons.OK_CANCEL);
    if (TwitterUser == "cancel")
      TwitterUser = null;
    else
      tweetCell.setValue(TwitterUser);
  }
  if (TwitterUser) {
    var arrTL = readTwitterTL(TwitterUser);
    for (var i = 0; i < arrTL.length; i++)
      tweetCell.offset(i+1, 0).setValue(arrTL[i]);
    tweetCell.activate();
  }
}

Como se ve la función clave es finalmente readTwitterTL que recibe como parámetro el nombre del usuario de Twitter. Esta función, con comentarios en cada paso para ayudar a su interpretación es como sigue:

function readTwitterTL(fromUsr) {
  // Obtener el texto de la página de Twitter del usuario
  var TLText = UrlFetchApp.fetch("https://twitter.com/" + fromUsr).getContentText("UTF-8");
  
  // Acumular todos los tweets en allTweets
  var allTweets = "";
  
  // Cada tweet ocurre dentro de un "p" clase "ProfileTweet-text js-tweet-text u-dir" 
  while (TLText.indexOf("ProfileTweet-text js-tweet-text u-dir") > -1) {
    TLText = TLText.substr(TLText.indexOf("ProfileTweet-text js-tweet-text u-dir")-10);
    // Leer una línea a la vez en oneLine hasta llegar a marca /p
    // acumulando el texto en fullTweet
    var oneLine = "";
    var fullTweet = "";
    do {
      oneLine = TLText.substr(0,TLText.indexOf("\n"));
      TLText = TLText.substr(oneLine.length+1);
      fullTweet += oneLine.replace("\n","");
    } while (oneLine.indexOf("</p>") == -1);
    // Limpiar tweets de código html
    allTweets += fullTweet.replace(/<[^<>]*>/g,"").replace("&nbsp;","") + "\n";
  }
  // Devolver todos los tweets en un vector
  allTweets = allTweets.substr(0,allTweets.length-1);
  return(allTweets.split("\n"));
}

El resultado visto en la hoja electrónica llamando al código desde la opción de menú luce como se muestra en la siguiente imagen:

Lista de tweets generada por el código

Lista de tweets generada por el código para el usuario @IngSimple

Probablemente el procedimiento que se ha mostrado aquí no es el que Twitter mismo aconsejaría para leer las líneas de tiempo pues tiene la enorme desventaja de basarse en una característica del código HTML con el que se devuelven los resultados que puede cambiar de un día a otro y volverlo obsoleto, sin embargo ilustra muy bien dos puntos importantes:

  1. Recolectar datos de Internet a veces requiere algo de ingenio para crear una solución que funciona de momento (hay que “hackear”)
  2. La utilidad de las herramientas de recolección de datos puede ser tan efímera como la de los datos mismos

Lo que subsiste es el principio: los datos están ahí y pueden recolectarse accediendo al código HTML que los presenta. En próximas entregas analizaremos otras formas de acceso a esos mismos datos.

La hoja electrónica desarrollada en este artículo se encuentra en el siguiente enlace:

https://docs.google.com/spreadsheets/d/1l34k75EGt3iEMhNgmSQ5uEe60nu_4gZoAU5fFAzgFp8/edit?usp=sharing

No Comments