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

Por: Letícia Pires, Cientista de Dados Jr. na Sauter

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 pytrend

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()

É possí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 lista
df_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 soliticação não é conhecido, segundo a página Pytrendd PyPI. Quando realizei esse trabalho, tive um problema similar de requisições. Segundo o site The Data Science Publication 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.

Código completo no meu Github

Curtiu? Então nos acompanhe nas redes sociais:

Instagram LinkedIn | Facebook | Youtube

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/

Leia também

Diferenciais nos serviços de uma boa empresa de tecnologia

Diferenciais nos serviços de uma boa empresa de tecnologia

No cenário empresarial atual, a tecnologia desempenha um papel fundamental na eficiência operacional, na inovação e na competitividade de todas as indústrias. Uma boa empresa de tecnologia não se limita a simplesmente desenvolver produtos ou fornecer serviços...

read more

Vamos nos conectar

Nos envie um e-mail e nós retornaremos nas próximas 24 horas.

4 + 13 =