Desafio 3

1. Entender como funcionar o módulo time

Ver slide 49 e 50.


In [1]:
from time import sleep

In [2]:
sleep(5)
print("Dormiu por 5 segundos")


Dormiu por 5 segundos

In [3]:
from time import gmtime
print(gmtime(0))


time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

In [4]:
from time import time
print(time())


1469816170.936672

Referência e outros exemplos: https://docs.python.org/3/library/time.html

Além Da mesma forma que fizemos na API REST do Twitter, temos que salvar as chaves de acesso, bem como definir o objeto OAuthHandler para cuidar da autenticação e validação do acesso.


In [5]:
import tweepy

In [6]:
consumer_key = ''
consumer_secret = ''
access_token = ''
access_token_secret = ''

In [7]:
autorizar = tweepy.OAuthHandler(consumer_key, consumer_secret)
autorizar.set_access_token(access_token, access_token_secret)

2. Modificar nossa classe para ter duração de 5 minutos

Segue abaixo as soluções encontradas para os problemas do último desafio.

1) Falta fechar o arquivo e 2) Falta finalizar a execução do Streaming;

Para esses dois problemas conseguimos tratar dentro do método on_data. O retorno padrão da função é True, portanto enquanto não acontecer alguma ação que diga que não é mais True, o código irá recuperar dados.

Portanto, quando criamos a condição de parada (5 minutos), podemos retornar False, encerrando a execução do Streaming. Nessa mesma condição, antes do retorno, podemos fechar o arquivo. Como mostra o código abaixo.

if(time() - self.tempo_inicial < self.limite):
    self.salvar_arquivo.write(dados)            
    return True
else:
    self.salvar_arquivo.close()
    return False

3) Cada tweet deve ficar em uma linha; Abra o arquivo tweets.json e veja que existe uma linha em branco entre os tweets salvos.

A função open tem um parâmetro chamado newline em que podemos definir como vazio, desta forma não teremos esse problema. Veja código abaixo:

open(nome_arq, 'a', newline='')

Bom, vamos ao código final agora.


In [8]:
class DadosPublicosTwitter(tweepy.StreamListener):
    def __init__(self, nome_arq, limite):
        self.tempo_inicial = time()
        self.limite = limite # 5 minutos == 300 segundos
        self.salvar_arquivo = open(nome_arq, 'a', newline='')
        
    def on_data(self, dados):
        if(time() - self.tempo_inicial < self.limite):
            self.salvar_arquivo.write(dados)            
            return True
        else:
            self.salvar_arquivo.close()
            return False

In [9]:
nome_arq = 'tweets_5min.json'
dados_twitter = DadosPublicosTwitter(nome_arq, 300)

In [10]:
fluxo = tweepy.Stream(autorizar, dados_twitter)

In [11]:
fluxo.filter(track=['Big Data'])

Agora sim, podemos salvar muitos tweets durante um determinado período de tempo!!!!


In [ ]: