Usando a API Pytrends para as trends do Twitter — Encontrando tópicos de crescente popularidade e mais discutidos

Letícia Pires
Leti Pires
Published in
5 min readJun 1, 2021

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:

https://medium.com/the-data-science-publication/how-to-use-the-pytrends-api-to-get-google-trends-data-4378acbaaa8a

https://pypi.org/project/pytrends/

--

--

Letícia Pires
Leti Pires

Jr. Data Scientist at Sauter 💜 & Civil Engineer . Content creator in @letispires. Fond of Python, Machine Learning and AI.