Noticias sobre mis proyectos

viernes, 4 de septiembre de 2009

Introducción a la API de Google Analytics

Para ratificar el compromiso de Google con los desarrolladores, esta semana vió la luz una de las solicitudes más anheladas por la comunidad que gira alrededor de las APIs de Google. El gigante de Mountain View acerca la tecnología Google Analytics a los desarrolladores ofreciendo un protocolo REST similar al de sus parientes cercanos.

Google avanza comprometido con los desarrolladores

Hace un tiempo ya Google había demostrado su compromiso con los amantes de sus tecnologías y, atendiendo a las peticiones de los fieles desarrolladores, introdujo a Java como lenguaje en Google App Engine. Este paso también generó una especie de onda expansiva beneficiosa pues cualquier lenguaje que pueda ejecutarse sobre la máquina virtual de Java también podrá ser utilizado. Por tanto se habla de que ya hay aplicaciones que se encuentran en esa nube y que están implementadas en PHP, Ruby (¿recuerdan a Ruby on Rails?), Groovy y sería posible también que resurgieran otros como Scala, ¿quién sabe?.

Para ponerle la tapa al pomo de ahora en adelante la plataforma gratuita de análisis de visitas de los sitios web tiene también una API de programación que incluye primeramente a los lenguajes Java y JavaScript. Otras nueve librerías están a disposición para acceder a las estadísticasproveídas por este servicio. Entre los lenguajes se encuentra, especialmente Python (ya disponibles para su uso en Google App Engine), PHP y Ruby. Como el servicio esta en fase beta, se han establecido cuotas para su uso racional.

Esta decisión también influye en las sinergias que induce la trasnacional sobre la comunidad de sus usuarios, le añaden valor agregado al servicio, y contribuyen a su mejora continua aprovechando la imaginación de los programadores. Con el auge de los mashups y sumándo las posibilidades ya disponibles en Google Visualization API, Android, Google Maps API y otros, Google da pruebas de que la onda expansiva que acompaña a cada una de sus tecnologías es cada vez más fuerte. En este caso, ya desde el mismo lanzamiento existen ejemplos concretos que lo demuestran: la visualización de las estadísticas en dispositivos móviles, la inclusión de gráficos en presentaciones de Microsoft Power Point, la integración con aplicaciones para hojas de cálculo. ¡¡¡ Señores, lo de Google ya es demasiado !!!

Instalando el cliente de Google Data API

Para no dejarles con las ganas aquí les muestro un ejemplo básico para construir con Python una aplicación de consola que utilice esta nueva y útil interfaz de programación para obtener las estadísticas. Si no conoce este lenguaje le propongo que siga el curso de Python (una serie de artículos ;o) que vengo redactando desde hace un buen tiempo ya para la revista TuxInfo. Por brevedad voy a suponer que ya tienen instalado correctamente un intérprete de Python.

Antes de pensar en programar hay que instalar una versión de la librería posterior a la 1.3.2. Fue en este momento cuando la implementación de Sal Uryasev fue incluída en este paquete. Después de descargar una versión reciente hay que descompactar el fichero. Si se escoge el fichero .ZIP entonces puede ejecutar los siguientes comandos.

$ unzip -x  gdata-1.3.2.zip
Archive:  gdata-1.3.2.zip  
  inflating: gdata.py-1.3.2/README.txt
  inflating: gdata.py-1.3.2/RELEASE_NOTES.txt
  ...

$ ls 
gdata.py-1.3.2      gdata-1.3.2.zip

Si se escoge el fichero TAR.GZ entonces hay que ejecutar los siguientes comandos.

$ gzip -dc gdata-2.0.0.tar.gz > gdata-2.0.0.tar

$ tar -xf gdata-2.0.0.tar

$ ls
gdata-1.3.2                   gdata-1.3.2.tar
gdata-1.3.2.tar.gz

En cualquiera de los casos, el siguiente paso es ejecutar el script de instalación estándar. Para ello hay que colocarse en la carpeta donde se ha descompactado el código fuente y ejecutar los siguientes comandos :

$ cd gdata.py-1.3.2

$ ls
INSTALL.txt        README.txt         samples            tests
MANIFEST           RELEASE_NOTES.txt  setup.py
PKG-INFO           pydocs             src

$ python setup.py install
...

De esta forma se instala la librería de forma tal que todos los usuarios pueden utilizarla. Si Usted no desea que esto suceda, puede instalarla en su directorio personal de la siguiente manera.

$ cd gdata.py-1.3.2

$ ls
INSTALL.txt        README.txt         samples            tests
MANIFEST           RELEASE_NOTES.txt  setup.py
PKG-INFO           pydocs             src

$ python setup.py install  --home=/home/user_name
...

Después solo basta iniciar el intérprete de Python ...

$ python

... y comprobar que todo marcha bien.

>>> import gdata
>>>

¡Ya estamos listos!

Autentificación

Al igual que con todos los servicios de Google Data API, lo primero que es preciso hacer es autentificarse.

>>> from gdata.analytics.service import AnalyticsDataService as ADS
>>> s = ADS(email='murphy@gmail.com', password='can_hurt_your_eyes', \
...         source='aaa-aaa-v1')
...
>>> s.ProgrammaticLogin()
>>>

Para utilizar la API más cómodamente se utiliza la clase gdata.analytics.service.AnalyticsDataService. Sus instancias dan acceso al servicio Google Analytics. En el mismo paquete hay otras clases que se utilizan para acceder a otros servicios de Google. Sin embargo en todos los casos el procedimiento es el mismo, y se comienza por suministrar la cuenta del usuario, su password, y un parámetro llamado source, que se emplea para identificar a nuestra aplicación (pero que no es muy relevante para probar ;o). A continuación se llama al procedimiento de autentificación. Para todos los servicios hay tres modalidades disponibles: OAuth, AuthSub y ClientLogin. La última es la única que se puede utilizar para construir aplicaciones de escritorio, razón por la cual se invoca el método ProgrammaticLogin en el ejemplo.

Después de hacer todo esto el servicio es capaz de dar acceso solamente a la información sobre los sitios de nuestra propiedad.

Utilizando la API de Google Analytics

A continuación le muestro varios ejemplos que utilicé para probar. Para cada uno de ellos utilicé las estadísticas de mi sitio de administración de proyectos. Primeramente quería saber las principales fuentes de las visitas y los rechazos que acontecían.

>>> url = 'https://www.google.com/analytics/feeds/data/?ids=ga:12345678&dimensions=ga:source,ga:medium&metrics=ga:visits,ga:bounces&sort=-ga:visits&start-date=2009-06-01&end-date=2009-06-30&max-results=25'
>>> f = s.AnalyticsDataFeed(url)
>>> for e in f.entry:
...     for d in e.dimension:
...             print d.name, d.value,
...     for m in e.metric:
...             print m.name, m.value,
...     print
...
ga:source (direct) ga:medium (none) ga:visits 31 ga:bounces 12
ga:source trac-hacks.org ga:medium referral ga:visits 13 ga:bounces 5
ga:source pypi.python.org ga:medium referral ga:visits 12 ga:bounces 7
ga:source google ga:medium organic ga:visits 11 ga:bounces 10
ga:source groups.google.com ga:medium referral ga:visits 2 ga:bounces 2
ga:source trac.edgewall.org ga:medium referral ga:visits 2 ga:bounces 0
ga:source gossamer-threads.com ga:medium referral ga:visits 1 ga:bounces 0
ga:source groups.google.be ga:medium referral ga:visits 1 ga:bounces 1
ga:source mail.google.com ga:medium referral ga:visits 1 ga:bounces 0

Como se puede ver en el ejemplo lo primero que hay que hacer es construir la URL mediante la cual se recuperan los datos que deseamos. La base siempre es la misma https://www.google.com/analytics/feeds/data/. Para especificar qué datos deseamos obtener se utilizan diferentes parámetros, pero uno que no puede faltar nunca es el identificador de nuestra propiedad (i.e. el sitio para el cual queremos obtener las estadísticas). Para ello se utiliza el parámetro ids (en este caso ids=ga:12345678). Tenga en cuenta que siempre hay que utilizar el prefijo ga:.

