Manejando los datos de la API Twitter en Python [Parte 1]


Por que cree esta entrada y una nueva serie si ya vamos bastante adelantados con la serie de Jugando con la API de Twitter en Python, las respuesta es sencilla, antes de pasar a Histogramas y léxico de las palabras de los Twiteros y las tendencias, que me fascino, quiero dejar en claro que hay muchas formas de hacer las cosas con estas API. La que todos usan, es decir usar algunas rutinas ya definidas y la que yo quiero usar crear mis propias rutinas y Agregar teorías de Grafos y Aprendizaje automático en mi pagina con Django o algún modulo de Odoo… es por eso que he querido ahondar en el tema de como nos genera los datos La API en nuestro programa, al principio pensé que había comprendido pero luego que quise hacer algunas cosas casi mágicas me di cuenta que no entendía muy bien…

Luego de algún tiempo me di cuenta que Cuando cambiamos de JSON a un diccionario en Python, lo que realmente se obtiene es una lista con muchos diccionarios y que la manera en que normalmente entramos a un diccionario no funciona, esto debido a que primero debemos llamar a la lista y luego llamar al diccionario 😀 es un objeto mas complejo de lo normal…

De verdad no quiero abrumarlos con la información que sale de todo el código que vamos a generar aquí, es por esto que les recomiendo ir haciendo los ejemplos y así ir viendo las salidas aunque las que estén legibles si las colocare 😀

Aquí arrancamos con el código entonces: el siguiente es un código sencillo que nos dice cuales son las lleves de los diccionarios que están en la lista del Json que sacamos con este código que es nuestra base:

 

import twitter, json

CONSUMER_KEY = 'Datos de A'

CONSUMER_SECRET = 'Datos de B'

OAUTH_TOKEN = 'Datos de C'

OAUTH_TOKEN_SECRET = 'Datos de D'

WORL_WOE_ID = 1 

US_WOE_ID = 23424977 

auth = twitter.oauth.OAuth( OAUTH_TOKEN , OAUTH_SECRET, CONSUMER_KEY , CONSUMER_SECRET ) 

twitter_api = twitter.Twitter(auth=auth) 

datos_de_statuses_home_timeline = twitter_api.statuses.home_timeline() 

print datos_de_statuses_home_timeline 

print len(datos_de_statuses_home_timeline) 

La salida de este código no es para nada simpático, aunque podemos ver el parecido con los diccionarios en python(aunque no se ve nada :D), ademas muy muy largo y poco practico, aunque podemos visualizar las etiquetas que vamos a usar al final, este código lo podemos cambiar por el siguiente:

 

import twitter, json

CONSUMER_KEY = 'Datos de A'

CONSUMER_SECRET = 'Datos de B'

OAUTH_TOKEN = 'Datos de C'

OAUTH_TOKEN_SECRET = 'Datos de D'


auth = twitter.oauth.OAuth( OAUTH_TOKEN , OAUTH_TOKEN_SECRET, CONSUMER_KEY , CONSUMER_SECRET )

WORL_WOE_ID = 1

US_WOE_ID = 23424977

twitter_api = twitter.Twitter(auth=auth)


datos_statuses_home_time_line = twitter_api.statuses.home_timeline() # Este dato sale de statuses/home_timeline de la API de Twitter

print len(datos_de_statuses_home_timeline)

diccionario_1_de_home_timeline = datos_de_statuses_home_timeline[0]

for k,v in diccionario_1_de_home_timeline.items():
    if k == "user":
      f = {}
      f =dict(v)
      for k,v in f.items():
          print "%s -> %s" %(k,v)

 La cosa se complica :D, no no es para tanto, no te asustes, vamos a repasar lo nuevo ya que en las lineas que siguen y en las entradas siguientes vamos sumergirnos en la API de twitter pero de una manera mas interesante y educativa 😀

Primero nos encontramos con esta linea:

datos_statuses_home_time_line = twitter_api.statuses.home_timeline()

Quiero que veamos muy bien esta linea ya que es la que nos va a permitir descargar los datos de la API y refinarlos para sacar datos interesantes desde aquí… bueno vemos que nos conectamos al objeto twitter_api.statuses.home_timeline() y aqui esta la clave de los datos que vamos a obtener, podemos ver todo lo que nos ofrece la API publica de Twitter aqui https://dev.twitter.com/rest/public es interesante que nosotros solo vamos a usar GET, pero solo este tipo de consulta nos va a permitir sacar todos lo datos que podemos necesitar :D, una cosa importante con esa linea es que nos estamos conectando a statuses/home_timeline esta parte de la API en realidad no nos dara la gran parte de la información que necesitamos pero podemos aprender de ella, para lograr entender mejor las API hice esta serie 😀


datos_de_statuses_home_timeline = twitter_api.statuses.home_timeline() #0

diccionario_1_de_home_timeline = datos_de_home_timeline[0] # 1
for k,v in diccionario_1_de_home_timeline.items():  #2
    print "Esta es la Keys: ",k  #3
# Recuerda que k es la Clave del diccionario Ademas son 20 y estamos usando la 1 tuit = mundo[0]
    print "La llave %s ->  y el Valor %s" %(k,v) #4
for k,v in diccionario_1_de_home_timeline.items():  #5
    if k == "user":   #6
      f = {}  #7
      f =dict(v)   #8
      for k,v in f.items():   #9
          print "%s -> %s" %(k,v)   #10

 Estas lineas las he numerado para irlas explicando una a una, en la linea 0 tenemos todos los datos que podemos surfear, recuerda que si quieres datos en especifico hay llamados específicos para cada tipo de datos, hay algunos datos que se repiten pero si necesitas algo especifico, debes saber donde buscar 😀

Si ejecutamos el código anterior completo obtendremos 2 bloques de código muy importantes, esta es la salida para el código de las lineas 2, 3 y 4 :

 20
