isaacmsl / bora-pagar

Projeto desenvolvido por alunos do IMD - UFRN para alunos da UFRN.
https://bora-pagar.onrender.com
18 stars 3 forks source link

(feat) Web scrapping para turmas ofertadas #177

Open isaacmsl opened 8 months ago

isaacmsl commented 8 months ago

Motivo

Devido a dificuldade que é ter acesso a API da UFRN pois é necessário ter como responsável um docente, uma alternativa ambiciosa/hardcode é fazer mineração de informações (web scrapping) no site do SIGAA.

Objetivo

Descreva alternativas que você considerou

Encontrar alguma fonte de dados que possa nos informar essas turmas ofertadas por semestre.

isaacmsl commented 8 months ago

Tem uma base de dados que se chama "turmas". Eles permitem uma consula por API, exemplo 2023.2 turmas abertas: https://dados.ufrn.br/api/action/datastore_search?resource_id=d7bf085a-40f2-4733-8780-7fcad14f75d6&q={"situacao_turma":"ABERTA"}

O problema é que é bem bugada... Mesmo GRAFOS (id do componente é 52866) tendo sida ofertada em 2023.2 e constando também no .csv do recurso de Turmas, a consulta: https://dados.ufrn.br/api/action/datastore_search?resource_id=d7bf085a-40f2-4733-8780-7fcad14f75d6&q={"id_componente_curricular":"52866"} não consegue encontrá-la.

isaacmsl commented 8 months ago

Modelar as disciplinas para que fiquem de acordo com o backend

Impossível. Faltam muitas informações. Faz mais sentido trabalhar em um novo modelo SubjectClass. Dessa forma podemos linkar uma turma com uma disciplina através do component ID.

isaacmsl commented 8 months ago

Um script que faz sentido quando já foram buscadas disciplinas em "Consultar Turmas" no SIGAA

const subjects = [];
document.querySelectorAll('.listagem tbody tr').forEach(d => {
  if(d.classList.contains('destaque')) {
    subjects.push({
      name: d.innerText,
      classes: []
    });
  } else if (d.style.display != 'none') {
    const tds = d.querySelectorAll('td');
    const subjectClass = {
      semester: tds[0].innerText,
      classId: tds[1].innerText,
      professorName: tds[2].innerText,
      type: tds[3].innerText,
      modality: tds[4].innerText,
      situation: tds[5].innerText,
      hour: tds[6].innerText,
      location: tds[7].innerText,
      matCap: tds[8].innerText
    }
    subjects[subjects.length - 1].classes.push(subjectClass);
  }
});
console.log(subjects);