<jupyter_start><jupyter_text>Coleta de Dados no Twitter utilizando pacote Tweepy do Python e armazena em arquivo, no MongoDB e MySQL ![image.png](attachment:image.png)<jupyter_code>#Install package
!pip install tweepy<jupyter_output><empty_output><jupyter_text>**SEMPRE é necessário importar**  o(s) pacote(s) que serão usados no seu script.<jupyter_code>#Import package

import tweepy<jupyter_output><empty_output><jupyter_text>Credenciais para utilização da API do Twitter Para utilizar a API do twitter, é necessário ter uma conta no twitter, solicitar o acesso de desenvolvedor, criar sua aplicação, gerar suas credenciais.<jupyter_code># Credenciais para utilização da API do Twitter

API_Key = ""
API_secret_key = ""

access_token = ""
access_token_secret = ""<jupyter_output><empty_output><jupyter_text>Fazer a autenticação na API usando suas credenciais<jupyter_code>#Realizar autenticação no Twitter
auth = tweepy.OAuthHandler(API_Key, API_secret_key)
auth.set_access_token(access_token, access_token_secret)

# Construct the API instance
api = tweepy.API(auth)<jupyter_output><empty_output><jupyter_text>No exemplo acima, criamos a variável api que é uma instância/token já autenticado no twitter. Neste caso, o token usará as configurações padrões para busca de tweets.<jupyter_code># Post/create a tweet
api.update_status("Hello Tweepy!")<jupyter_output><empty_output><jupyter_text>Realizar a busca dos trends tweets.<jupyter_code># Where On Earth ID for Brazil is 23424768.
BRAZIL_WOE_ID = 23424768<jupyter_output><empty_output><jupyter_text>Trends em múltiplas localizações<jupyter_code># Available Locations
available_loc = api.trends_available()
#Print first vector element
available_loc[0]<jupyter_output><empty_output><jupyter_text>Trends no Brasil<jupyter_code>brazil_trends = api.trends_place(BRAZIL_WOE_ID)
#Print first vector element
brazil_trends[0]["trends"][0]<jupyter_output><empty_output><jupyter_text>Os métodos trends_available e trends_place retorna um conjunto de objetos com informações dos tópicos no formato JSON.Abaixo, exibir a informação name de cada objeto, que é o próprio título do tópico.<jupyter_code>#Print all vector elements, just column labeled name
for trend in brazil_trends[0]["trends"]:
    print (trend["name"])<jupyter_output><empty_output><jupyter_text>Realizar a busca por palavra chave.<jupyter_code>#Define keyword to search
keyword = ('vacina')

#keyword = ("covid-19  OR  covid  OR  coronavirus OR pandemic")
# Define storage lists
tweets = [] #to storage just tweet text
info = [] #to storage full search JSON data<jupyter_output><empty_output><jupyter_text>Nova autenticação para buscar mais tweets que a taxa limite da chamada.onde:* retry_count - número padrão de tentativas para tentar quando ocorrer um erro* retry_delay - número de segundos para aguardar entre tentativas* wait_on_rate_limit - se deve ou não esperar automaticamente a reposição dos limites de taxa* wait_on_rate_limit_notify - Imprima ou não uma notificação quando o Tweepy estiver aguardando a reposição dos limites de taxa<jupyter_code># Construct the API instance

token  = tweepy.API(auth,wait_on_rate_limit=True,wait_on_rate_limit_notify=True)