Esta es la Keys: contributors
y el Valor: None
Esta es la Keys: truncated
y el Valor: False
Esta es la Keys: text
y el Valor: 📰 El Barça busca aixecar la Supercopa d’Espanya. Tots els detalls de la prèvia https://t.co/qBdHLUHKSR #FCBlive https://t.co/oKIgZ4SGpX
Esta es la Keys: is_quote_status
y el Valor: False
Esta es la Keys: in_reply_to_status_id
y el Valor: None
Esta es la Keys: id
y el Valor: 765921200941965312
Esta es la Keys: favorite_count
y el Valor: 12
Esta es la Keys: source
y el Valor: <a href="http://www.hootsuite.com" rel="nofollow">Hootsuite</a>
Esta es la Keys: retweeted
y el Valor: False
Esta es la Keys: coordinates
y el Valor: None
Esta es la Keys: entities
y el Valor: {u'symbols': [], u'user_mentions': [], u'hashtags': [{u'indices': [103, 111], u'text': u'FCBlive'}], u'urls': [{u'url': u'https://t.co/qBdHLUHKSR', u'indices': [79, 102], u'expanded_url': u'http://ow.ly/g7nC303jDGm', u'display_url': u'ow.ly/g7nC303jDGm'}], u'media': [{u'expanded_url': u'http://twitter.com/FCBarcelona_cat/status/765921200941965312/photo/1', u'display_url': u'pic.twitter.com/oKIgZ4SGpX', u'url': u'https://t.co/oKIgZ4SGpX', u'media_url_https': u'https://pbs.twimg.com/media/CqEZRXaXYAIABf7.jpg', u'id_str': u'765921197762764802', u'sizes': {u'small': {u'h': 383, u'resize': u'fit', u'w': 680}, u'large': {u'h': 563, u'resize': u'fit', u'w': 1000}, u'medium': {u'h': 563, u'resize': u'fit', u'w': 1000}, u'thumb': {u'h': 150, u'resize': u'crop', u'w': 150}}, u'indices': [112, 135], u'type': u'photo', u'id': 765921197762764802L, u'media_url': u'http://pbs.twimg.com/media/CqEZRXaXYAIABf7.jpg'}]}
Esta es la Keys: in_reply_to_screen_name
y el Valor: None
Esta es la Keys: in_reply_to_user_id
y el Valor: None
Esta es la Keys: retweet_count
y el Valor: 2
Esta es la Keys: id_str
y el Valor: 765921200941965312
Esta es la Keys: favorited
y el Valor: False
Esta es la Keys: user
y el Valor: {u'follow_request_sent': False, u'has_extended_profile': False, u'profile_use_background_image': True, u'default_profile_image': False, u'id': 14727959, u'profile_background_image_url_https': u'https://pbs.twimg.com/profile_background_images/512636531928883200/wmRLAK2x.jpeg', u'verified': True, u'profile_text_color': u'464646', u'profile_image_url_https': u'https://pbs.twimg.com/profile_images/716628133013811204/ziN7ren9_normal.jpg', u'profile_sidebar_fill_color': u'CBC9C4', u'entities': {u'url': {u'urls': [{u'url': u'https://t.co/m2GNPoXDjR', u'indices': [0, 23], u'expanded_url': u'http://www.fcbarcelona.cat', u'display_url': u'fcbarcelona.cat'}]}, u'description': {u'urls': []}}, u'followers_count': 5308158, u'profile_sidebar_border_color': u'FFFFFF', u'id_str': u'14727959', u'profile_background_color': u'000000', u'listed_count': 10679, u'is_translation_enabled': False, u'utc_offset': 7200, u'statuses_count': 69545, u'description': u"Tota l'actualitat i la informaci\xf3 del FC Barcelona, M\xe9s que un club. Twitter oficial del FC Barcelona en catal\xe0.", u'friends_count': 60, u'location': u'Barcelona', u'profile_link_color': u'9B0003', u'profile_image_url': u'http://pbs.twimg.com/profile_images/716628133013811204/ziN7ren9_normal.jpg', u'following': True, u'geo_enabled': False, u'profile_banner_url': u'https://pbs.twimg.com/profile_banners/14727959/1464900239', u'profile_background_image_url': u'http://pbs.twimg.com/profile_background_images/512636531928883200/wmRLAK2x.jpeg', u'screen_name': u'FCBarcelona_cat', u'lang': u'ca', u'profile_background_tile': False, u'favourites_count': 3, u'name': u'FC Barcelona', u'notifications': False, u'url': u'https://t.co/m2GNPoXDjR', u'created_at': u'Sat May 10 21:12:04 +0000 2008', u'contributors_enabled': False, u'time_zone': u'Madrid', u'protected': False, u'default_profile': False, u'is_translator': False}
Esta es la Keys: geo
y el Valor: None
Esta es la Keys: in_reply_to_user_id_str
y el Valor: None
Esta es la Keys: possibly_sensitive
y el Valor: False
Esta es la Keys: possibly_sensitive_appealable
y el Valor: False
Esta es la Keys: lang
y el Valor: und
Esta es la Keys: created_at
y el Valor: Wed Aug 17 14:40:19 +0000 2016
Esta es la Keys: in_reply_to_status_id_str
y el Valor: None
Esta es la Keys: place
y el Valor: None
Esta es la Keys: extended_entities
y el Valor: {u'media': [{u'expanded_url': u'http://twitter.com/FCBarcelona_cat/status/765921200941965312/photo/1', u'display_url': u'pic.twitter.com/oKIgZ4SGpX', u'url': u'https://t.co/oKIgZ4SGpX', u'media_url_https': u'https://pbs.twimg.com/media/CqEZRXaXYAIABf7.jpg', u'id_str': u'765921197762764802', u'sizes': {u'small': {u'h': 383, u'resize': u'fit', u'w': 680}, u'large': {u'h': 563, u'resize': u'fit', u'w': 1000}, u'medium': {u'h': 563, u'resize': u'fit', u'w': 1000}, u'thumb': {u'h': 150, u'resize': u'crop', u'w': 150}}, u'indices': [112, 135], u'type': u'photo', u'id': 765921197762764802L, u'media_url': u'http://pbs.twimg.com/media/CqEZRXaXYAIABf7.jpg'}]}

 

Algo de vital importancia es saber que tenemos 20 diccionarios en “datos_de_statuses_home_timeline” y solo estamos usando el primero “datos_de_statuses_home_timeline[0]” recuerda que los datos recibidos de la API es una lista de diccionarios, no nos interesa saber que contiene de momento la API de  Twitter en statuses/home_timeline por lo que no vamos a estudiar la salida de este programa….

La salida del resto del código es esta:

 
follow_request_sent -> False
has_extended_profile -> False
profile_use_background_image -> True
time_zone -> Madrid
id -> 14872237
description -> Cuenta oficial del Real Madrid C.F., ENGLISH @realmadriden, FRANÇAIS @realmadridfra, العربيه @realmadridarab, 日本語 @realmadridjapan.
verified -> True
entities -> {u'url': {u'urls': [{u'url': u'http://t.co/VGvV5OwvOJ', u'indices': [0, 22], u'expanded_url': u'http://www.realmadrid.com', u'display_url': u'realmadrid.com'}]}, u'description': {u'urls': []}}
profile_image_url_https -> https://pbs.twimg.com/profile_images/2482198530/iql2hfa8kks5q78q4ag3_normal.jpeg
profile_sidebar_fill_color -> C7D1C7
is_translator -> False
geo_enabled -> True
profile_text_color -> 050000
followers_count -> 20356161
protected -> False
id_str -> 14872237
default_profile_image -> False
listed_count -> 39338
lang -> es
utc_offset -> 7200
statuses_count -> 52723
profile_background_color -> 073763
friends_count -> 49
profile_link_color -> 3B94D9
profile_image_url -> http://pbs.twimg.com/profile_images/2482198530/iql2hfa8kks5q78q4ag3_normal.jpeg
notifications -> False
profile_background_image_url_https -> https://pbs.twimg.com/profile_background_images/509620749326241792/r7YHi9nk.jpeg
profile_banner_url -> https://pbs.twimg.com/profile_banners/14872237/1471430693
profile_background_image_url -> http://pbs.twimg.com/profile_background_images/509620749326241792/r7YHi9nk.jpeg
name -> Real Madrid C. F.
is_translation_enabled -> True
profile_background_tile -> False
favourites_count -> 15
screen_name -> realmadrid
url -> http://t.co/VGvV5OwvOJ
created_at -> Thu May 22 19:25:51 +0000 2008
contributors_enabled -> False
location -> Madrid, Spain
profile_sidebar_border_color -> FFFFFF
default_profile -> False
following -> True
 

Ahora si, lo que nos interesa, luego de elegir el primer diccionario de la lista para solo verlo necesitamos tomar dato a dato con un bucle for, así vamos a generar la Keys y el Values recuerda que podemos generar tuplas ejecutando los métodos de un diccionario, lo que estamos haciendo es crear un diccionario para aplicarle sus métodos 😀

Desde la Linea 5 nos damos cuenta que un diccionario contiene otro diccionario y es por esto que si quisiéramos los datos de “user” ahora necesitaríamos, gestionar el diccionario 1 con un bucle for “linea 5”, Exigir como condición que lo que queremos e son los datos de la etiqueta “user” es decir “linea 6”, crear e introducir los datos de un diccionario a otro(para hacerlo mas rápido) “lineas 7 y 8”, y luego que nos imprima los datos que podemos obtener de la etiqueta seleccionada “ultimas lineas”

De verdad no quiero sobrecargarte con tanta información y es por esto que voy a dividir las entradas como siempre, para la próxima vamos a estudiar lo que necesitamos y vamos a generar datos interesantes…

Que Dios te Bendiga y te cuide en todos tus caminos, para el sea la Gloria…

Paginas de ayuda para esta entrada:

Diccionario en python, con ejemplos

https://programacionrecreativa.wordpress.com/2014/08/21/programar-twitter-con-python-iv/comment-page-1/#comment-6

 

 

Anuncios

Un pensamiento en “Manejando los datos de la API Twitter en Python [Parte 1]

  1. Pingback: Jugando con la API de Twitter [Parte 4] | La Shell del Bit Pegajoso

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 )

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 )

Google+ photo

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

Conectando a %s