Accediendo a la API de Twitter con Python

    Introducci贸n

    Una cosa que disfrutan los desarrolladores de Python es seguramente la gran cantidad de recursos desarrollados por su gran comunidad. Las interfaces de programaci贸n de aplicaciones (API) creadas por Python son algo com煤n en los sitios web. Es dif铆cil imaginar que cualquier servicio web popular no haya creado una biblioteca de API de Python para facilitar el acceso a sus servicios. Se pueden encontrar algunas ideas de tales API para algunos de los servicios web m谩s populares aqu铆. De hecho, “envoltorio de Python” es un t茅rmino m谩s correcto que “API de Python”, porque una API web normalmente proporcionar铆a una interfaz de programaci贸n de aplicaciones general, mientras que las bibliotecas espec铆ficas del lenguaje de programaci贸n crean c贸digo para “envolverlo” en funciones f谩ciles de usar. . De todos modos, usaremos ambos t茅rminos indistintamente a lo largo de este art铆culo.

    En esta publicaci贸n de blog nos concentramos en API de Twitter, muestre c贸mo va la configuraci贸n de sus credenciales con Twitter y compare algunos envoltorios de Python seg煤n el compromiso de la comunidad. Luego, mostramos algunos ejemplos del uso de la API de Twitter para buscar tweets y crear un flujo de tweets en tiempo real sobre un tema en particular. Finalmente, exploraremos los datos guardados.

    Una descripci贸n general de la API de Twitter

    Hay muchas API en la plataforma de Twitter con las que los desarrolladores de software pueden interactuar, con la m谩xima posibilidad de crear sistemas totalmente automatizados que interactuar谩n con Twitter. Si bien esta funci贸n podr铆a beneficiar a las empresas al extraer informaci贸n de los datos de Twitter, tambi茅n es adecuada para proyectos, investigaci贸n y diversi贸n a menor escala. Estas son algunas de las API m谩s notables proporcionadas por Twitter:

    • Tweets: b煤squeda, publicaci贸n, filtrado, participaci贸n, transmisi贸n, etc.
    • Anuncios: gesti贸n de campa帽as y audiencias, anal铆tica.
    • Mensajes directos (todav铆a en Beta): env铆o y recepci贸n, respuestas directas, mensajes de bienvenida, etc.
    • Cuentas y usuarios (Beta): gesti贸n de cuentas, interacciones de usuarios.
    • Medios: carga y acceso a fotos, videos y GIF animados.
    • Tendencias: temas de actualidad en una ubicaci贸n determinada.
    • Geo: informaci贸n sobre lugares conocidos o lugares cercanos a una ubicaci贸n.

    Hay muchas m谩s posibilidades con las API de Twitter, que no est谩n incluidas en esta lista. Twitter tambi茅n est谩 expandiendo constantemente su gama de servicios agregando nuevas API de vez en cuando y actualizando las existentes.

    Obtener credenciales

    Antes de utilizar la API de Twitter, primero necesita una cuenta de Twitter y haber obtenido algunas credenciales. El proceso de obtenci贸n de credenciales podr铆a cambiar con el tiempo, pero actualmente es el siguiente:

    • Visite la p谩gina de administraci贸n de aplicaciones en https://apps.twitter.com/e inicie sesi贸n con su cuenta de Twitter
    • Haga clic en el bot贸n “Crear nueva aplicaci贸n”, complete los detalles y acepte los T茅rminos de servicio
    • Vaya a la secci贸n “Claves y tokens de acceso” y tome nota de su clave y secreto de consumidor
    • En la misma secci贸n, haga clic en el bot贸n “Crear mi token de acceso”
    • Tome nota de su token de acceso y secreto de token de acceso

    Y eso es todo. La clave / secreto del consumidor se utiliza para autenticar la aplicaci贸n que utiliza la API de Twitter, mientras que el token / secreto de acceso autentica al usuario. Todos estos par谩metros deben tratarse como contrase帽as y no deben incluirse en su c贸digo como texto sin formato. Una forma adecuada es almacenarlos en un archivo JSON “twitter_credentials.json” y cargar estos valores desde su c贸digo cuando sea necesario.

    import json
    
    # Enter your keys/secrets as strings in the following fields
    credentials = {}
    credentials['CONSUMER_KEY'] = ...
    credentials['CONSUMER_SECRET'] = ...
    credentials['ACCESS_TOKEN'] = ...
    credentials['ACCESS_SECRET'] = ...
    
    # Save the credentials object to file
    with open("twitter_credentials.json", "w") as file:
        json.dump(credentials, file)
    

    Envoltorios de Python

    Python es uno de los lenguajes de programaci贸n con mayor n煤mero de desarrollos envoltorios para la API de Twitter. Por lo tanto, es dif铆cil compararlos si no los ha usado durante alg煤n tiempo. Posiblemente una buena forma de elegir la herramienta adecuada es profundizar en su documentaci贸n y ver las posibilidades que ofrecen y c贸mo encajan con las caracter铆sticas espec铆ficas de su aplicaci贸n. En esta parte, compararemos los distintos contenedores de API utilizando la participaci贸n de la comunidad de Python en sus proyectos de GitHub. Algunas m茅tricas adecuadas para la comparaci贸n ser铆an: n煤mero de contribuyentes, n煤mero de recibidos estrellas, n煤mero de observadores, madurez de la biblioteca en el per铆odo de tiempo desde el primer lanzamiento, etc.

    Tabla 1: Bibliotecas de Python para la API de Twitter ordenadas por n煤mero de estrellas recibidas.

    Biblioteca# contribuyentes# estrellas# observadoresMadurez
    tweepy1354732249~ 8.5 a帽os
    Herramientas de Twitter de Python602057158~ 7 a帽os
    python-twitter1092009148~ 5 a帽os
    twython731461100N / A
    TwitterAPI1542449~ 4.5 a帽os
    TwitterSearch824129~ 4.5 a帽os

    La tabla anterior enumera algunas de las bibliotecas de Python m谩s populares para la API de Twitter. Ahora usemos uno de ellos para buscar tweets, obtener algunos datos y explorar.

    Ejemplos de Twython

    Hemos seleccionado el biblioteca twython debido a sus diversas caracter铆sticas alineadas con diferentes API de Twitter, su madurez, aunque no hay informaci贸n sobre cu谩ndo se public贸 su primer lanzamiento, hay informaci贸n de que la versi贸n 2.6.0 apareci贸 hace unos 5 a帽os y su compatibilidad con la transmisi贸n de tweets. En nuestro primer ejemplo usaremos el API de b煤squeda para buscar tweets que contengan la cadena “aprender python”, y m谩s adelante mostraremos un ejemplo m谩s realista usando Twitter API de transmisi贸n.

    API de b煤squeda

    En este ejemplo, crearemos una consulta para la API de b煤squeda con una palabra clave de b煤squeda “aprender python”, que devolver铆a los tweets p煤blicos m谩s populares de los 煤ltimos 7 d铆as. Tenga en cuenta que, dado que nuestra palabra clave se compone de dos palabras, “aprender” y “python”, ambas deben aparecer en el texto del tweet, y no necesariamente como una frase continua. Primero, instalemos la biblioteca. La forma m谩s sencilla es usar pip, pero tambi茅n se enumeran otras opciones en el documentos de instalaci贸n.

    $ pip install twython
    

    En el siguiente paso, importaremos la clase Twython, crearemos una instancia de un objeto y crearemos nuestra consulta de b煤squeda. Usaremos solo cuatro argumentos en la consulta: q, result_type, count y lang, respectivamente para la palabra clave de b煤squeda, el tipo, el recuento y el idioma de los resultados. Twitter tambi茅n define otros argumentos para afinar la consulta de b煤squeda, que se pueden encontrar aqu铆.

    # Import the Twython class
    from twython import Twython
    import json
    
    # Load credentials from json file
    with open("twitter_credentials.json", "r") as file:
        creds = json.load(file)
    
    # Instantiate an object
    python_tweets = Twython(creds['CONSUMER_KEY'], creds['CONSUMER_SECRET'])
    
    # Create our query
    query = {'q': 'learn python',
            'result_type': 'popular',
            'count': 10,
            'lang': 'en',
            }
    

    Finalmente podemos usar nuestro objeto Twython para llamar al search m茅todo, que devuelve un diccionario de search_metadata y statuses – los resultados consultados. Solo miraremos el statuses parte, y guarde una parte de toda la informaci贸n en un pandas marco de datos, para presentarlo en una tabla.

    import pandas as pd
    
    # Search tweets
    dict_ = {'user': [], 'date': [], 'text': [], 'favorite_count': []}
    for status in python_tweets.search(**query)['statuses']:
        dict_['user'].append(status['user']['screen_name'])
        dict_['date'].append(status['created_at'])
        dict_['text'].append(status['text'])
        dict_['favorite_count'].append(status['favorite_count'])
    
    # Structure data in a pandas DataFrame for easier manipulation
    df = pd.DataFrame(dict_)
    df.sort_values(by='favorite_count', inplace=True, ascending=False)
    df.head(5)
    

    .dataframe thead tr: hijo 煤nico th {text-align: right; }

    .dataframe thead th {
        text-align: left;
    }
    
    .dataframe tbody tr th {
        vertical-align: top;
    }

    date favorite_count text user
    1

    3

    4

    8

    2

    Fri Jan 12 21:50:03 +0000 20181372017 was the Year of Python. We set out to lea…Codecademy
    Mon Jan 08 23:01:40 +0000 2018137Step-by-Step Guide to Learn #Python for #DataS…KirkDBorne
    Mon Jan 08 11:13:02 +0000 2018109Resetter is a new tool written in Python and p…linuxfoundation
    Sat Jan 06 16:30:06 +0000 201896We’re proud to announce that this week we have…DataCamp
    Sun Jan 07 19:00:36 +0000 201894Learn programming in Python with the Python by…humble

     

    So we got some interesting tweets. Note that these are the most popular tweets containing the words “learn” and “python” in the past 7 days. To explore data back in history, you’ll need to purchase the Premium or Enterprise plan of the Search API.

     

    Streaming API

     

    While the previous example showed a one-off search, a more interesting case would be to collect a stream of tweets. This is done using the Twitter Streaming API, and Twython has an easy way to do it through the TwythonStreamer class. We’ll need to define a class MyStreamer that inherits TwythonStreamer and then override the on_success and on_error methods, as follows.

     

    The on_success method is called automatically when twitter sends us data, while the on_error whenever a problem occurs with the API (most commonly due to constraints of the Twitter APIs). The added method save_to_csv is a useful way to store tweets to file.

     

    Similar to the previous example, we won’t save all the data in a tweet, but only the fields we are interested in, such as: hashtags used, user name, user’s location, and the text of the tweet itself. There’s a lot of interesting information in a tweet, so feel free to experiment with it. Note that we’ll store the tweet location as present on the user’s profile, which might not correspond to the current or real location of the user sending the tweet. This is because only a small portion of Twitter users provide their current location – usually in the coordinates key of the tweet data.

     

    from twython import TwythonStreamer
    import csv
    
    # Filter out unwanted data
    def process_tweet(tweet):
        d = {}
        d['hashtags'] = [hashtag['text'] for hashtag in tweet['entities']['hashtags']]
        d['text'] = tweet['text']
        d['user'] = tweet['user']['screen_name']
        d['user_loc'] = tweet['user']['location']
        return d
        
        
    # Create a class that inherits TwythonStreamer
    class MyStreamer(TwythonStreamer):     
    
        # Received data
        def on_success(self, data):
    
            # Only collect tweets in English
            if data['lang'] == 'en':
                tweet_data = process_tweet(data)
                self.save_to_csv(tweet_data)
    
        # Problem with the API
        def on_error(self, status_code, data):
            print(status_code, data)
            self.disconnect()
            
        # Save each tweet to csv file
        def save_to_csv(self, tweet):
            with open(r'saved_tweets.csv', 'a') as file:
                writer = csv.writer(file)
                writer.writerow(list(tweet.values()))
    

    Lo siguiente que debe hacer es crear una instancia de un objeto del MyStreamer clase con nuestras credenciales pasadas como argumentos, y usaremos el filter para recopilar solo los tweets que nos interesan. Crearemos nuestro filtro con el track argumento que proporciona las palabras clave de filtro, en nuestro caso “python”. junto al track argumento, hay m谩s posibilidades de ajustar su filtro, que se enumeran en el par谩metros b谩sicos de transmisi贸n, como: recopilar tweets de usuarios seleccionados, idiomas, ubicaciones, etc. Las versiones pagas de la API Streaming proporcionar铆an muchas m谩s opciones de filtrado.

    # Instantiate from our streaming class
    stream = MyStreamer(creds['CONSUMER_KEY'], creds['CONSUMER_SECRET'], 
                        creds['ACCESS_TOKEN'], creds['ACCESS_SECRET'])
    # Start the stream
    stream.statuses.filter(track='python')
    

    Con el c贸digo anterior, recopilamos datos para alrededor de 10,000 tweets que contienen la palabra clave “python”. En la siguiente parte, haremos un breve an谩lisis de los hashtags incluidos y las ubicaciones de los usuarios.

    Breve an谩lisis de datos

    La API de Twitter es algo poderoso, muy adecuado para investigar la opini贸n p煤blica, an谩lisis de mercado, acceso r谩pido a noticias y otros casos de uso que su creatividad puede respaldar. Una cosa com煤n que se puede hacer, despu茅s de haber recopilado cuidadosamente sus tweets, es analizar los datos, donde el an谩lisis de sentimientos juega un papel crucial en la extracci贸n sistem谩tica de informaci贸n subjetiva del texto. De todos modos, el an谩lisis de sentimientos es un campo enorme que debe abordarse en una peque帽a parte de una publicaci贸n de blog, por lo que en esta parte solo haremos algunos an谩lisis de datos b谩sicos sobre la ubicaci贸n y los hashtags utilizados por las personas que twittean “python”.

    Tenga en cuenta que el objetivo de estos ejemplos es solo mostrar para qu茅 se podr铆an usar los datos de la API de Twitter; nuestra peque帽a muestra de tweets no debe usarse para inferir conclusiones, porque no es un buen representante de toda la poblaci贸n de tweets, ni su los tiempos de recogida fueron independientes y uniformes.

    Primero, importemos nuestros datos del archivo “Saved_tweets.csv” e imprimamos algunas filas.

    import pandas as pd
    tweets = pd.read_csv("saved_tweets.csv")
    tweets.head()
    

    .dataframe thead tr: hijo 煤nico th {text-align: right; }

    .dataframe thead th {
        text-align: left;
    }
    
    .dataframe tbody tr th {
        vertical-align: top;
    }

    hashtags text user location
    0

    1

    2

    3

    4

    [‘IBM’]RT @freschesolution: Join us TOMORROW with @OC…rbrownpaNaN
    []pylocus 1.0.1: Localization Package https://t….pypi_updates2NaN
    []humilis-push-processor 0.0.10: Humilis push ev…pypi_updates2NaN
    [‘Python’, ‘python’, ‘postgresql’]#Python Digest is out! https://t.co/LEmyR3yDMh…horstwilmesZ眉rich
    [‘NeuralNetworks’, ‘Python’, ‘KDN’]RT @kdnuggets: A Beginners Guide to #NeuralNet…giodegasL’Aquila, ITALY

     

    What are the most common hashtags that go with our keyword “python”? Since all the data in our DataFrame are represented as strings including brackets in the hashtags column, to get a list of hashtags we’ll need to go from a list of strings, to a list of lists, to a list of hashtags. Then we’ll use the Counter class to count the hashtags entries in our list, and print a sorted list of 20 most common hashtags.

     

    from collections import Counter
    import ast
    
    tweets = pd.read_csv("saved_tweets.csv")
    
    # Extract hashtags and put them in a list
    list_hashtag_strings = [entry for entry in tweets.hashtags]
    list_hashtag_lists = ast.literal_eval(','.join(list_hashtag_strings))
    hashtag_list = [ht.lower() for list_ in list_hashtag_lists for ht in list_]
    
    # Count most common hashtags
    counter_hashtags = Counter(hashtag_list)
    counter_hashtags.most_common(20)
    
    [('python', 1337),
     ('datascience', 218),
     ('bigdata', 140),
     ('machinelearning', 128),
     ('deeplearning', 107),
     ('django', 93),
     ('java', 76),
     ('ai', 76),
     ('coding', 68),
     ('100daysofcode', 65),
     ('javascript', 64),
     ('iot', 58),
     ('rstats', 52),
     ('business', 52),
     ('tech', 48),
     ('ruby', 45),
     ('programming', 43),
     ('cybersecurity', 43),
     ('angularjs', 41),
     ('pythonbot_', 41)]
    

    A continuaci贸n, podemos usar la ubicaci贸n del usuario para responder: 驴qu茅 谩reas del mundo tuitean m谩s sobre “python”? Para este paso, usaremos el geocode m茅todo del geopy biblioteca que devuelve las coordenadas de una ubicaci贸n de entrada determinada. Para visualizar un mapa de calor mundial de tweets, usaremos el gmplot biblioteca. Un recordatorio: nuestros peque帽os datos no son un representante real del mundo.

    from geopy.geocoders import Nominatim
    import gmplot
    
    geolocator = Nominatim()
    
    # Go through all tweets and add locations to 'coordinates' dictionary
    coordinates = {'latitude': [], 'longitude': []}
    for count, user_loc in enumerate(tweets.location):
        try:
            location = geolocator.geocode(user_loc)
            
            # If coordinates are found for location
            if location:
                coordinates['latitude'].append(location.latitude)
                coordinates['longitude'].append(location.longitude)
                
        # If too many connection requests
        except:
            pass
        
    # Instantiate and center a GoogleMapPlotter object to show our map
    gmap = gmplot.GoogleMapPlotter(30, 0, 3)
    
    # Insert points on the map passing a list of latitudes and longitudes
    gmap.heatmap(coordinates['latitude'], coordinates['longitude'], radius=20)
    
    # Save the map to html file
    gmap.draw("python_heatmap.html")
    

    El c贸digo anterior produjo el mapa de calor en la siguiente figura, que muestra una mayor actividad en tweets “python” en EE.UU., Reino Unido, Nigeria e India. Una desventaja del enfoque descrito es que no hicimos ninguna limpieza de datos; Result贸 que hab铆a muchos tweets generados por m谩quinas provenientes de una sola ubicaci贸n, o varias ubicaciones que produc铆an un mismo tweet. Por supuesto, estas muestras deben descartarse para obtener una imagen m谩s realista de la distribuci贸n geogr谩fica de los seres humanos que tuitean “python”. Una segunda mejora ser铆a simplemente recopilar m谩s datos durante per铆odos m谩s largos e ininterrumpidos.

    Conclusiones

    En esta publicaci贸n de blog presentamos una parte bastante modesta de la API de Twitter. En general, Twitter es una herramienta muy poderosa para comprender la opini贸n p煤blica, realizar investigaciones y an谩lisis de mercado y, por lo tanto, sus API son una excelente manera para que las empresas creen herramientas automatizadas para obtener informaci贸n relacionada con su alcance de trabajo. No solo las empresas, sino tambi茅n las personas pueden utilizar las API para crear aplicaciones creativas.

    Tambi茅n enumeramos algunos de los contenedores de Python m谩s populares, pero es importante tener en cuenta que los diferentes contenedores implementan diferentes posibilidades de las API de Twitter. Por lo tanto, se debe elegir un contenedor de Python de acuerdo con su prop贸sito. Los dos ejemplos que mostramos con las API de b煤squeda y transmisi贸n describieron brevemente el proceso de recopilaci贸n de tweets y algunas de las posibles ideas que podr铆an extraer. 隆Si茅ntete libre de crearlos t煤 mismo!

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *