Executando verificação de segurança...
73

📚 Criando uma API open-source para questões do ENEM

Olá turma do TabNews! Hoje gostaria de compartilhar com vocês um pouco sobre a origem e processo de criação do projeto enem.dev, uma API pública e open-source para listagem de provas e questões do ENEM.

Atualmente a API conta com 2700+ questões, dos anos de 2009 a 2023. Mas também planejo mantê-la atualizada com os dados dos anos subsequentes.

Como o projeto surgiu

A cerca de 6 meses atrás, recebi uma demanda na empresa onde eu trabalho, na qual seria necessário montar alguns quizzes utilizando os dados de questões do ENEM. Para minha surpresa, não havia nenhum lugar onde esses dados estivessem disponíveis de forma simples, e que pudessem ser acessados de forma programática, como uma API ou mesmo alguns arquivos JSON.

O que eu encontrei como fonte de dados foram alguns PDFs disponibilizados pelo INEP, da aplicação de cada prova em seu respectivo ano. Com isso, inicializou-se um longo e cansativo processo de tratamento de dados, com a finalidade de transformá-los em algo “utilizável”, programaticamente falando.

Ao fim deste processo, surgiu a ideia de criar uma API, com a intenção de facilitar o acesso a esses dados, para que outros desenvolvedores no futuro não precisassem gastar a mesma energia que eu gastei.

Os desafios e o que aprendi com eles

Visto que meus inputs seriam alguns PDFs, a ideia central era transformá-los em arquivos JSON, nos quais eu pudesse usar de forma mais simples na hora da criação dos quizzes. No entanto, esse processo é mais fácil na teoria do que na pratica.

Minha primeira tentativa foi transformar esses PDFs em texto e extrair os dados utilizando algumas RegEx. Apesar de ter sucesso em separar as questões e quais seriam as alternativas de cada questão, eu logo esbarrei no meu primeiro desafio: obter as imagens da questão e as alternativas corretas.

Além disso, a conversão de PDF para texto não era confiável e frequentemente trazia alguns caracteres especiais. Foi então que passei a transformar cada página do PDF em uma imagem, e editá-la de forma programática, transformando-as no que eu denominei de “stripes”.

Ilustração de Stripes

Isso tornou a extração de texto um pouco mais assertiva, e permitiu a extração das imagens através de uma fórmula, que julgava se havia ou não uma imagem na questão baseado no espaçamento entre as linhas.

Ainda assim, havia outros desafios a serem enfrentados, como a formatação e layout de cada prova, que mudava conforme o ano em que a prova era aplicada. Mas o principal problema ainda era o fato de que eu não tinha confiança na assertividade do script, o que me fez mudar para a próxima (e última) estratégia: um bom e velho web scraper.

Apesar de trabalhoso, essa foi uma oportunidade de aprender sobre (ou aprofundar em) vários assuntos: como OCR, RegEx e manipulação de imagens utilizando sharp.

O que eu gostaria de deixar como recado aqui é: não tenha medo de embarcar nessas “aventuras”, apesar do código das primeiras tentativas não ter sido utilizado para a task final, há muito conhecimento valioso a ser absorvido ao longo do caminho.

Ideias de projetos

Afinal, agora que temos essa API, o que podemos construir com isso? Bom, aqui estão algumas ideias de projetos:

  • Flashcards — Uma ideia para treinar um pouco de UI/UX e aprofundar seus conhecimentos em front-end. A frente do card pode conter a questão e o verso a alternativa correta.
  • SDK para a linguagem X — Pra quem nunca criou e/ou publicou uma biblioteca em um package manager, essa pode ser uma oportunidade de aprender mais sobre esse processo. Além é claro, de lidar com CI/CD e os desafios de manter um projeto open-source.
  • Análise de dados — Se você tem interesse em aprender sobre machine learning e possivelmente tornar-se um analista de dados, sinta-se livre para fazer um estudo em cima dos dados brutos, quem sabe encontrar algum padrão nas questões, identificar os assuntos que são cobrados com mais frequência e até mesmo sugerir uma rotina de estudo mais otimizada.
  • Inteligência Artificial — Que tal embarcar no hype da IA e treinar um modelo em cima desses dados? Imagine os prompts que o usuário poderia fazer nesse modelo, como por exemplo, pedir uma questão sobre geometria plana e a explicação de como resolvê-la.

Se você não planeja construir algo, mas tem alguma ideia interessante, considere compartilhar ela nos comentários, pois algum desenvolvedor motivado pode transformá-la em realidade.

Caso você venha a construir algo, considere compartilhar no repositório do GitHub através de uma issue. Dependendo da quantidade de submissões, posso criar uma seção no site para divulgá-los.

Conclusão

Por fim, agradeço por terem lido até aqui e espero que essa API possa mexer um pouquinho no ponteiro da educação brasileira. Para isso, gostaria muito de contar com a sua colaboração, seja através de um projeto que utilize da API, feedback nos comentários, compartilhando o projeto com amigos, ou deixando uma estrelinha no GitHub :)

Carregando publicação patrocinada...
2

Caraca man, que projeto incrível! Meus parabéns, com essa API que você fez, me deu ideias grandes de como fazer alguns projetos que já havia em mente durante um tempo.

