Cómo obtener datos de Twitter. Hacer todo esto con Tweepy (3/5)

Tomás Reneboldi
6 min readSep 13, 2020

--

En esta nota en varias partes vamos a bajar data de Twitter (todos los tweets de un usuario con la cantidad de likes, retweets y comentarios que tuvo) y a hacer que esos datos se actualicen automáticamente sin nuestra intervención. Para eso, vamos a ver cómo lidiar con Twitter, qué data está disponible, cómo la guardamos, dónde y cómo lo automatizamos.

Vamos a trabajar con la API de Twitter, Jupyter Notebooks, Python, Tweepy, Google Sheets, GSpread y Google Cloud Platform. Lo bueno de este ejemplo es que replicarlo con otros datos u otra red social nos va a resultar bastante pavo si logramos llegar al final.

En esta tercera entrega, cómo usamos Tweepy para conectarnos a la API, bajar información y darle un formato adecuado.

Partes de la nota

1. La API
2. Credenciales y conexión con Jupyter Notebook
3. Hacer todo esto con Tweepy
4. Pasar los datos a una Sheet con GSpread
5. Automatizarlo con crontab o Google Cloud

Repasando…

En la primera parte de la nota planteamos el desafío de obtener data de Twitter para alimentar una base de datos. Vimos qué era una API y cómo funcionaba la de Twitter. En la segunda, creamos una cuenta de desarrollador, obtuvimos las claves de acceso (tokens) y vimos cómo conectarnos a la API desde Jupyter Notebook para obtener una cantidad de tweets según una palabra clave. En esta tercera entrega vamos a usar Tweepy, el wrapper más utilizado en Python para hacer esto mismo y darle formato a los datos.

¿Qué es y por qué tweepy?

Tweepy es una librería de Python que nos va a permitir realizar lo mismo que en el paso anterior pero de una forma mucho más rápida y eficiente. En general este tipo de conectores están mantenidos por la comunidad. Esto hace que estén actualizados con las últimas modificaciones que se hicieron a la API y no tengamos que preocuparnos por mantenernos al día de estos cambios.

Tweepy nos va a proveer 2 grandes ventajas. La primera tiene que ver con la autenticación que veremos es mucho más sencilla. La segunda tiene que ver con el método Cursor que nos va a permitir lidiar con gran cantidad de datos mucho más fácilmente.

¿Cómo funciona?

Habíamos visto en la entrega anterior de esta nota que al trabajar con datos de Twitter vía API llevamos a cabo los siguientes pasos:

  1. Crear una cuenta de desarrollador / aplicación
  2. Conectarnos a la API con esos permisos
  3. Solicitar la información deseada
  4. Darle un formato adecuado

En este caso, nos salteamos el paso 1 porque ya lo tenemos hecho y veremos cómo realizar en Tweepy cada uno de los otros.

2) Conectarnos a la API con los permisos

Decíamos que en Tweepy tenemos un método mucho menos engorroso para conectarnos a la app. Podemos usar tanto el método OAuth 1.0 como el OAuth 2.0. Recordemos que la diferencia entre uno y otro es solo de límites.

# Instalamos la librería
!pip install tweepy
# Importamos la librería
import tweepy
# Pasamos los tokens de cliente
consumer_key = “[Ingresamos acá la clave]”
consumer_secret = “[Ingresamos acá la clave]”
# Si queremos usar OAuth 1.0
access_token = “[Ingresamos acá la clave]”
access_token_secret = “[Ingresamos acá la clave]”

Si queremos autenticarnos con OAuth 1.0:

# Creamos un handler con las 2 claves de cliente
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
# Pasamos los tokens de acceso
auth.set_access_token(access_token, access_token_secret)
# Guardamos la autorizacion a la API en una variable
api = tweepy.API(auth)

Si queremos autenticarnos con OAuth 2.0:

# Creamos el handler App
auth = tweepy.AppAuthHandler(consumer_key, consumer_secret)
# Guardamos en una variable
api = tweepy.API(auth)

Vemos que en ambos casos creamos la autorización con un método de la librería Tweepy (OauthHandler en un caso y AppAuthHandler en otro) pasando las credenciales del cliente. Para el caso de OAuth 1.0, también tenemos que setear el token de acceso. En el caso de OAuth 2.0 no es necesario pasarle el bearer token ya que Tweepy lo infiere de las otras 2 claves que le pasamos. El último paso es crear una variable que almacene la autorización con el método API. Esta variable (acá llamada api) es la que vamos a usar para acceder a los distintos módulos de la API de Tweeter.

3) Solicitar la información deseada

Una vez que tenemos el objeto api, ya podemos usar cualquiera de los módulos. Vamos a ver un caso sencillo con el módulo de Search y otro más complejo con el user_timeline, que sería la línea de tiempo de un usuario específico.

# Busqueda sencilla usando Search
api.search(q=”tweepy”)[0].text

¡Voilá! Nuestra primer consulta con Tweepy

Vamos a ver qué es lo que hicimos. Usamos el objeto api y el módulo de Search con la query que queremos realizar. Nos va a devolver una serie de tweets que correspondan con esa búsqueda. En este caso, nos quedamos solo con el primero (siempre se cuenta a partir de 0) y le pedimos que de toda la información disponible nos traiga solo el texto del tweet.

Ahora vamos a probar otro módulo, el de user_timeline. Para eso, tenemos que pasarle el screen name, que es el nombre del usuario en Twitter como aparece en la URL.

# Usamos el módulo user_timeline
api.user_timeline(screen_name = “ItaiHagman”)[0].text

Como leemos en la documentación, el módulo user_timeline solo nos devuelve los últimos 20 resultados. Para la mayoría de las tareas que podemos realizar con datos de Tweeter, esto es claramente insuficiente. Acá es cuando recurrimos a la segunda gran ventaja de Tweepy: el método Cursor. Esta función nos permite hacer sucesivas consultas a la API hasta que completemos la información deseada. A su vez, podemos pedirle items o pages. En este caso, items nos va a devolver cada tweet que es lo que buscamos.

# Usamos el Cursor dentro de un for
for tweet in tweepy.Cursor(api.user_timeline, screen_name = “ItaiHagman”).items():
print(tweet.text)

¡Voilá! Toda la información que queremos con solo 5 líneas de código.

4) Darle un formato adecuado

Ahora que ya pudimos conectarnos a la API via Tweepy y que pudimos traer toda la información que queremos, es hora de pensar mejor en el formato que vamos a darle a los datos.

Para eso, vamos a usar la librería estándar de Python para manipulación de datos en este formato: Pandas. Hay muchas formas de hacer esto, acá dejamos una que resulta bastante sencilla e intuitiva para disponibilizar la data que bajemos de Twitter en un dataframe y usarlo en el propio Jupyter Notebook, descargarlo como CSV o, como veremos en la próxima entrega, conectarlo con una Google Sheet.

# Iniciamos un array que va a contener los datos
simple_list = []
# Iniciamos el for con Cursor
# Usamos algunos parámetros extra para excluir respuestas, retweets y traer el texto completo de cada tweet
for status in tweepy.Cursor(api.user_timeline, screen_name = “ItaiHagman”, exclude_replies = True, include_rts = False, tweet_mode=”extended”).items()):
# Agregamos el texto, fecha, likes, retweets y hashtags al array
simple_list.append([status.full_text, status.created_at, status.favorite_count, status.retweet_count, [h[“text”] for h in status.entities[“hashtags”]]])
# Convertimos el array en un DataFrame y nombramos las columnas
simple_list = pd.DataFrame(simple_list, columns=[“Text”, “Created at”, “Likes”, “Retweets”, “Hashtags”])
# Guardamos en el directorio en que estamos trabajando
simple_list.to_csv("test.csv")

En este caso lo que hacemos es crear un array donde iremos almacenando toda la información y que después convertiremos en un data frame de Pandas. A continuación, usamos el método Cursor para traer toda la data. En este caso usamos algunos parámetros extra para excluir tanto las respuestas como los retweets y traer el texto entero de cada tweet (y no la versión resumida que encontramos en el parámetro text). Vamos almacenando esta información y, al final, pasamos el array a un data frame con el nombre correcto en cada columna.

Este data frame queda disponible para seguir trabajandolo en el Jupyter Notebook o, como hacemos en la última línea, para exportarlo en CSV. Pero si lo que queremos es, por ejemplo, guardarlo en una Google Sheet, tenemos que esperar a la próxima entrega.

--

--

Tomás Reneboldi

Head of Operations LATAM at Digodat - MightyHive // Economist and data scientist (UBA) // Twitter: @TReneboldi