O que os pássaros cantam?

Coletando tweets com Python e MongoDB.

#python, #datascience, #mongodb #jupyternotebook - 10 de fevereiro de 2019

Se você quer saber o que está acontecendo no mundo, o Twitter é lugar certo. Uma rede social extremamente dinâmica e atualizada. Para quem lida com ciência de dados, o Twitter é um prato cheio, além de ser uma excelente fonte de dados, possui uma API de fácil utilização.

Tenho estudado sobre recuperação da informação em redes sociais e web para desenvolver um projeto que provavelmente virará um post aqui no blog. Pretendo coletar tweets sobre um tema e depois fazer uma análise de palavras, sentimentos, quantidade e etc… Enfim, enquanto o projetinho não sai, gostaria de compartilhar um código bem simples e compacto que pode ajudar bastante quem deseja fazer projetos desse tipo.

O processo é simples, com nosso código (no meu caso rodando no jupyter notebook, mas você pode usar a IDE que preferir), utilizando a API do Twitter, coletaremos os tweets que desejarmos e os armazenaremos em um banco de dados MongoDB. Depois, vamos ler nossos dados adquiridos e os transformar em um dataframe para que possamos aplicar os algoritmos e fazer nossas análises. Além disso, também exportaremos para um arquivo .csv para que podermos trabalhar com eles em outros momentos sem a necessidade de acessar o banco de dados.


Bom, primeiramente você precisará das chaves da API do Twitter, para isso é necessário ter uma conta de desenvolvedor, caso não tenha, é possível fazer no site deles. Esse processo pode levar alguns dias, você preenche com seus dados e informações sobre seu projeto e posteriormente receberá um email de confirmação. Não tem muito mistério, mas caso se sinta um pouco inseguro para responder o email, aqui e aqui, tem alguns exemplos de respostas.


O MongoDB pode ser baixado pelo site, e sua instalação é bem tranquila. Se tiver dificuldades em trabalhar com ele via shell, recomendo baixar o Robo 3T para usar uma interface gráfica.


Vamos ao código:

# Instalação do pacote Tweepy
!pip install tweepy

# Importação de módulos
from tweepy.streaming import StreamListener
from tweepy import OAuthHandler
from tweepy import Stream
from datetime import datetime
import json

Chaves da API do Twitter. Aqui substitua os "XXXXX" pelas suas chaves.

# Consumer Key
consumer_key = "xxxxx"
# Consumer Secret 
consumer_secret = "xxxxx"
# Access Token
access_token = "xxxxx"
# Access Token Secret
access_token_secret = "xxxxx"

# Chaves de autenticação
auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

Classe para captura dos tweets. Nessa parte do código você pode definir o que você irá coletar. Do jeito que estar, está coletando: momento de criação (created_at), ID (id_str), nome do usuário (screen_name), número de seguidores (followers_count) e o texto do tweet (text). Nessa página você pode ver quais outros itens existem em um tweet e sua respectiva nomenclatura para a coleta.

# Classe de captura de stream
class MyListener(StreamListener):
    def on_data(self, data):
        tweet = json.loads(data)
        
        created_at = tweet["created_at"]
        id_str = tweet["id_str"]
        screen_name = tweet["user"]["screen_name"]
        followers_count = tweet["user"]["followers_count"]
        text = tweet["text"]
        
        obj = {"created_at":created_at,"id_str":id_str,
               "screen_name":screen_name, "followers_count":followers_count,
               "text":text,}
        
        tweetind = col.insert_one(obj).inserted_id
        print (obj)
        return True

Definindo objetos:

# Objeto mylistener
mylistener = MyListener()
# Objeto mystream
mystream = Stream(auth, listener = mylistener)

Conexão com MongoDB.
Lembrete: O banco de dados deve estar ativo nesse momento.

# Importação do módulo MongoClient
from pymongo import MongoClient

# Conexão com MongoDB
client = MongoClient('localhost', 27017)

# Criação do banco de dados
db = client.twitterdb
# Criando da coleção
col = db.tweets

Defina as palavras chaves que os tweets que você deseja coletar devem conter:

# Lista de palavras chave para buscar nos Tweets
keywords = ['xxxxxx', 'yyyyyy', 'zzzzzz']

Coleta. Deixe rodando pelo tempo que achar necessário. Você poderá ver que os tweets irão começar a aparecer na célula.

# Acionamento do filtro de tweets e gravação no MongoDB
mystream.filter(track=keywords)
# Pausar a execução para interromper a coleta
mystream.disconnect()

Manipulação dos dados coletados:

# consulta de um elemento da coleção
col.find_one()

# criação de um dataset com dados do MongoDB
dataset = [{"created_at": item["created_at"], "screen_name":item["screen_name"],
            "followers_count":item["followers_count"],
            "text": item["text"],
           } for item in col.find()]

# Pacote Pandas
import pandas as pd
# Criação de um dataframe a partir do dataset 
dataframe = pd.DataFrame(dataset)
# Exibição do dataframe
dataframe

# Exportação do DataFrame para um arquivo .csv
dataframe.to_csv('dados.csv', index=False)

Prontinho, dados coletados e prontos para a análise. Em breve, disponibilizarei um Jupyter notebook com o código, pronto para uso (bastantando apenas inserir as chaves da API e definir as palavras para a busca).


06-03-2019 | Update:

Como prometido, segue o link do Github com notebook do código.