Tutorial: cómo extraer datos de Twitter con Python

Curso de Python Intermedio: Comprehensions, Lambdas y Manejo de Errores

Toma las primeras clases gratis

COMPARTE ESTE ARTÍCULO Y MUESTRA LO QUE APRENDISTE

En este post aprenderás cómo extraer tweets de un trending topic de Twitter utilizando Python, guardarlos en un archivo de texto y luego obtener cuáles son las cuentas más influyentes y las palabras más repetidas del topic. Estos son los pasos que tienes que realizar:

  • Crear una aplicación de Twitter.
  • Conectarte a la API de Twitter usando Tweepy.
  • Extraer 3000 tweets de un trending topic y almacenarlos.
  • Obtener las cuentas más influyentes y palabras más repetidas.

Cómo funciona el API de Twitter

La mejor forma de extraer datos de Twitter es mediante su API. Esta tiene algunas limitaciones. Por ejemplo, se puede hacer hasta 300 requerimientos por aplicación cada 15 minutos; 500 mil tweets por proyecto, por mes; entre otros límites que podrás visualizar cuando tengas listo tu dashboard de desarrollador.

Para usar la API necesitas crear una cuenta de desarrollador y autenticarte. Para ello, realiza los siguientes pasos:

  1. Ingresa a Twitter Developers (para ello debes tener una cuenta en Twitter) y aplica a una cuenta de desarrollador. Esto es para que Twitter sepa qué uso la darás a su API y asegurarse de que no incumplirás sus políticas.
  2. Debes completar un formulario simple y unas preguntas específicas, en inglés, sobre el uso que le darás. En mi caso puse que la usaré para fines educativos implementando Social Media Listening con Python.
  3. Una vez termines ese proceso, debes verificar tu email y ya tendrás acceso al dashboard de desarrolladores.
  1. Para poder usar la API necesitas generar tus credenciales. Para ello crea un nuevo proyecto, deberás ponerle un nombre, descripción y propósito.
  2. Una vez lo hayas creado, te aparecerán tus keys en pantalla. Crea un archivo llamado credentials.py y guárdalas ahí porque Twitter no te las volverá a mostrar, solo te permitirá regenerarlas.
  1. Por último, para generar tus tokens, en tu dashboard principal debes ir a “keys and tokens” y en la parte final te aparecerá la opción de generar tus “Access Token and Secret”. De igual forma que con las keys, guarda tus tokens en credentials.py.

Y listo, ¡ya tienes todo lo que necesitas para empezar a extraer tweets y almacenarlos!

Si por alguna razón tu solicitud fue rechazada, al final del post comparto el repositorio de lo trabajado y ahí te dejaré 3 archivos de texto con miles de tweets para que, con fines educativos, puedas practicar todo lo que veremos.

Conectándote con Twitter

Ahora que ya tienes las keys y token, hay muchas maneras en las que te puedes conectar con Twitter. Te recomiendo hacerlo con una librería de Python llamada Tweepy, puesto que esta viene con varios métodos para aprovechar al máximo todo lo que permite hacer la API de Twitter.

En este post nos vamos a centrar en un par de métodos específicos, pero en la documentación de tweepy encontrarás detalladamente todas las cosas que puedes llegar a hacer, como obtener todos los tweets de un usuario, recibir tweets en tiempo real, ver detalladamente toda la información que guarda cada tweet, etc. Así que te invito a darle una mirada y mejorar o modificar todo lo que te enseñe a continuación.

Empecemos instalando la dependencia. Por buenas prácticas, te recomiendo hacerlo en un entorno virtual. Si aún no sabes cómo crear uno, revisa esta clase del curso de Python Intermedio.

Ahora que ya tienes el entorno creado y activado, puedes instalar Tweepy con pip, ejecutando en la consola:

pip install tweepy

Recapitulando, dentro de la carpeta de tu proyecto tienes un archivo llamado credentials.py que contiene lo siguiente:

API_KEY = 'YOUR_API_KEY'
API_SECRET_KEY = 'YOUR_API_SECRET_KEY'
ACCESS_TOKEN = 'YOUR_ACCESS_TOKEN'
ACCESS_TOKEN_SECRET = 'YOUR_ACCESS_TOKEN_SECRET'

Ahora vamos a crear un archivo nuevo en el que ejecutaremos la lógica del programa, yo le llamaré give_me_tweets.py. En este primero hay que importar las credenciales y tweepy:

import credentials
import tweepy

Ahora debes hacer el proceso de autenticación e ingresar a la API, para ello tweepy nos soluciona todo ejecutando estas líneas:

auth = tweepy.OAuthHandler(credentials.API_KEY, credentials.API_SECRET_KEY)
auth.set_access_token(credentials.ACCESS_TOKEN, credentials.ACCESS_TOKEN_SECRET)

api = tweepy.API(auth)

¡Eso es todo! Ahora ya estás conectado a la API de Twitter y tienes un mundo de posibilidades por delante. ¿Quieres hacer una prueba rápida? Ejecuta este código para imprimir tu timeline en la consola:

public_tweets = api.home_timeline()
for tweet in public_tweets:
    print(f'{tweet.user.screen_name}:\n{tweet.text}\n{"*"*60}')

Extrayendo y almacenando 3000 tweets de un topic

A partir de aquí vas a trabajar con tu propio topic, puede ser un hashtag (podrías escoger algún trending topic de tu país y luego analizar qué está pasando) o un término. En mi caso trabajaré con “One Piece”.

Necesitamos realizar un programa que almacene en un archivo de texto toda la cantidad de tweets que la API nos permita, esto es aproximadamente 3000 tweets cada 15 minutos, así que usemos ese límite. Para hacer esto usaremos un ciclo while y un contador que haga que el ciclo se detenga al llegar a 3000.

Para buscar tweets hay que usar el método api.search(). Si quieres profundizar sobre todos sus parámetros, acá te dejo la documentación. Pero en este caso nos vamos a enfocar en 4 parámetros: q: el topic que escogiste; lang: lenguaje; tweet_mode: extensión del tweet; max_id: tweets más antiguos que el especificado.

Traduciendo todo esto a código, quedaría de esta manera:

id = None
count = 0
while count <= 3000:
    tweets = api.search(q='one piece', lang='es', tweet_mode='extended', max_id=id)
    id = tweet.id

En cada clico se consultarán aproximadamente 15 tweets. Lo coloqué en lenguaje en español para que más adelante sea sencillo limpiar los datos. El tweet mode extended permite que se obtengan los tweets con 280 caracteres. Y por último es muy importante crear la variable id = None y al final del ciclo asignarle el id del último ciclo para que en cada ciclo se consulten solo los tweets más antiguos que los ya consultados en el último ciclo. Caso contrario, siempre se estarían obteniendo los mismos 15 tweets.

Ahora solo queda almacenar los archivos, para ello hay que crear un ciclo for justo después de que se haga la consulta. Acá hay que abrir un archivo con permisos para añadir más elementos y añadir en cada línea un nuevo tweet. Por último, como buena práctica, cerrar el archivo e imprimir en qué iteración está del ciclo para que cuando ejecutes el programa puedas ver cuántos tweets vas.

	for tweet in tweets:
	    f = open('./onepiece.txt', 'a', encoding='utf-8')
	    f.write(tweet.full_text + '\n')
	    f.close

Si quieres que no se te guarden los retweets, podrías añadir un condicional al principio del ciclo for que haga que se salte esa iteración si el tweet inicia con “RT”. Añadiendo eso, tu programa debería quedar de esta manera:

id = None
count = 0
while count <= 3000:
    tweets = api.search(q='one piece', lang='es', tweet_mode='extended', max_id=id)
    for tweet in tweets:
        if tweet.full_text.startswith('RT'):
            count += 1
            continue
        f = open('./onepiece.txt', 'a', encoding='utf-8')
        f.write(tweet.full_text + '\n')
        f.close
        count += 1
    id = tweet.id
    print(count)

Ahora solo debes ejecutar el programa en la consola y se te creará el archivo .txt y se irán agregando ahí todos los tweets hasta llegar a los 3000 o hasta que se detenga automáticamente por exceder el rate limit. Si pasa esto último, dentro de 15 minutos podrás seguir añadiendo más tweets.

¡Ya lograste obtener miles de tweets y almacenarlos, has progresado mucho! Pero no lo dejemos aquí, finalicemos esto haciendo un análisis de toda la información que ahora tenemos. Acompáñame 👇

Obteniendo palabras y cuentas más relevantes de un trending topic

Esta parte la realizaremos en un nuevo archivo que llamaré analyzer.py. Para empezar necesitamos excluir algunas palabras como los artículos porque siempre aparecerán como las palabras más usadas y no es lo que buscamos. Para ello te dejo aquí una lista de palabras que a mi criterio debería excluir:

exclude_words = ['el', 'la', 'los', 'las', 'un', 'una', 'unos', 'unas', 'al', 'del', 'lo', 'le', 'y', 'e', 'o', 'u', 'de', 'a', 'en', 'que', 'es', 'por', 'para', 'con', 'se', 'su', 'les', 'me', 'q', 'te', 'pero', 'mi', 'ya', 'cuando', 'como', 'estoy', 'voy', 'porque', 'he', 'son', 'solo', 'tengo', 'muy']

Crea un diccionario vacío, llamado  top_words, en el que luego añadiremos el top de palabras. Ahora deberás acceder con permisos de lectura al archivo en el que tienes almacenados los tweets, para a continuación, guardar cada palabra del archivo como key del diccionario y que su valor sea las veces que se repite en total entre todos los tweets.

