strovertz / ufsm-horarios

Puxa horários de disciplinas disponíveis no site da UFSM/Curso/Horários
MIT License
4 stars 2 forks source link

Abordagem alternativa para a obtenção dos dados necessários #5

Closed wisentini closed 1 year ago

wisentini commented 1 year ago

Quando a página de horários do curso é acessada, são realizadas duas requisições interessantes:

Método URL Payload
POST https://portal.ufsm.br/webservice/ws/site/turma/anoPeriodoAtual.json curso=701
POST https://portal.ufsm.br/webservice/ws/site/turma/disciplinasPorPeriodo.json curso=701&ano=2023&periodo=102

Essas duas requisições retornam arquivos JSON com todos os dados necessários para montar a página de horários do curso, o que seria ótimo, pois eliminaria a necessidade de fazer scraping. Além disso, os dados seriam os mesmos utilizados pela UFSM, sem correr o risco de capturar dados incorretos do HTML.

No entanto, o host (portal.ufsm.br) aceita apenas requisições efetuadas pela origin ufsm.br. Para contornar esse problema, eu utilizei a biblioteca selenium-wire, que permite inspecionar as requisições feitas pelo site no momento em que ele é carregado. A partir dela, é possível recuperar os arquivos JSON e mapeá-los para objetos Python, o que facilita o acesso às informações necessárias.

A minha pergunta é: no contexto desse projeto, seria interessante usar essa abordagem ao invés de scraping? Se sim, eu poderia ficar responsável por isso, já que o código está praticamente pronto.

strovertz commented 1 year ago

Claro, qualquer abordagem que retorne os dados necessários é muito bem vinda, facilitará pra mim implementar em um container docker o sistema e deixar disponível para acesso geral.

wisentini commented 1 year ago

O endpoint GET /api/campi/{campus}/cursos/{curso}/horarios já está quase implementado, eu só preciso saber se o retorno dele é o suficiente. Segue abaixo um exemplo do schema que é retornado.

{
    "ano": 2023,
    "campus": "Santa Maria",
    "carga_horaria_disciplina": 120,
    "codigo_curso": "307",
    "codigo_disciplina": "ELC1074",
    "creditos_disciplina": 5,
    "curso": "Ciência da Computação - Bacharelado",
    "dia_semana": "Terça-feira",
    "disciplina": "PROJETO DE SOFTWARE II",
    "docentes": [
      "ANDREA SCHWERTNER CHARAO",
      "JOAO VICENTE FERREIRA LIMA"
    ],
    "horario_fim": "15:30:00",
    "horario_inicio": "13:30:00",
    "periodo": "2. Semestre",
    "periodo_disciplina": 99,
    "tipo_disciplina": "Teórica",
    "vagas_aumentadas": 0,
    "vagas_ocupadas": 0,
    "vagas_oferecidas": 15
  }
strovertz commented 1 year ago

Perfeito, vou ver de implementar algum banco nosql depois pra auxiliar.

wisentini commented 1 year ago

Massa!