Coverage for carregarDados.py: 100%
74 statements
« prev ^ index » next coverage.py v7.1.0, created at 2023-02-02 11:17 -0300
« prev ^ index » next coverage.py v7.1.0, created at 2023-02-02 11:17 -0300
1import csv # biblioteca utilizada para ler e escrever arquivos csv
2import pandas as pd # biblioteca utilizada para arquivos em dataframe
3from datetime import datetime # biblioteca utilizada para calcular o tempo do processo
4import time # biblioteca utilizada para impor delay para carregamento do site
5from selenium import webdriver # configuracoes para abrir o navegador e capturar os dados
6from selenium.webdriver.common.by import By
7from selenium.webdriver.chrome.service import Service
8from webdriver_manager.chrome import ChromeDriverManager
10def gerarCsv():
11# funcao que gera os arquivos csv vazios apenas com os nomes das colunas
13 with open('./testesUnitarios/csvTurmasColetadasFGA.csv', 'w', newline='', encoding="utf-8") as csvTurmasColetadasFGA:
14 csv.writer(csvTurmasColetadasFGA, delimiter=';').writerow(['codigNomeMateria', 'codigoTurma', 'ano', 'semestre', 'professor', 'cargahoraria', 'horario', 'vagasOfertadas', 'vagasOcupadas', 'local', 'salaSeparada', 'predio','lotacao', 'horarioSeparado', 'percDisciplina', 'percOcupacaoReal','percOcupacaoTotal'])
15 csvTurmasColetadasFGA.close()
17 with open('./testesUnitarios/csvTurmasColetadasQueNaoSaoFGA.csv', 'w', newline='', encoding="utf-8") as csvTurmasColetadasQueNaoSaoDaFGA:
18 csv.writer(csvTurmasColetadasQueNaoSaoDaFGA, delimiter=';').writerow(['codigNomeMateria', 'codigoTurma', 'ano', 'semestre', 'professor', 'cargahoraria', 'horario', 'vagasOfertadas', 'vagasOcupadas', 'local', 'salaSeparada', 'predio','lotacao', 'horarioSeparado', 'percDisciplina', 'percOcupacaoReal','percOcupacaoTotal'])
19 csvTurmasColetadasQueNaoSaoDaFGA.close()
20 # fim metodo gerarCsv
22def gerarConsulta(nivel, depto, ano, periodo, listaTurmasColetadas):
23# funcao que preeenche os campos da pagina Sigaa para fazer a consulta e chama a funcao para coletar os dados
25 servico = Service(ChromeDriverManager().install())
26 opcoes = webdriver.ChromeOptions()
27 opcoes.add_experimental_option('excludeSwitches', ['enable-logging'])
28 navegador = webdriver.Chrome(service=servico, options=opcoes)
29 url = 'https://sigaa.unb.br/sigaa/public/turmas/listar.jsf?aba=p-ensino'
30 navegador.get(url)
32 navegador.find_element(By.NAME, 'formTurma:inputNivel').send_keys(nivel)
33 navegador.find_element(By.NAME, 'formTurma:inputDepto').send_keys(depto)
34 navegador.find_element(By.NAME, 'formTurma:inputAno').clear()
35 navegador.find_element(By.NAME, 'formTurma:inputAno').send_keys(ano)
36 navegador.find_element(By.NAME, 'formTurma:inputPeriodo').send_keys(periodo)
37 navegador.find_element(By.NAME, 'formTurma:j_id_jsp_1370969402_11').click()
39 time.sleep(2)
40 coletarTurmas(navegador, listaTurmasColetadas)
41 navegador.quit()
42 return listaTurmasColetadas
43# fim metodo gerarConsulta
45def coletarTurmas(navegador, listaTurmasColetadas):
46# funcao que captura os dados da pagina Sigaa e armazena em uma lista
48 # armazena a tabela inteira
49 listaTodosElementosDaPagina = navegador.find_elements(By.XPATH, '//*[@id="turmasAbertas"]/table/tbody/tr')
50 # encontra os elementos da pagina e armazena em listas de acordo com o tipo
51 listaCodigoTurma = navegador.find_elements(By.CLASS_NAME, "turma")
52 listaProfCargaHor = navegador.find_elements(By.CLASS_NAME, "nome")
53 listaAnoSemestre = navegador.find_elements(By.CLASS_NAME, "anoPeriodo")
54 listaHorario = (navegador.find_elements(By.XPATH, "//*[@id='turmasAbertas']/table/tbody/tr//td[4]"))
55 listaVagasOfertadas = navegador.find_elements(By.XPATH, '//*[@id="turmasAbertas"]/table/tbody/tr/td[6]')
56 listaVagasOcupadas = navegador.find_elements(By.XPATH, '//*[@id="turmasAbertas"]/table/tbody/tr/td[7]')
57 listaLocal = (navegador.find_elements(By.XPATH, "//*[@id='turmasAbertas']/table/tbody/tr//td[8]"))
59 indLinhaAcumulada = 0
60 indCabecalhoAtual = 0
62 for linhaAtual in listaTodosElementosDaPagina:
63 # verifica se eh cabecalho da disciplina
64 if linhaAtual.get_attribute("class") == 'agrupador':
65 linhaCabecalho = linhaAtual.find_elements(By.XPATH, "//span[@class='tituloDisciplina']")[indCabecalhoAtual]
66 codigoNomeMateria = linhaCabecalho.get_attribute('innerHTML')
67 indCabecalhoAtual += 1
68 # turmas do mesmo cabecalho estao agrupadas em Linha Par e LinhaImpar
69 if linhaAtual.get_attribute("class") == 'linhaPar' or linhaAtual.get_attribute("class") == 'linhaImpar':
70 local = listaLocal[indLinhaAcumulada].get_attribute('innerText').strip()
71 profCargaHor = listaProfCargaHor[indLinhaAcumulada].get_attribute('innerHTML')
72 professor, cargahoraria = profCargaHor.split(" (")
73 cargahoraria, _ = cargahoraria.split(")")
74 codigoTurma = listaCodigoTurma[indLinhaAcumulada].get_attribute('innerHTML')
75 anoSemestre = listaAnoSemestre[indLinhaAcumulada].get_attribute('innerHTML')
76 ano, semestre = anoSemestre.split(".")
77 horario = listaHorario[indLinhaAcumulada].get_attribute('innerText').strip()
78 vagasOfertadas = listaVagasOfertadas[indLinhaAcumulada].get_attribute('innerHTML')
79 vagasOcupadas = listaVagasOcupadas[indLinhaAcumulada].get_attribute('innerHTML')
80 listaTurmasColetadas.append([codigoNomeMateria, codigoTurma, ano, semestre, professor, cargahoraria, horario, vagasOfertadas, vagasOcupadas, local])
81 indLinhaAcumulada += 1
83 return listaTurmasColetadas
84# fim metodo coletarTurmas
86def salvarTurmasColetadasNoCsvFiltrandoFGA(listaTurmasColetadas):
87# funcao que salva as turmas coletadas no arquivo csv verificando se sao disciplinas da FGA ou nao
89 # salva somente as que tem 'FGA' no campo 'local' - dados[inidice][9]
90 with open('./testesUnitarios/csvTurmasColetadasFGA.csv', 'a', newline='', encoding="utf-8") as csvTurmasColetadasFGA:
91 for indice, _ in enumerate(listaTurmasColetadas):
92 if 'FGA' in listaTurmasColetadas[indice][9]:
93 csv.writer(csvTurmasColetadasFGA, delimiter=';').writerow(listaTurmasColetadas[indice])
94 csvTurmasColetadasFGA.close()
96 # salva disciplinas que nao tem 'FGA' no campo 'local' - dados[indice][9] - para teste unitario
97 with open('./testesUnitarios/csvTurmasColetadasQueNaoSaoFGA.csv', 'a', newline='', encoding="utf-8") as csvTurmasColetadasQueNaoSaoDaFGA:
98 for indice, _ in enumerate(listaTurmasColetadas):
99 if 'FGA' not in listaTurmasColetadas[indice][9]:
100 csv.writer(csvTurmasColetadasQueNaoSaoDaFGA, delimiter=';').writerow(
101 listaTurmasColetadas[indice])
102 csvTurmasColetadasQueNaoSaoDaFGA.close()
103# fim metodo salvarTurmasColetadasNoCsvFiltrandoFGA
104'''
105if __name__ == '__main__':
106# main - para testes isolados de cada metodo
108 dataHoraInicioDoProcesso = datetime.now()
110 gerarCsv()
112 listaTurmasColetadas = []
113 gerarConsulta('GRADUAÇÃO', 'FACULDADE DO GAMA - BRASÍLIA', '2022', '2', listaTurmasColetadas)
114 print('Coleta do departamento FACULDADE DO GAMA - BRASÍLIA ok')
116 gerarConsulta('GRADUAÇÃO', 'DEPTO CIÊNCIAS DA COMPUTAÇÃO - BRASÍLIA', '2022', '2', listaTurmasColetadas)
117 print('Coleta do departamento DEPTO CIÊNCIAS DA COMPUTAÇÃO - BRASÍLIA ok')
119 gerarConsulta('GRADUAÇÃO', 'INSTITUTO DE FÍSICA - BRASÍLIA', '2022', '2', listaTurmasColetadas)
120 print('Coleta do departamento INSTITUTO DE FÍSICA - BRASÍLIA ok')
122 gerarConsulta('GRADUAÇÃO', 'INSTITUTO DE QUÍMICA - BRASÍLIA', '2022', '2', listaTurmasColetadas)
123 print('Coleta do departamento INSTITUTO DE QUÍMICA - BRASÍLIA ok')
125 gerarConsulta('GRADUAÇÃO', 'DEPARTAMENTO DE ENGENHARIA MECANICA - BRASÍLIA', '2022', '2', listaTurmasColetadas)
126 print('Coleta do departamento DEPARTAMENTO DE ENGENHARIA MECANICA - BRASÍLIA ok')
128 gerarConsulta('GRADUAÇÃO', 'DEPARTAMENTO DE MATEMÁTICA - BRASÍLIA', '2022', '2', listaTurmasColetadas)
129 print('Coleta do departamento DEPARTAMENTO DE MATEMÁTICA - BRASÍLIA ok')
131 # salvando dados em um arquivo .csv para uso em testes unitarios e em testes de metodos isolados
132 salvarTurmasColetadasNoCsvFiltrandoFGA(listaTurmasColetadas)
134 dataHoraFimDoProcesso = datetime.now()
135 print(f'\nDuração do processo de coleta e carregamento das turmas: {dataHoraFimDoProcesso - dataHoraInicioDoProcesso}\n')
136# fim main
137'''