Obtener datos externos de una página Web en Excel

Estándar

Ya anteriormente he publicado el hacer uso de técnicas como el web scraping para extraer información de páginas web por medio de programación en VBA/Excel. Pero hay algunas ocasiones en que extraer información puede hacerse de una manera fácil y rápida que no amerite programación alguna, pudiendo hacer uso de la importación de datos externos de una web en Excel. Este método funciona principalmente si los datos que queremos extraer se encuentran en un formato tabular (tabla HTML) como pueden ser cotizaciones. La ventaja de usar este método es que es muy fácil, no se programa e incluso se puede estar descargando los datos cada “n” minutos especificados en la consulta.

Les comparto un video con el ejemplo.

Web scraping – Obteniendo la temperatura de los próximos días

Estándar

En esta ocasión vamos a extraer la temperatura de un portal de internet, de la siguiente página: openweathermap.org/city/3530597 que muestra la temperatura de los próximos días de la ciudad de México.

Para efectuar esta tarea haremos uso del objeto Internet Explorer para poder navegar a dicha página y una vez cargada la misma empezamos a realizar la extracción del texto correspondiente y lo vaciamos en las celdas de nuestro libro.

Antes que nada tendremos que agregar la referencia necesaria para trabajar con el navegador de la siguiente forma:

001

Una vez agregada la referencia correspondiente podemos hacer uso las propiedades y métodos del objeto IE y tener la ventaja del intellisense al codificar con el objeto, después de ello procedemos a escribir el siguiente código:


Sub Clima()
Dim oIE As InternetExplorer
Dim sContenido As String
Dim lPosicion As Long
Dim vContenido As Variant
Dim i As Integer
Set oIE = New InternetExplorer 'aqui se crea y se ejecuta una instancia del navegador
With oIE
.Visible = True 'con esta instruccion hacemos visible el navegador
.Navigate "http://openweathermap.org/city/3530597"
'esperamos hasta que se haya cargado la pagina en el navegador
While .ReadyState <> READYSTATE_COMPLETE: DoEvents: Wend
sContenido = .Document.body.innertext 'se almacenatodo el texto desplegado por la pagina
'vemos que la cadena "next days" solo aparece una vez en el texto de la pagina y de ahi en adelante viene la
'temperatura de los dias siguiente...
lPosicion = InStr(1, sContenido, "Next Days", vbTextCompare) 'encontramos su posicion
sContenido = Mid(sContenido, lPosicion + Len("Next Days"), 1000) 'cortamos la cadena
vContenido = Split(sContenido, vbNewLine) 'spliteamos por linea de texto
'procesamos cada linea de texto, vemos que las lineas que nos interesan tienen una ma longitud menor a
'40 caracteres (a ojo de buen cubero)
For i = LBound(vContenido) To UBound(vContenido)
If Len(vContenido(i)) > 0 And Len(vContenido(i)) < 40 Then
Range("A65500").End(xlUp).Offset(1, 0) = vContenido(i) 'escribos la info en nuestra hoja de excel
End If
Next
.Offline = False
.Quit 'cerramos el navegador para que no cnsuma memoria
MsgBox "Temperaturas extraidas con éxito", vbInformation
End With
Set oIE = Nothing
End Sub

Aquí comparto la macro con el código de ejemplo.

VBA/Excel y el futuro en el procesamiento de datos

Estándar

En el año 2006 empecé a estudiar VBA/Excel dado que me di cuenta que era una herramienta que facilitaba mi trabajo diario en el área de crédito y cobranza en el área de autoservicios. Inicialmente yo había aprendido a programar en lenguaje C a los 16 años por lo cual llegue a crear para mi trabajo unos sencillos programas que leían un archivo de texto que contenía números de facturas y que eliminaban todo aquello que no fuera un número, muy rudimentario pero funcionaba. Aun no sabía nada sobre las formulas y macros en Excel (ya que me hubiera llevado menos tiempo), tampoco profundice mucho en C pero gracias a su estudio desarrolle lógica. Lo que me atrajo de VBA/Excel fue el poder crear interfaces graficas las cuales llaman la atención del usuario y facilitan la selección de opciones para llevar a cabo un proceso.

No me avergüenza confesar que yo era de aquellos que decían que VB no era para auténticos programadores, pero… esa idea cambio! VB es mejor que C en ciertos ámbitos y C es mejor que VB en otros. Sin duda alguna para el ámbito administrativo en el que me desenvolví, VBA/Excel fue la mejor herramienta por que disponía de un gran conjunto de opciones. Pero… cometí el error de pensar que VBA/Excel es la solución a todo! VBA/Excel es una excelente herramienta con la cual podemos procesar cantidades de datos, crear gráficos y muchas cosas más… su versatilidad le hace popular, eso sin comentar que es relativamente fácil de aprender y hay gran documentación al respecto, pero un buen programador no debe conformarse con saber una sola herramienta!

Hoy en día hay gran cantidad de información inundándonos por todas partes, ya no solo se trata solo de leer y procesar archivos de texto plano, hojas de cálculo o conectarse a bases de datos, ahora hay que lidiar con la famosa nube. Ah! y llegaron los dispositivos móviles (teléfonos inteligentes, tabletas), donde ahí VBA/Excel tiene la batalla perdida sin duda alguna, pero en cuanto a la nube algo se puede hacer, más bien mucho! La nube trae consigo nuevas posibilidades para el aprendizaje de nuevas tecnologías o en su defecto para aquellos que no quieren dejar Excel, llevar a VBA/Excel más allá del límite, pero teniendo siempre en cuenta que no siempre será la mejor opción en algunos casos. Para ello necesitaremos saber emplear las herramientas que siempre han estado con nosotros y saber decidir en qué momento emplear determinada herramienta.

Las aplicaciones web están o han dominado sobre las aplicaciones de escritorio, cualquier programador ha escuchado sobre el uso de API’s y servicios web, pero como sacarles ventaja desde VBA/Excel. Si queremos que incursionar con VBA/Excel en el mundo web sin duda alguna tendremos que meter las manos a la grasa (como decía un profesor) y empaparnos de términos ligados a dicho ámbito, ampliar nuestros horizontes, porque si no lo hacemos estaremos tratando de resolver los nuevos problemas con las mismas herramientas del pasado.

Sin duda alguna me he embarcado algo tarde en esta aventura, pero con las nuevas herramientas y metodologías, será relativamente fácil llevar a VBA/Excel a otro nivel.

Accediendo a la lista de amigos de Facebook desde VBA/Excel

Estándar

Bueno, últimamente me he dado a la tarea de investigar a fondo como llevar VBA/Excel en la extracción de información de internet, este será el primero de muchos artículos más que mostrara como interactuar con servicios y aplicaciones web.

Este post complementa al post anterior: Web scraping rudimentario con VBA/Excel

Para esta sencilla macro tome como base el siguiente video:

El cual según muestra las personas que visitaron nuestro Facebook, pero yo creo que solo muestra la lista de nuestros amigos y no el orden de visita, aun así esta macro demuestra lo fácil que es automatizar el navegador, interactuar con él y extraer información del mismo ya que la macro toma todos elementos y los va vaciando directamente en la hoja de nuestro libro, así no tendremos que estar modificando la URL como lo hacía el tipo del video. Como siempre he dicho… ¿Por qué hacer algo que la computadora puede hacer por nosotros?

Esta macro no roba claves ni nada por el estilo, lo digo por los desconfiados, después de todo el código está desprotegido y comentado para su consulta. Esta es una manera de extraer datos de una página web, pero a mi parecer es sumamente lenta, hay otra alternativa que haría el trabajo más rápido y eficientemente sin involucrar al navegador.

Como pueden ver es así también como se puede acceder a la mayoría de las páginas que solicitan usuario y contraseña.

Les comparto el enlace a la macro con el código de ejemplo: hackingfacebook