Podrías hacerlo con un ciclo for que recorra cada línea del archivo, y en cada una elimine espacios, ponga todas las palabras en minúsculas, las divida una por una y las guarde en una lista llamada words.

top_words = {}
tweets_topic = open('./onepiece.txt', encoding='utf-8')
for line in tweets_topic:
    words = line.strip().lower().split()

Por último, para almacenar cada una de las palabras, utiliza otro ciclo for que itere por cada ciclo de la lista words. En este incluye la condicional para que no se incluyan las palabras excluidas.

Para añadir cada palabra del ciclo al diccionario  top_words, colócalas como key del diccionario. Para asignar su valor, usa el método get, el cual en su primer parámetro evalúa si ya existe esa key, en caso de que sí exista, deja su mismo valor anterior, pero en caso de que no, en su segundo parámetro le asigna un valor. Y luego, añade un + 1 para indicar que se encontró una vez más la palabra. El código final quedaría algo así:

top_words = {}
tweets_topic = open('./onepiece.txt', encoding='utf-8')
for line in tweets_topic:
    words = line.strip().lower().split()
    for word in words:
        if word notin exclude_words:
            top_words[word] = top_words.get(word, 0) + 1

Si te sientes algo confundido, prueba imprimir en la consola words y top_words, para que veas qué contienen cada una. También prueba quitar el + 1 al asignar los valores al diccionario, para que notes como sin esa suma, no se contarán nuevas palabras.

Ahora vamos a ordenar el diccionario de mayor a menor para que sea más sencillo obtener las cuentas y palabras más usadas. Esto se puede lograr con el método sorted. Pasándole como primer parámetro el diccionario. El segundo parámetro indica con base a qué será ordenado, así que le indicaremos que lo haga por valor. Y el tercer parámetro es para indicar que ordene de mayor a menor porque por defecto ordena de menor a mayor.

most_used_words = sorted(top_words, key=top_words.get, reverse=True)

Teniendo el diccionario ordenado, ya está todo listo para imprimir los 10 usuarios más mencionados en este topic. Cuando se menciona un usuario, la palabra inicia por “@”, así que usaremos el método startwith para encontrarlos. Por lo tanto, todo lo que necesitamos es un ciclo que imprima los 10 primeros valores, seguidos de su key en most_used_words, que cumplan con la condición de iniciar con “@”.

count_u = 0
for word in most_used_words:
    if count_u < 10and word.startswith('@'):
        print(top_words[word], word)
        count_u += 1
 
print('*'*40) # esto es para separar visualmente la información

Ya obtuvimos los 10 usuarios más relevantes. Para finalizar, de la misma manera que con los usuarios, se pueden imprimir las palabras más usadas, solo que esta vez eliminando la condicional de empezar con “@” y aumentando a 20 el total de palabras a imprimir.

count = 0
for word in most_used_words:
    if count < 20:
        print(top_words[word], word)
        count += 1

¡Eso es todo! Solo ejecuta analyzer.py en la consola y podrás visualizar tus resultados. Déjame en los comentarios de este post qué es lo que obtuviste y tu análisis de lo que estás viendo.

En mi caso encontré algunas cosas interesantes como que las personas mencionan mucho a Naruto cuando hablan de One Piece. La palabra “yo” es la #8 más usada y “Luffy” (el personaje principal) está en la posición #9. La palabra “no” es 3.33x veces más usada que la palabra “si”. Y que la cuenta más mencionada es @daitedice, que irónicamente tiene una foto de perfil de Naruto.

Como lo prometido es deuda, acá te dejo el repositorio en el que agregué todos los archivos que usé y, en caso de que te hayan rechazado la solicitud a la API de twitter, dejé 3 archivos con miles de tweets en cada uno para que practiques. Uno es onepiece.txt, que es con el que yo trabajé. El otro es aborto.txt, en donde recopilé un trending topic de mi país, Ecuador, en donde se aprobó una ley sobre el tema. Y finalmente, añadí uno sobre platzi.txt. Recuerda que su uso es con fines educativos.

Si no entendiste algunas cosas del código de este post, te recomiendo ir a tomar el Curso de Python Intermedio. Este curso te dará todas las bases que necesitas para entender todo lo que hicimos y mucho más. Toma el curso y pronto estaré trayendo tutoriales más avanzados para que pongas en práctica todo lo nuevo que descubras. ¡Y nunca pares de aprender! 💚

Curso de Python Intermedio: Comprehensions, Lambdas y Manejo de Errores

Toma las primeras clases gratis

COMPARTE ESTE ARTÍCULO Y MUESTRA LO QUE APRENDISTE

0 Comentarios

para escribir tu comentario

Artículos relacionados