Frequentemente nos deparamos com situações em que precisamos executar códigos Python com regularidade e em horários precisos. A realização de web scraping é um bom exemplo disso.
Python schedule é uma biblioteca ideal para agendar a execução de códigos no calendário humano. Através de seu uso, é possível executar funções Python (ou qualquer outro elemento Python chamável) periodicamente usando uma sintaxe amigável.
Como usar Python Schedule?
A biblioteca precisa ser instalada:
# com pip
pip install schedule
# com conda
conda install conda-forge::schedule
Para usá-la num código Python, faça a importação da biblioteca e defina as funções que deseja executar normalmente. Veja um exemplo:
import schedule
def minha_funcao():
print('Oi na hora certa!')
Após definir suas funções, será preciso adicionar um comando equivalente ao mostrado abaixo:
schedule.every().minute.do(minha_funcao)
while True:
schedule.run_pending()
Nesse exemplo, uma função chamada minha_funcao foi programada para rodar a cada minuto. Isso é feito passando a função como argumento da função do da biblioteca schedule. Ela atua como um decorador.
Intervalos Personalizados
Com a biblioteca Python schedule, não é necessário usar sempre notação em minutos nem especificar 1 minuto como intervalo. Ela aceita várias formas de especificações temporais. Por exemplo, para rodar uma função a cada 15 minutos, o comando pode ser escrito como:
schedule.every(15).minutes.do(minha_funcao)
while True:
schedule.run_pending()
Já para executar uma função uma vez a cada hora:
schedule.every().hour.do(minha_funcao)
while True:
schedule.run_pending()
Quando precisamos executar um código uma vez por dia em um horário preciso, o comando pode ser escrito como o exemplo abaixo (modifique o exemplo com as suas opções):
schedule.every().day.at("10:30").do(minha_funcao) # roda todo dia às 10:30
while True:
schedule.run_pending()
Já para os casos em que um código precisa ser executado em um dia da semana e com horário preciso, o comando pode ser escrito assim (mude as especificações de acordo com suas necessidades):
schedule.every().wednesday.at("13:15").do(minha_funcao) # roda toda quarta-feira às 13:15
while True:
schedule.run_pending()
Também é possível especificar o fuso horário que deve ser considerado.
pip install pytz # comando para instalar pytz (precisa instalar antes de usar)
from pytz import timezone
schedule.every().friday.at("12:42", timezone("Africa/Lagos")).do(minha_funcao) # exemplo com fuso horário
while True:
schedule.run_pending()
Python Schedule com Argumentos
Nos exemplos anteriores, as funções não possuíam argumentos. Em muitos casos, elas possuem. Evidentemente, a biblioteca schedule lida sem problemas com esse cenário. Veja como passar argumentos no exemplo abaixo:
def minha_funcao(nome):
print(f'Oi na hora certa para {nome}!')
schedule.every().minute.do(minha_funcao, nome="Ana") # exemplo com argumento
while True:
schedule.run_pending()
Para conhecer mais sobre a biblioteca, ver outros detalhes sobre notação e opções, confira a documentação oficial.