2

Cara, meus parabéns! Tu trouxe pra nossa realidade de dev algo muito comum e super necessário pro cotidiano dos estudantes BR. Sinceramente fiquei super no hype com essa api e espero poder usar e contribuir muito.

2
2

Incrivel!!!

Há um tempo atrás tinha um projeto que envolvia o enem e suas questões, e ele foi descontinuado justamente pela dificuldade de obter as questões.

Se precisar de alguma ajuda com o projeto pode me chamar que vou adorar contribuir.

2

Sugestão: disponibilizar também os dados dos parâmetros do modelo de TRI usado nos itens (quando disponíveis, mas a tendência atual é que sejam divulgados antes do período de 5 anos, que era padrão). Isso tornaria a API totalmente única e diferenciada. Parabéns pelo projeto!

2

Dei minha contribuição

Resumo do Pull Request:

Este pull request adiciona uma nova funcionalidade à API para permitir a recuperação de questões do ENEM com base em disciplinas e ano. As principais alterações incluem:

  • Criação do endpoint getQuestionByDisciplines: Adiciona um novo endpoint para buscar questões filtradas por disciplinas específicas e ano.
  • Implementação da função getQuestionByDisciplines: Função responsável por recuperar as questões do banco de dados com base nos parâmetros fornecidos (disciplina e ano).
  • Adição da rota: Implementa a rota correspondente no servidor para a nova funcionalidade.
  • Definição do schema GetQuestionByDisciplinesQuerySchema: Adiciona o schema para validar os parâmetros de consulta usados na nova API.

Essas alterações permitem aos usuários obter questões específicas de acordo com a disciplina e o ano desejados, melhorando a flexibilidade e a usabilidade da aplicação.

1

Extremamente interessante, vou dar uma lida pois tenho um projeto na faculdade para questões ENADE para ser usado em sala de aula, e devem ser poucas alterações da sua API

1
1

Cara que trabalho incrível!
Já tinha pensando em fazer algo que utilizasse questões do ENEM, mas esbarrei nesse mesmo problema. Fico feliz que você tenha conseguido resolver e ainda deixou open-source, existem muitas possibilidades de projetos interessantes com essa API.

1

Ótimo trabalho e grande aprendizado, tudo é uma questão de experiência e querer torna-lo possível mesmo com as barreiras do conhecimento. Recomendo colocar um Botão para doação do seu ☕ cafézinho!

1
1
1

Parabén pela iniciativa, esse é um conteúdo que realmente é difícil de conseguir, ter uma api open source disso pode abrir portar para vários projetos interessantes que vão ajudar estudantes para o enem, dei uma olhada na documentação e achei excelente, imagino o trabalho que deve ter dado todo esse processo, além das frustrações que ocorreram durante o caminho. Mas acredito que o mais importante é o aprendizado adquirido com isso.

1
1

Cara, que legal e inspirador!!
Ver esse seu post me motivou agora a embarcar em uma idéia que eu tenho.
Eu gosto muito de assistir provas de ciclismo de estrada europeu e nacional, além disso gosto de acompanhar os resultados das corridas. Porém tirando as grandes provas, muitas eu não sei quando ocorrem ou não consigo ver o resulto sem que veja por algum acaso um post nas redes sociais que acompanho.
Então vou tentar fazer um scrapping que me retorne os resultados das corridas em um numero x de dias, assim como um ranking atualizado contendo a pontuação dos ciclistas no ranking mundial.
Nunca fiz nada desse tipo pois sou um iniciante, mas estou motivado e creio que isso vai me ajudar a aprender!! (Aceito conselhos, dicas, o que for!!)

1

Cara, quando fizer posta aqui pfv. To adorando acompanhar o engajamento que esse post ta retornando, e ficando cada vez mais inspirado pra contribuir e criar meus proprios projetos. Fico no aguardo pra ver o seu tbm!

2

Olá mano. Tudo bem?.
Não sei se você vai ver esse comment, mas voltei aqui para falar que terminei a primeira parte desse meu projeto.
Bom, utilizei o nodejs que é o que tenho mais familiaridade e estou estudando no momento.
Basicamente eu achei um site que fica postando stats de ciclismo, e por ser um site com paginas estaticas, foi uma mão na roda para mim.
Utilizei as bibliotecas axios (para fazer requisiçoes http e extrair os dados da pagina) e o cheerio, para manipular os dados obtidos pelo axios.
Então basicamente, tem duas funçoes assincronas no meu codigo, uma me retorna o ranking top 10 mundial (pode ser mudado para mais, mas eu limitei só a 10 porque é o que tenho interesse em saber) e a outra funçao me retorna os resultados das principais corridas do ano do ciclismo de estrada mundial. Então essa primeira parte está finalizada kkkk.
Mas agora estou planejando em usar esses dados para fazer um Newsletter para mim mesmo, talvez receber uma vez por semana por email, ou por whatsapp, ainda nao sei o que irei fazer ao certo.
Ainda vou atualizar a readme e melhorar outras coisas, mas aqui ta o repo, caso queira dar uma olhada!!
https://github.com/Deniks71/cycling-scraper

0
0