for tweet in tweepy.Cursor(token.search,
                           q=keyword, tweet_mode='extended',
                           rpp=2000, result_type="mixed",
                           lang='pt', #serão solicitados apenas tweets em português
                           include_entities=True).items(2000):   
        
    if 'retweeted_status' in dir(tweet): # Check if Retweet
        # If status is a Retweet, status.full_text (tweet.full_text) could be truncated.
        # We should get retweeted_status.full_text
        aux=tweet.retweeted_status.full_text       
    else: # Not a Retweet
        aux=tweet.full_text
        
    newtweet = aux.replace("\n", " ")
   
    tweets.append(newtweet) #append tweet text to such list
    info.append(tweet) #append full tweet data to such list
    
    #open txt file in append mode and write
    file = open("tweets_Keyword_vacina.txt", "a", -1, "utf-8")    
    file.write(newtweet+'\n')
    file.close()<jupyter_output><empty_output><jupyter_text>Para realizar a busca por palavra chave vamos utilizar a função abaixo:* API.search(q[, lang][, locale][, rpp][, page][, since_id][, geocode][, show_user])**onde os principais parâmetros que serão usados são:*** q - a string de consulta de pesquisa* lang - Restringe os tweets para o idioma especificado, fornecido por um código ISO 639-1.  - lang=pt -> Português  - lang=en -> Inglês* rpp - O número de tweets a serem retornados por página, até no máximo 100.* page - O número da página (começando em 1) a ser retornado, até um máximo de aproximadamente 1500 resultados (com base na página rpp).* since_id  - Retorna apenas status com um ID maior que (ou seja, mais recente que) o ID especificado.* geocode  - Retorna tweets de usuários localizados em um determinado raio da latitude / longitude especificada.* show_user  - Quando verdadeiro, precede ":" no início do tweet. O padrão é falso.* include_entities - O nó de entidades não será incluído quando definido como false. O padrão é true.     - Detalhes sobre este nó, acesse https://developer.twitter.com/en/docs/tweets/data-dictionary/overview/entities-object* tweet_mode - Define qual o campo de texto que será recuperado, texto completo (280 caracteres) ou busca o texto do tweet truncado( 140 caracteres).    - tweets = token.search(q=keyword,lang='pt') --> 140 caracteres     - tweets = token.search(q=keyword,tweet_mode='extended') -->280 caracteres* result_type - Define o tipo do tweet a ser recuperado, onde pode ser o mais popular (result_type="popular"), mais recente (result_type="recent") ou uma combinação dos dois (result_type="mixed")<jupyter_code># Para verificar a quantidade de tweets coletado use a função "len()"

print("Total de tweets coletados %s." % (len(info)))<jupyter_output><empty_output><jupyter_text>Armazenar o tweets coletados   Armazenar em arquivo JSON<jupyter_code>#Install
#!pip install json

#Import
import json
# writing a JSON file that has the available trends around the world

with open("tweets_vacina_pt.json","w") as filename: #open file in write mode


    for tweet in info: #para cada tweet no vetor de resultados tweets
        
        status = tweet
        
        #converte para string        
        json_str = json.dumps(status._json)
        
        #deserializa a string para um objeto python do tipo dict        
        parsed = json.loads(json_str)
        
        #grava o tweet deserializado no arquivo
        filename.write(json.dumps(parsed, indent=4))<jupyter_output><empty_output><jupyter_text>Armazenar em arquivo CSV<jupyter_code>#Install
#!pip install pandas
#!pip install numpy

#Import
import pandas as pd
import numpy as np<jupyter_output><empty_output><jupyter_text>Para mais detalhes sobre o pacote **Pandas** acesse:* https://pandas.pydata.org/* https://medium.com/data-hackers/uma-introdu%C3%A7%C3%A3o-simples-ao-pandas-1e15eea37fa1Para mais detalhes sobre o pacote **Numpy** acesse:* https://numpy.org/* https://medium.com/ensina-ai/entendendo-a-biblioteca-numpy-4858fde63355<jupyter_code>#Define dataframe to store tweet data

tweets_df = pd.DataFrame(tweets, columns=['Tweets']) #Store tweet text from tweets list

tweets_df['len']  = np.array([len(tweet) for tweet in tweets])  #Store tweet text size from tweets list

#Store some column from info list
tweets_df['ID']   = np.array([tweet.id for tweet in info])
tweets_df['USER']   = np.array([tweet.user.screen_name for tweet in info])
tweets_df['userName'] = np.array([tweet.user.name for tweet in info])
tweets_df['User Location']    = np.array([tweet.user.location for tweet in info])
tweets_df['Language'] = np.array([tweet.user.lang for tweet in info])
tweets_df['Date'] = np.array([tweet.created_at for tweet in info])
tweets_df['Source'] = np.array([tweet.source for tweet in info])
tweets_df['Likes']  = np.array([tweet.favorite_count for tweet in info])
tweets_df['Retweets']    = np.array([tweet.retweet_count for tweet in info])

