Twitter: conversaciones gráficas con Python (II)

Preparativos

Esta es la segunda entrada de este blog, dedicado a usar el API de Twitter y las librerías de Python para generar una imagen de la conversación que tenga un formato gráfico:

nolla

Tengo que recuperar los tuits con el API de Twitter y usar Python para filtrar la información, crear una lista ordenada y generar un gráfico con los nodos.

En esta entrada te explico los requisitos del proyecto y la forma de satisfacerlos.

Python

No tiene mucho misterio. En Windows se instala con un ejecutable. Existe la opción de usar la versión 2.7 o la 3.4, en sus versiones de 32 y 64 bits. Para Linux y OSX hay sus propios instaladores.

Instalaciones de Python
Instalaciones de Python

Yo uso la 3.4 que corresponde a mi máquina, que es de 64 bits.

Al principio usé la 2.7, porque leí que había muchas librerías que no estaban portadas aún a la versión 3 (que apareció en 2008), y quise evitarme problemas. Luego me di cuenta de que esas mismas informaciones eran quizás demasiado antiguas, y que ha pasado suficiente tiempo ya. Ahora seguro que hay más librerías portadas a Python 3.

Así que he usado mucho la versión 2 de Python, y encuentro que tiene un defecto muy enojoso para un programador que usa acentos y eñes: los errores debidos a problemas de codificación de caracteres son frecuentes e impredecibles. Si importas un lote de tuits sin caracteres raros, todo va bien. Y un día te tropiezas con un carácter unicode raro y de repente del programa falla.

Esto es muy frustrante, y le quita encanto a jugar con Python, el cual por otro lado es un lenguaje muy acogedor. Por esa razón decidí salir de la versión 2.7 y volver a la 3.4, esperando que las librerías que quiero usar ya estuvieran portadas.

Y ese ha sido el caso, salvo un pequeño problema con pydot2 que ya explicaré.

Bueno. Eso. Que instaléis Python 3.4 si queréis seguir estos artículos, o la 2.7 si sois espíritus inquietos que no se arredran ante las dificultades.

No olvidar poner la ruta de Python en el PATH del sistema, para que puedas encontrar fácilmente el ejecutable desde tu directorio de trabajo.

En estas condiciones, invocando python desde la línea de comandos tendrás esto:

C:\Users\Diego>python
Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 10:45:13) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

El prompt cambia a >>>, Python está listo para recibir comandos, lo que demuestra que la instalación fue correcta.

pip

El instalador de paquetes es básico para extender Python según nuestras necesidades. En la página de instalación se nos pide que descarguemos el fichero get-pip.py, que no es más que un script de Python que contiene las instrucciones para descargar e instalar pip.

El comando de instalación, en la línea de comandos:

c:\Users\Diego\> python get-pip.py
instalación pip
Página de instalación de pip

Para ver si está instalado, ejecuto el comando pip. Debe aparecer la pantalla de ayuda:

pip instalado
Instalación correcta de pip

Ahí también verás la colección de comandos que pip admite. La opción que más usaremos es install, pero también resulta útil list, para ver qué paquetes tenemos instalados.

twitter

Con pip instalado, instalar twitter es trivial:

c:\Users\Diego\> pip install twitter
Downloading/unpacking twitter
Installing collected packages: twitter
Successfully installed twitter
Cleaning up...

Para ver que el paquete se instaló bien, vuelve a abrir Python.

Usa el comando import twitter. Esto le pide a Python que busque el paquete twitter y lo haga accesible para trabajar con él. Si todo está bien, no pasará nada. Python devuelve el prompt, esperando un nuevo comando. Si hay algún mensaje de error, mal asunto.

C:\Users\Diego> python
Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 10:45:13) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import twitter
>>>

Comprobación

Un comando interesante de Python es help. Te devolverá información del objeto que le pases como parámetro. Puedes probar con twitter, te saldrán varias páginas.

>>> help(twitter)
Help on package twitter:

NAME
 twitter - The minimalist yet fully featured Twitter API and Python toolset.

DESCRIPTION
 The Twitter and TwitterStream classes are the key to building your own
 Twitter-enabled applications.

 The Twitter class
 -----------------

The minimalist yet fully featured Twitter API class.

Get RESTful data by accessing members of this class. The result
 is decoded python objects (lists and dicts).

The Twitter API is documented at:

http://dev.twitter.com/doc

 Examples::

t = Twitter(
 auth=OAuth(token, token_key, con_secret, con_secret_key)))

