Usando a API Pytrends para as trends do Twitter — Encontrando tópicos de crescente popularidade e mais discutidos
Repost: Blog da Sauter Digital
Introdução
O Google Trends é uma ferramenta de propriedade do Google que analisa a popularidade dos termos em vários idiomas e regiões. Por exemplo, no site você pode encontrar palavras chaves das tendências, explorar tópicos relacionados, analisar popularidade de termos e mais. É uma ferramenta muito útil se você quer fazer previsões ou entender melhor o comportamento humano. O livro “Todo mundo mente”, cita muito sobre o Google Trends, mostrando que o que as pessoas falam nem sempre é o que elas buscam no Google. Inclusive, recomendo muito essa leitura!
Dessa forma, existe a biblioteca Pytrends python que pode ser utilizada para encontrar e explorar melhor as tendências. Pytrends, segundo a documentação Pytrends PyPI, é uma API não oficial do Google Trends que pode ser usada para extrair informações úteis usando uma interface simples.
Objetivos
Sendo assim, este artigo tem como objetivo mostrar o uso da ferramenta para tópicos de crescente popularidade e principais resultados da pesquisa. No entanto, ao invés de fazer busca por termos gerais, foi utilizado um dataset com trends extraídas do Twitter.
Especificações técnicas
O código foi desenvolvido em Python, com auxílio da API do Google e como IDE utilizou-se o Google Colab.
Instalação
A primeira etapa é instalar a biblioteca pytrends através do código abaixo. A documentação você encontra no link https://pypi.org/project/pytrends/
pip install pytrends
Implementação
Depois de instalar a biblioteca, é necessário fazer uma conexão com o Google, utilizando os seguintes comandos:
#Importando o método TrendReq do módulo de requisição do Pytrends
from pytrends.request import TrendReq#Execute o método TrendReq passando os parâmetros de linguagem e fuso horário
pytrends = TrendReq(hl='pt-BR', tz=360)
Em seguida é necessário construir uma carga útil. Essa carga irá conter informações de solicitação que ajudam o serviço a entender quais dados se deseja obter. Abaixo, um exemplo de como construir uma carga útil:
# Contruindo lista de palavras-chave
kw_list = ["covid", "bolsonaro", "bbb"] # Consturindo a carga útil
pytrends.build_payload (kw_list, timeframe = '2015-01-01 2021-01-01', geo = 'BR' )
No exemplo acima, o kw_list
representa uma lista de palavras para obter os dados, geo
é a localização geográfica e o timeframe
é o prazo de interesse.
Aplicando à base de dados do Twitter
Como mencionado no início, utilizarei trends extraídas do twitter para gerar os tópicos de popularidade crescente e principais resultados da pesquisa. Por isso, inicialmente realizei algumas importações.
import pandas as pd
from pytrends.request import TrendReq
pytrends = TrendReq(hl='pt-BR', tz=360)#Para limpeza de texto
import unicodedata
import re#Coletando os dados
path = '<https://raw.githubusercontent.com/letpires/trends_twitter_pytrends/main/trends_twitter.csv%20-%20P%C3%A1gina1.csv>'
trends = pd.read_csv(path,encoding="ISO-8859-1", decimal=",", na_values="-", engine="python")
trends.head()
É posssível perceber que algumas trends vieram com caracteres especiais, por isso, optei por removê-los, utilizando a função abaixo, extraída do StackOverflow:
"""
A remoção de acentos foi baseada em uma resposta no Stack Overflow.
<http://stackoverflow.com/a/517974/3464573>
"""def removerAcentosECaracteresEspeciais(palavra): # Unicode normalize transforma um caracter em seu equivalente em latin.
nfkd = unicodedata.normalize('NFKD', palavra)
palavraSemAcento = u"".join([c for c in nfkd if not unicodedata.combining(c)]) # Usa expressão regular para retornar a palavra apenas com números, letras e espaço
return re.sub('[^a-zA-Z \\\\\\]', '', palavraSemAcento)
Aplicando a função acima no dataframe, podemos obter o seguinte resultado:
#Aplicando a função para remover caracteres especiais
trends['trend'] = trends.apply(lambda row: removerAcentosECaracteresEspeciais(row['trend']), axis=1)
trends.head()
Em seguida, fiz a transformação dessas trends em lista, para poder passar pela API do Google:
# Convertendo para lista
df_list = trends["trend"].tolist()
df_list
Em seguida, apliquei o parâmetro related_topics para extrair as informações. Esse parâmetro retorna um dicionário contendo uma palavra chave e duas subchaves (‘rising’ e “top). Para extrair tópicos com popularidade crescente, temos o resultado do rising
e para principais pesquisas tem-se os resultados do top .
A função abaixo extrai em forma de dataframe somente os principais tópicos de cada pesquisa:
def related_topics_top(trend):
#Colocando carga útil
pytrends.build_payload(kw_list=[trend], timeframe='now 1-d', geo='BR', gprop='')
related = pytrends.related_topics()
try:
#Transformando as informações me dataframe
top = pd.DataFrame.from_dict(related[trend]['top'])
return top
except Exception as e:
top = None
raise e
Como temos uma lista de palavras do twitter, fiz uma iteração sobre cada um, através do código abaixo:
#Aplicando a função related_topics_top para cada item da listadf_final = pd.DataFrame()for item in df_list:
print('----ITEM:', item)
related = related_topics_top(item) #Inserindo o 'trend' nos dataframes
related.insert(0, 'trend', item, allow_duplicates=True)
df_final = df_final.append(related.head()).reset_index(drop=True)print('--- DF Final ---')
df_final
O resultado obtido foi o seguinte:
Esses resultados não parecem tão interessantes visto que a palavra Xama está em 2 das linhas de topic title. Abaixo, a função para extrair somente os tópicos de popularidade crescente.
def related_topics_rising(trend):
#Colocando carga útil
pytrends.build_payload(kw_list=[trend], timeframe='now 1-d', geo='BR', gprop='')
related_rising = pytrends.related_topics()
try:
#Transformando as informações me dataframe
rising = pd.DataFrame.from_dict(related_rising[trend]['rising'])
return rising
except Exception as e:
rising = None
raise e#Aplicando a função related_topics_rising para cada item da lista
df_final_rising = pd.DataFrame()for item in df_list:
print('----ITEM:', item)
related2 = related_topics_rising(item)
#Inserindo o 'trend' nos dataframes
related2.insert(0, 'trend', item, allow_duplicates=True)
df_final_rising = df_final_rising.append(related2.head()).reset_index(drop=True)print('--- DF Final ---')
df_final_rising
O resultado obtido para tópicos de popularidade crescente foram:
No conjunto de resultados “crescentes”, podemos ver que as pesquisas instantâneas de seleção inglesa e Manchester estão entre os principais tópicos crescentes relacionados ao Harry Kane.
Conclusão:
Um ponto de atenção é com relação ao uso excessivo da API Pytrends, porque o Google pode limitar seu acesso. No entanto, esse limite da taxa de solicitação não é conhecido, segundo a página Pytrendd PyPI. Quando realizei esse trabalho, tive um problema similar de requisições. Segundo o site https://medium.com/the-data-science-publication/how-to-use-the-pytrends-api-to-get-google-trends-data-4378acbaaa8a, um usuário relatou que 1400 solicitações sequenciais em um período de 4 horas o levou ao imite.
Nesse link você encontra outras pessoas que relataram o mesmo problema — https://github.com/GeneralMills/pytrends/issues/231
Nesse link você encontra o código completo no meu Github — https://github.com/letpires/trends_twitter_pytrends
Referências: