Cómo obtener datos de Twitter. Credenciales y conexión con Jupyter Notebook (2/5)
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, GSPandas 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 segunda entrega, cómo nos conectamos a la API de Twitter y descargamos la data en Jupyter Notebooks o en nuestra compu.
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
¿Qué necesito?
En esta entrega vamos a crear las credenciales, conectarnos a la API y descargar la información. Para eso, vamos a trabajar con Jupyter Notebooks. Si no sabes qué son, podés consultar acá. Si ya lo tenés configurado, pongamos manos a la obra.
Decíamos la vez pasada que al trabajar con APIs, en general el proceso es el siguiente:
- Crear una cuenta de desarrollador / aplicación
- Conectarnos a la API con esos permisos
- Solicitar la información deseada
- Darle un formato adecuado
1) Crear una cuenta de desarrollador / aplicación
En el caso de las redes sociales, en general tenemos que acceder con nuestra cuenta personal. Una vez logueados, pedir permisos de desarrollo o “crear una aplicación”. En algunos casos este proceso es más engorroso, involucra formularios y justificaciones. En todos los casos, el resultado final es una serie de claves o tokens que nos van a permitir utilizar la API.
¿Qué son los tokens? No son más que una contraseña o identificador únicos para cada usuario / desarrollador / apliación. Generalmente estos sitios nos proveen 2 tokens: uno público y otro secreto. Tenemos que almacenarlos en un lugar seguro ya que nos van a permitir identificarnos y mostrar que tenemos permisos suficientes para pedir la información.
En Twitter, entonces, el primer paso es crear una cuenta de desarrollo:
Para crear la cuenta nos va a pedir un montón de información, entre ellas una URL (podemos poner https://localhost) y un website (podemos poner cualquier cosa). Una vez que tenemos la cuenta, tenemos un proyecto por default y nos va a pedir que además creemos una app, para la cual recibiremos los tokens correspondientes.
A su vez, dentro de las opciones de la app, podemos ir a “Keys and tokens” y proceder a crear los tokens que nos faltan (Access token and secret).
Ahora sí, tenemos todo lo que necesitamos. Para no marearnos con los tokens, veamos por qué tenemos 5 de ellos y para qué los vamos a necesitar.
Client credentials:
- Consumer key == API key
- Consumer secret == API secret
Token credentials / Authentication tokens:
- Access token (OAuth1)
- Access token secret (OAuth1)
- Bearer Token (OAuth2)
Los tokens de cliente son los que nos permiten identificar como usuarios. Son los básicos y los primeros que nos otorga Twitter cuando creamos la cuenta de desarrollador. Por otro lado, tenemos los tokens de autenticación que son los específicos de la aplicación que nos van a permitir solicitar la información a la API.
¿Por qué hay 2 tokens de autentificación distintos? Es una buena pregunta. La respuesta es que son 2 mecanismos distintos de autenticación (OAuth 1.0 y OAuth 2.0), cada uno con protocolos distintos de seguridad y, por ende, también con distintas atribuciones. Acá tenemos un cuadro comparativo entre ambos:
Toda esta parafernalia de tokens es específica de Twitter, puede que en otros sitios o plataformas sea más sencillo. Por lo pronto, guardamos los 5 tokens ya que para algunos métodos vamos a usar los del cliente + OAuth 1.0 mientras que para otros vamos a usar los del cliente + OAuth 2.0.
Si te interesa profundizar en esto, hay mucha documentación sobre autenticación y en el código en GitHub podemos seguir el paso a paso de cómo autenticar dentro del entorno de Jupyter Notebook, sin necesidad de hacerlo desde el sitio de Developer de Twitter.
2) Conectarnos a la API con esos permisos
3) Solicitar la información deseada
Vamos a repasar nuestra situación hasta el momento. Ya tenemos creada nuestra cuenta de desarrollo, creamos un proyecto y una app y conseguimos todas las contraseñas (tokens) para poder acceder a la información. El próximo paso es ir a Jupyter Notebook.
En este caso, el paso 2 y el paso 3 van juntos, ya que en el mismo momento en que le pedimos información a la API le decimos quiénes somos y cuáles son nuestros permisos. Vamos a ver que para el caso de Tweepy, esto lo hacemos en 2 momentos diferentes.
Como comentamos al principio de la primer nota, pedir información a una API se trata de construir el pedido de la manera correcta. De lo que se trata es de establecer un diálogo con la URL (un request) y decirle “Hola URL, ¿qué tal? Soy el usuario tal, tengo todos estos permisos y te pido toda esta información”. Si todo sale bien, la URL nos va a devolver una respuesta, generalmente en formato JSON, que debemos almacenar para el próximo paso.
Para hacer todo esto en el entorno de Python en Jupyter Notebook usamos una librería llamada request (también podríamos usar curl). En general, cuando dialogamos con URLs tenemos 2 métodos posibles: POST y GET. El primero lo usamos cuando queremos pasar cierta información y el segundo cuando queremos obtenerla. En este caso, vamos a usar el método GET.
Para este primer ejemplo vamos a usar el módulo Search de la API de Twitter que nos permite buscar tweets en base a alguna palabra o hasthag. Lo que necesitamos entonces es la URL (endpoint), los headers de autorización (con el token) y la consulta (query) propiamente dicha. Para saber cuáles son estos requisitos y cómo construirlos, podemos consultar la documentación.
# Declaramos el bearer token
bearer_token = “[INGRESAMOS ACÁ EL BEARER TOKEN]”# Usamos la API de search
url = ‘https://api.twitter.com/1.1/search/tweets.json'# Pasamos el bearer token
headers = {
‘Authorization’: ‘Bearer {}’.format(bearer_token)
}# Pasamos los parametros deseados
params = {
‘q’: ‘CFK’, # La query que queremos realizar
‘result_type’: ‘recent’, # Como ordenamos los resultados
‘count’: 200 # Cuantos queremos obtener
}# Generamos el request con el método GET
search_resp = requests.get(url, headers=headers, params=params)
¡Felicitaciones! Ya tenemos la respuesta de nuestro primer request. Podemos probar con print(search_resp) para ver qué forma tiene.
4) Darle un formato adecuado
Una vez que tenemos el request hecho y obtuvimos la información, necesitamos darle una forma entendible. Si probaste con print habrás visto que la información era un lio y estaba llena de cosas. Un paso importante, entonces, es entender de qué manera está construida o estructurada esa información para quedarnos solamente con lo que nos interese. Para eso vamos a usar una librería de Python para manipular archivos JSON.
# Importamos json para manipular el contenido del request
import json# Almacenamos la informacion que viene en content en un archivo JSON
data = json.loads(search_resp.content)
Una vez que cargamos el archivo JSON, podemos hacer un print(data) para ver de una manera más entendible la forma y estructura de los mismos. A partir de esta exploración, vemos que en “statuses” está la información de cada uno de los tweets. Y dentro de cada tweet, en “text” tenemos el texto del mismo. Por eso, para imprimir los textos de los tweets, usamos un for.
# De cada tweet, imprimimos solo el texto
for tweet in data[‘statuses’]:
print(tweet[‘text’],’\n’)
¡Voilá! Nuestra primer consulta exitosa a datos de Tweeter.
¿Qué nos falta ahora? Entender para qué sirve cada uno de los módulos de la API (acá usamos Search pero hay otros), descubrir toda la información que nos devuelve cuando hacemos una consulta y almacenarla de una manera prolija y ordenada. Sin embargo, para hacer todo esto de una manera más sencilla tenemos los wrappers.
En la próxima nota veremos en profundidad Tweepy, el wrapper más utilizado en Python para trabajar con información de Tweeter. Link a Hacer todo esto con Tweepy (3/5)