# Get your "home" timeline
 t.statuses.home_timeline()

De hecho, ahí está el código que usaremos para importar nuestra línea de tiempo (TL). Peeero… si lo ejecutas tal como está tendrás un error. Lo vas a corregir y de paso te explico su por qué.

Error del espacio de nombres

Voy a suponer que has vuelto a entrar en Python (por cierto, para salir se escribe exit() en el prompt). Importa twitter y escribe el primer comando que vimos en la ayuda. Tendrás lo siguiente:

>>> import twitter
>>> t = Twitter(
... auth=OAuth(token, token_key, con_secret, con_secret_key))
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name 'Twitter' is not defined
>>>

El comando dir() te mostrará los objetos y atributos que tiene cada objeto de Python. Prueba a curiosear dentro de la librería twitter.

>>> dir(twitter)
['NoAuth', 'OAuth', 'OAuth2', 'Twitter', 'TwitterError', 'TwitterHTTPError', 'TwitterResponse', 'TwitterStream', 'UserPassAuth', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', 
'__spec__', 'api', 'auth', 'dedent', 'oauth', 'oauth2', 'oauth_dance', 'oauth_doc', 'read_token_file', 'stream', 'twitter_globals', 'write_token_file']

Uy, aquí hay muchas cosas que ver.

Para empezar, lo que devuelve dir() es una lista. Una lista no es más que una colección de objetos agrupados juntos. Verás objetos que empiezan con mayúscula (Twitter), objetos con subrayados antes y después del nombre (__all__) y objetos en minúsculas.

Los del doble subrayado son objetos internos de Python. Algunos son más esotéricos que otros. Prueba, por ejemplo los comandos:

>>> twitter.__name__
 'twitter'
>>> twitter.__path__
 ['C:\\Python34\\lib\\site-packages\\twitter']

Los objetos con mayúsculas son clases. Las clases son el concepto en el que se basa la Programación Orientada a Objetos (OOP, en inglés), tema en el que no entraré si no es bajo coacción. No al menos mientras no nos haga falta. El caso es que la librería twitter contiene clases que usarás; y será mucho más fácil usarlas que adquirir maestría en el tema de la OOP.

Una cosa amable de Python es que no te obliga a usar esa mayúscula para nombrar una clase; son los programadores de Python los que convienen que mejor usar esa convención para facilitarse la vida mutuamente.

El resto de objetos, en minúsculas, son funciones o atributos que contiene el paquete. La funcionalidad de una librería se disemina a través de esas funciones y atributos (y las clases que dijimos).

Volviendo al error, observa que la clase ‘Twitter’ sí que pertenece al paquete. ¿Por qué no la encontró Python?

Porque Python esperaba ‘Twitter’, y lo que hay es ‘twitter.Twitter’

Cuando ejecutas

>>> import twitter

le estás diciendo a Python que hay un espacio de nombres llamado ‘twitter’, al que pertenecen los objetos que hemos visto vía dir():

['NoAuth', 'OAuth', 'OAuth2', 'Twitter', ...

Entonces Python entiende que para referirse a esos objetos, tiene que usar el nombre del espacio de nombres y el nombre del objeto.

Imagina que importas otro paquete que casualmente tiene un objeto ‘Twitter’ también:

>>> import otro_paquete
>>> dir(otro_paquete)
 {'Twitter', 'Facebook', 'Googleplus',...

¿Cómo puede Python usar uno u otro, si ambos se llaman igual?

Exacto. Usando el espacio de nombres.

>>> t1 = twitter.Twitter()
>>> t2 = otro_paquete.Twitter()

Hay otras formas alternativas de solucionar el problema, pero de momento lo dejamos así.  Vuelve a invocar el comando Twitter, pero con el prefijo correcto. Ah! Y pon el prefijo también a OAuth, que es otro objeto de la librería twitter.

>>> import twitter
>>> t = twitter.Twitter(
... auth=twitter.OAuth(token, token_key, con_secret, con_secret_key))
Traceback (most recent call last):
 File "<stdin>", line 2, in <module>
NameError: name 'token' is not defined
>>>

 

Vaya. Otro NameError. Parece que deberíamos saber qué es token (y posiblemente también token_key, con_secret, con_secret_key…).

Pues sí. Esos objetos son variables, y contienen las claves del proceso de autenticación. O deberían. Porque de momento nadie habló de autenticarse.

Pero eso ya es materia de otra entrada.

 

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s