Las estadísticas están organizadas en la forma de una tabla. Para cada dimensión se obtienen los valores de una o varias métricas. Por ejemplo, en este caso las dimensiones utilizadas son la fuente desde donde se accedió al sitio y el medio utilizado para llegar hasta las páginas. Para esto se necesita el parámetro dimensions=ga:source,ga:medium. Por otra parte las métricas solicitadas fueron los números de las visitas y de rechazos, por lo que se incluyeron el parámetro metrics=ga:visits,ga:bounces. Para presentar los valores de una forma más cómoda, he ordenado los resultados en orden descendente por la cantidad de visitas (i.e. sort=-ga:visits). Este parámetro realmente no es obligatorio. Otro parámetro opcional es max-results, el cual permite acotar el número de elementos a incluir en cada petición (e.g. max-results=25 se ha empleado para solicitar no más de 25 filas con datos). Por el contrario, es obligatorio especificar el intervalo de tiempo en el que se quieren acotar las mediciones. Para ello se emplean los parámetros start-date y end-date (e.g. en el ejemplo start-date=2009-06-01&end-date=2009-06-30 se utiliza para obtener las mediciones hechas durante el mes de junio del año 2009).

Después de haber conformado la URL, se pasa como parámetro al método AnalyticsDataFeed de la instancia del servicio mencionada en el epígrafe anterior. El valor retornado es un objeto que contiene los valores que estamos buscando. A través de la colección entry podemos acceder a las filas individuales. Cada fila es representada por un objeto que se coresponde con un valor diferente de las distintas dimensiones. Dichos valores pueden ser obtenidos recorriendo la coleccion dimension. Las métricas solicitadas se encuentran en la colección metric.

¡Eso es todo! Veamos otros casos ;o).

El último ejemplo ilustrará cómo obtener las páginas más visitadas del sitio.

>>> f = s.AnalyticsDataFeed('https://www.google.com/analytics/feeds/data/?ids=ga:12345678&dimensions=ga:pagePath&metrics=ga:pageviews,ga:uniquePageviews,ga:timeOnPage&sort=-ga:pageviews&start-date=2009-06-01&end-date=2009-06-30&max-results=25')
>>> for e in f.entry:
...     for d in e.dimension:
...             print d.name, d.value,
...     for m in e.metric:
...             print m.name, m.value,
...     print
...
ga:pagePath /traccgi/swlcu/wiki/En/Devel/TracGViz ga:pageviews 39 ga:uniquePageviews 32 ga:timeOnPage 5847.0
ga:pagePath /traccgi/swlcu ga:pageviews 17 ga:uniquePageviews 15 ga:timeOnPage 657.0
ga:pagePath /traccgi/swlcu/wiki/En/Devel/TracGViz/TracLinks ga:pageviews 13 ga:uniquePageviews 9 ga:timeOnPage 3929.0
ga:pagePath /external/opensvn.csie.org/traccgi/swlcu/timeline ga:pageviews 7 ga:uniquePageviews 6 ga:timeOnPage 91.0
ga:pagePath /traccgi/swlcu/roadmap ga:pageviews 7 ga:uniquePageviews 7 ga:timeOnPage 1118.0
ga:pagePath /traccgi/swlcu/wiki/TracPlugins ga:pageviews 7 ga:uniquePageviews 4 ga:timeOnPage 476.0
ga:pagePath /traccgi/swlcu/browser ga:pageviews 6 ga:uniquePageviews 4 ga:timeOnPage 120.0
ga:pagePath /traccgi/swlcu/wiki/En/Devel/TracGViz/TracLinks?action=edit ga:pageviews 6 ga:uniquePageviews 6 ga:timeOnPage 976.0
ga:pagePath /external/opensvn.csie.org/traccgi/swlcu/browser ga:pageviews 4 ga:uniquePageviews 4 ga:timeOnPage 98.0
ga:pagePath /traccgi/swlcu/timeline ga:pageviews 4 ga:uniquePageviews 4 ga:timeOnPage 358.0
ga:pagePath /traccgi/swlcu/wiki ga:pageviews 4 ga:uniquePageviews 3 ga:timeOnPage 180.0
ga:pagePath /traccgi/swlcu/wiki/En/Devel/TracGViz/EmbedGVizGadget ga:pageviews 4 ga:uniquePageviews 3 ga:timeOnPage 273.0
ga:pagePath /external/opensvn.csie.org/traccgi/swlcu/browser/trunk ga:pageviews 3 ga:uniquePageviews 3 ga:timeOnPage 102.0
ga:pagePath /traccgi/swlcu/browser/trunk ga:pageviews 3 ga:uniquePageviews 1 ga:timeOnPage 254.0
ga:pagePath /traccgi/swlcu/wiki/En/Devel/TracGViz/DataSources ga:pageviews 3 ga:uniquePageviews 2 ga:timeOnPage 24.0
ga:pagePath /traccgi/swlcu/wiki/En/Devel/TracGViz/TracLinks?version=5 ga:pageviews 3 ga:uniquePageviews 2 ga:timeOnPage 836.0
ga:pagePath /traccgi/swlcu/wiki/En/Devel/TracI18N ga:pageviews 3 ga:uniquePageviews 3 ga:timeOnPage 368.0
ga:pagePath /traccgi/swlcu/xmlrpc ga:pageviews 3 ga:uniquePageviews 3 ga:timeOnPage 0.0
ga:pagePath /external/opensvn.csie.org/traccgi/swlcu/roadmap ga:pageviews 2 ga:uniquePageviews 2 ga:timeOnPage 34.0
ga:pagePath /external/opensvn.csie.org/traccgi/swlcu/wiki/En/Devel/TracGViz/DataSources ga:pageviews 2 ga:uniquePageviews 2 ga:timeOnPage 34.0
ga:pagePath /traccgi/swlcu/attachment/wiki/En/Devel/TracGViz/ ga:pageviews 2 ga:uniquePageviews 1 ga:timeOnPage 58.0
ga:pagePath /traccgi/swlcu/attachment/wiki/En/Devel/TracGViz/EmbedGVizGadget/timeline.json ga:pageviews 2 ga:uniquePageviews 2 ga:timeOnPage 2697.0
ga:pagePath /traccgi/swlcu/attachment/wiki/En/Devel/TracGViz/TracGViz-1.2.1.tar.gz?action=delete ga:pageviews 2 ga:uniquePageviews 1 ga:timeOnPage 598.0
ga:pagePath /traccgi/swlcu/browser/trunk/trac-dev/i18n/README?rev=14 ga:pageviews 2 ga:uniquePageviews 2 ga:timeOnPage 17.0
ga:pagePath /traccgi/swlcu/browser/trunk/trac-dev/i18n/msgs/es/trac.po ga:pageviews 2 ga:uniquePageviews 2 ga:timeOnPage 8.0

Les explico los valores de los parámetros incluídos en la URL:

Parámetro Valor Descripción
ids ga:12345678 El identificador de la propiedad (sitio) web
dimensions ga:pagePath La ubicación de las páginas del sitio
metrics ga:pageviews
ga:uniquePageviews
ga:timeOnPage
Los datos solicitados son el número de consultas para cada página, el número de solicitudes individuales y el tiempo promedio que los usuarios permanecieron en esta página
sort -ga:pageviews Devuelve primero las páginas más vistas
start-date 2009-06-01 Descarta mediciones anteriores al 1 de julio del 2009
end-date 2009-06-30 Descarta mediciones posteriores al 30 de julio del 2009
max-results 25 Devolver no más de 25 resultados

Antes de finalizar quería aclarar que todas las métricas no son compatibles con todas las dimensiones, por lo que hay que tener cuidado al utilizarlas.

Conclusiones

Las estadísticas son muy importantes. La API de Google Analytics tiene una estructura relativamente sencilla (bueno ... después que llegas a conocerla un poquito ;o) y puede llegar a ser una herramienta muy útil. De hecho, me acabo de dar cuenta de que la página más vista del sitio es la del plugin TracGViz. ¿Nunca les he hablado de él? ¡Ostias! Por suerte tengo las estadísticas. Pronto les haré una nota para que lo conozcan. Pero bueno, simelo piden también abordaré cualquier tema que sea de su interés. ¡Hasta pronto! .

No hay comentarios:

Publicar un comentario en la entrada