Lab 2.1: Orquestrando uma Automação
Sobre a automação
Para exercitar as funcionalidades do Orquestrador BotCity Maestro vamos usar a automação Web que criamos do Lab 1.5 com as seguintes modificações:
Objetivo
Refatorar o código original para:
- Substituir
printporlogging. - Criar automaticamente um arquivo
.txt(log_canais_youtube.txt) com as informações antes printadas. - Tornar a execução mais robusta com tratamento de exceções com blocos
try.exceptefinally. - Incluir contadores de itens (canais) consumidos
Mudanças Necessárias
1. Inclusão de Logging
- Importar o módulo
logging.import logging - Configur logging para registrar mensagens em
log_canais_youtube.txt.# Configuração do logging logging.basicConfig( filename="log_canais_youtube.txt", # Arquivo que será gerado para upload level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s", encoding='utf-8' ) - Substituir os
printporlogging.infopara registros informativos como no exemplo abaixo:logging.info(f"Canal: {nome_canal} | Inscritos: {numero_inscritos} | Vídeos: {quantidade_videos}") - Adicionar
logging.errorpara capturar possíveis exceções durante a coleta de dados.logging.error(f"Erro ao coletar dados do canal {canal}: {ex}")
2. Tratamento de exceções
-
Cada iteração do loop que coleta dados do canal está envolvida em try/except.
-
Evita que uma falha em um canal interrompa todo o bot.
-
Exceções são registradas no log como ERROR.
Exemplo:
for canal in canais:
try:
...
logging.info(f"Canal: {nome_canal} | Inscritos: {numero_inscritos} | Vídeos: {quantidade_videos}")
except Exception as ex:
...
logging.error(f"Erro ao coletar dados do canal {canal}: {ex}")
finally:
...
logging.info("Execução finalizada.")
3. Adicionando os contadores de itens
- Foram criadas três variáveis antes do loop principal:
total_canais = len(canais) # Total de canais a serem processados
canais_sucesso = 0 # Canais processados com sucesso
canais_falha = 0 # Canais que apresentaram erro
- Incremento dos contadores
Dentro do loop de processamento de cada canal, os contadores são atualizados conforme o resultado:
- Sucesso: se os dados do canal forem coletados corretamente:
canais_sucesso += 1
- Falha: se ocorrer algum erro durante a coleta de dados de um canal:
canais_falha += 1
Código completo
# Import de Web Bot
from botcity.web import WebBot, Browser, By
# Import de integração com BotCity Maestro SDK
from botcity.maestro import *
from datetime import datetime
# WebDriver Manager para gerenciamento automático do driver
from webdriver_manager.firefox import GeckoDriverManager # Instale com: pip install webdriver-manager
import logging
# Desativa mensagem de erros por não estar conectado ao Maestro
BotMaestroSDK.RAISE_NOT_CONNECTED = False
# Configuração do logging
logging.basicConfig(
filename="log_canais_youtube.txt", # Arquivo que será gerado para upload
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
encoding='utf-8'
)
def main():
# Instancia do BotMaestroSDK
maestro = BotMaestroSDK.from_sys_args()
# Objeto com informações da execução
execution = maestro.get_execution()
print(f"Task ID is: {execution.task_id}")
print(f"Task Parameters are: {execution.parameters}")
bot = WebBot()
# Configuração do modo headless
bot.headless = False
# Configuração do navegador
bot.browser = Browser.FIREFOX
# Usa WebDriver Manager para definir automaticamente o caminho do driver
# Isso garante que a versão correta do geckodriver seja baixada e usada
bot.driver_path = GeckoDriverManager().install()
# Lista de canais para pesquisar
canais = ['botcity_br', 'botcity-dev', 'youtube', 'github']
# Inicializa contadores
total_canais = len(canais)
canais_sucesso = 0
canais_falha = 0
for canal in canais:
try:
logging.info(f"Iniciando coleta de dados do canal: {canal}")
# Inicia o navegador na URL do canal
bot.browse(f"https://www.youtube.com/@{canal}")
# Retorna lista de elementos com os dados do canal
element = bot.find_elements(
selector='//span[@class="yt-core-attributed-string yt-content-metadata-view-model-wiz__metadata-text yt-core-attributed-string--white-space-pre-wrap yt-core-attributed-string--link-inherit-color" and @role="text"]',
by=By.XPATH
)
# Captura o texto de cada elemento encontrado
nome_canal = element[0].text
numero_inscritos = element[1].text
quantidade_videos = element[2].text
logging.info(f"Canal: {nome_canal} | Inscritos: {numero_inscritos} | Vídeos: {quantidade_videos}")
canais_sucesso += 1 # Incrementa contador de sucesso
except Exception as ex:
logging.error(f"Erro ao coletar dados do canal {canal}: {ex}")
canais_falha += 1 # Incrementa contador de falha
finally:
# Espera 3 segundos e encerra o navegador
bot.wait(3000)
bot.stop_browser()
logging.info("Execução finalizada.")
logging.info(f"Total canais: {total_canais} | Canais com sucesso: {canais_sucesso} | Canais com falha: {canais_falha}")
if __name__ == '__main__':
main()
Orquestrador BotCity Maestro
Após os ajustes acima, integraremos as seguintes funcionalidades do Orquestrador BotCity Maestro:
- Estado de Tarefas: finalizar a tarefa com sucesso ou falha.
- Parametrização de Tarefas: receber canais do YouTube como um parâmetro.
- Erros: enviar mensagens de erros em caso de falhas.
- Alerta: emitir alerta de informação no início do processo.
- Logs: registrar entrada de log para cada execução com data e hora da coleta dos dados, nome do canal e número de inscritos.
- Arquivos de Resultado: enviar captura de tela de cada canal para o Orquestrador BotCity Maestro.
- Credenciais: armazenar credenciais de acesso ao navegador.
- Agendamento: agendar a execução da tarefa.