#Write csv file with daataframe data
tweets_df.to_csv("tweets_Keyword_vacina.csv")
#Print first 3 rows of dataframe
tweets_df.head(3)
#Podemos imprimir o nome do usuário (screen_name) e o texto do tweet
tweet = info[0]

print("Usuário: %s "% {tweet.user.screen_name})
#print("  Tweet: %s"  % {tweet.text})
print("  Tweet: %s"  % {tweet.full_text}) #No caso da busca em tweet_mode='extended'<jupyter_output><empty_output><jupyter_text>Identificar Top Tweets coletados<jupyter_code># Tweets com maior número de LIKES
likes_max = np.max(tweets_df['Likes']) #Função max do numpy identifica o valor máximo

likes = tweets_df[tweets_df.Likes == likes_max].index[0] #pega o primeiro tweet com valor máximo de curtidas

print("O tweet com mais curtidas (likes) é: \n{}".format(tweets_df['Tweets'][likes]))
print("Número de curtidas: {}".format(likes_max))
retweet_max  = np.max(tweets_df['Retweets']) #retorna o valor máximo

retweet  = tweets_df[tweets_df.Retweets == retweet_max].index[0] #pega o primeiro tweet com valor máximo de Retweets

print("O tweet com mais retweet é: \n{}".format(tweets_df['Tweets'][retweet]))
print("Número de retweets: {}".format(retweet_max))<jupyter_output><empty_output><jupyter_text>Armazenar no MongoDB<jupyter_code>#Install
#!pip install pymongo

#Import pymongo

import pymongo
#Conexão ao banco de dados
con = pymongo.MongoClient('localhost', 27017)

#seleciona o banco de dados
db = con.twitterdb
#seleciona a coleção para armazenar os tweets
collection = db.tweets_vacina
#lista a quantidade de tweets existentes na coleção
db.tweets_vacina.count_documents({})
i = 0
#para cada tweet no vetor de resultados tweets
for tweet in info:
    db.tweets_vacina.insert_one(tweet._json)
    i=i+1
    #print("Tweet inserido com sucesso !!")
#lista a quantidade de tweets inseridos
print("Quantidade de tweets inseridos: %s" % i)
#lista a quantidade de tweets existentes na coleção
db.tweets_keywords.count_documents({})<jupyter_output><empty_output><jupyter_text>Armazenar no MySQL<jupyter_code>#importar pacote
import mysql.connector<jupyter_output><empty_output><jupyter_text>Conectar ao MySQL Server selecionand um banco de dados específico<jupyter_code>mydb = mysql.connector.connect(
    host='localhost',
    user='root',
    password='<PASSWORD>',
    database='tweets'
)

mycursor = mydb.cursor()
for user in tweets_df.USER:
    # Inserir dados em uma tabela
    query = "INSERT INTO usuarios (user) VALUES ("+'"'+user+'"'+")"
    #print(query)
    mycursor.execute(query)
#Consultar a tabela
mycursor.execute("SELECT * FROM usuarios")

myresult = mycursor.fetchall() #todos os registros

for mydata in myresult:
    print(mydata)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09851988899167438, 'fraction_numerical': 0.008140610545790935, 'mean_word_length': 5.006111111111111, 'pattern_counts': {'":': 1, '<': 78, '<?xml version=': 0, '>': 82, 'https://': 5, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '19', 'dir': 'jupyter-structured-clean-dedup', 'id': '375941', 'license': 'MIT', 'n_tokens_mistral': 3901, 'n_tokens_neox': 3746, 'n_words': 1062, 'path': 'Mod.01 - Fundamentos da Engenharia de Dados/02.Twitter_project/Notebook_Twitter/ColetaDadosTwitter-Tweepy.ipynb', 'repo_name': 'Geo-Gabriel/data_engineering_bootcamp_igti', 'size': '10804'}