NOTAS:

  • Si van a utilizar el InternetExplorer y el HTMLDocument, no se olviden de agregar las referencias y así tener la ventaja de poder tener el intellisense a la hora de escribir los métodos y propiedades o pueden crear los objetos con CreateObject, pero no dispondrán del intellisense.referencias
  • Si les sale el cuadro de detener Script, denle que si (es lo malo del Internet Explorer) para que prosiga la ejecución del código.error
  • Si les da error en la línea donde se escribe el correo electrónico (usuario) es porque ya accedieron a Facebook, denle salir, cierren el navegador y prueben de nuevo
  • Les recomiendo correr el código paso por paso para que vean cómo funciona y que no lo dejen ejecutándose por completo ya que tardara de acuerdo a la cantidad de amigos que tengan.

Construyendo una simple interface desde GAS – Pt 2

Estándar

En esta segunda entrega, crearemos una sencilla interfaz de usuario en GAS utilizando el HTML Service, para ello, crearemos un proyecto en blanco, después de ello haremos lo siguiente:

Ir a Archivo=>Nuevo=>Archivo HTML

Se nos solicitara un nombre de archivo, al cual llamaremos index, damos clic en aceptar y escribimos el siguiente código:

<div id=”formulario”&gt
<form&gt
<input type=”email” name=”email” id=”email” placeholder=”Introduce tu e-mail”&gt
<input type=”submit” value=”Registrarse”&gt
</form&gt
</div&gt

En este ejemplo queremos que el usuario introduzca su email, lo cual normalmente requiere algún tipo de validación, no queremos que el usuario introduzca algo que no sea un email. Esta simple validación por lo general se lleva a cabo del lado del cliente usando JavaScript, lo cual relativamente es complicado, pero estamos de suerte ya que nos podemos ahorrar ese dolor de cabeza empleando HTML5. Si, así es! HTML5 es soportado al utilizar el HTML Service en GAS. Esto significa que la validación se lleva acabo empleando la propiedad type=”email” en el elemento de entrada del formulario.

Otro aspecto a remarcar para quienes están empapados en la creación de páginas web, es que en GAS no se debe emplear las etiquetas <head> ni <body>, ya que si se usan podrían afectar el desempeño del script.

Ahora agregaremos un elemento para agradecer al usuario el haberse registrado, para ello emplearemos la siguiente etiqueta justo antes del cierre de la etiqueta div:

<span id=”gracias”>Gracias!</span>

Ahora… ¿qué debemos hacer para que nuestra Web App funcione? En el archivo código.gs escribimos el siguiente código:


function doGet() {

var html = HtmlService.createHtmlOutputFromFile('index').setSandboxMode(HtmlService.SandboxMode.NATIVE).setTitle('Mi Web App');

return html;

}

Como había mencionado anteriormente siempre se debe emplear una función llamada doGet cuando estemos creando una Web App, dentro de esta función están dos líneas de código, en la primera línea creamos una variable llamada html a la cual le asignamos un objeto HTML Service, el crea una salida HTML tomando como template nuestro archivo index, se ajusta el modo de la caja a NATIVE, se le asigna un título y por último se regresa ese objeto al navegador.

Por el momento esto sería todo, más adelante mostrare como interactuar con los eventos del lado del cliente y del servidor usando como base esta misma aplicación.

Web scraping rudimentario con VBA/Excel

Estándar

Muchos ya sabemos que Excel nos permite importar datos desde diversas fuentes:

  • Archivos de texto (csv)
  • Bases de datos (Access u otras…)
  • Cubos de información
  • Archivos XML (que en teoría seria el reemplazo de los archivos de texto plano)
  • Desde Web

En este caso nos centraremos en las importaciones de datos desde la Web, si bien Excel dispone de un asistente que nos permite seleccionar tablas de datos (HTML) para ser volcadas a una hoja de cálculo y además dicho asistente proporciona la opción de actualizar (descargar los datos) “x” minutos según indiquemos entre otras opciones más… Pero habrá situaciones en los datos que tengamos que extraer de una página web no estén distribuidos en una tabla HTML con lo cual su importación se complica, es justo en estas situaciones cuando debemos echar mano de una técnica llamada Web scraping.

Pero… que es el Web scraping? La respuesta fácil y corta es: es una técnica para la extracción de datos de páginas web usando ciertas herramientas. Pueden consultar mayor información en la wikipedia.

Lenguajes como Python, Ruby y VBA permiten echar mano de esta técnica. En esta ocasión nos centraremos en VBA/Excel.
Continuar leyendo