fga-eps-mds / 2021.2-INDICAA

Este projeto tem como objetivo criar um software para a melhor visualização de informações relacionadas às matérias ofertadas no SIGAA, com o objetivo de melhorar o trabalho da secretaria na volta gradual as aulas.
https://fga-eps-mds.github.io/2021.2-INDICAA-Wiki/
GNU General Public License v3.0
8 stars 7 forks source link

Sprint 2 - Pesquisa - Back-end #14

Closed oCaioOliveira closed 2 years ago

oCaioOliveira commented 2 years ago

Descrição

Pesquisar tecnologias relacionadas ao Back-end (Python e suas bibliotecas Scrapy e Beautiful Soup) e iniciar o desenvolvimento dessa área do projeto.

Tarefas

Realizar os seguintes passos:

Critérios de aceitação

lucasqueiroz23 commented 2 years ago

Estudo sobre a sintaxe de python

A ideia desse estudo é aprender, resumidamente, a sintaxe de python para algumas estruturas básicas de programação. Para tanto, em cada conceito estudado, farei um comparativo entre a implementação daquele conceito na linguagem C e na linguagem Python. Escolhi C por ser a linguagem que tenho mais afinidade.

Entrada e Saída

Entrada em C: função scanf Entrada em Python: Função input. Ela retorna um dado do tipo de dado que foi fornecido na entrada. exemplo em python: x = input() #a variável x recebe um dado do tipo recebido na entrada com o mesmo valor.

Saída em C: função printf Saída em Python: função print() exemplo em python: x = "Qualquer coisa" print(x) OBS: a função print só printa um mesmo tipo de dado. Portanto, caso eu queira imprimir, por exemplo, uma string e logo em seguida um int, eu devo fazer o casting do valor int para string.

Operadores em Python

-Operadores aritméticos São os mesmos de C, ou seja, '+' para adição, '%' para módulo, etc. No entanto, Python tem 2 operadores aritméticos a mais: O operador realiza a exponenciação. Então xy = x^y. Em C, deveriamos importar a função pow() da biblioteca math.h ou fazer a exponenciação usando algum algoritmo. O operador // realiza a divisão entre dois números, e retorna o inteiro.

-Operadores de atribuição São os mesmos de C com algumas adições. O operador '=' atribui valor a uma variável, e operadores do tipo "var1 (operador1)= var2" são a mesma coisa que "var1 = var1(operador1)var2". Por exemplo: x+=y significa x = x+y. E por aí vai. A diferença é que, além dos operadores de C, também temos operadores novos em Python.

-Operadores relacionais São os mesmos de C (==, >=, <=, etc).

-Operadores lógicos Em C: 'E': && 'OU': || 'NÃO': !

exemplo: int x=10; return (x>5 && !(x==8) || x ==20); //retorna 1

Em Python: 'E': and 'OU': or 'NÃO': not

exemplo: x = 10 validade = (x>5 and not(x==8) or x ==20) #Validade = True

Tipos de dados e "declaração" de variáveis em Python

Em C, cada variável tinha um tipo específico associado a ela. Um inteiro sempre seria inteiro, um char seria sempre char e por aí vai. Em Python, as variáveis podem, em um momento, assumir um tipo de dados, e, em outro momento, um tipo diferente. Por isso, em Python, não existe "declaração" de variáveis, mas sim "atribuição" de variáveis. Exemplo em Python: x = 10 print(x) #printa 10 x = "ola" print(x) #printa "ola"

Dito isso, os tipos de dado são de texto, numeros, sequências... conferir a bibliografia para mais detalhes.

Estruturas condicionais

Em C: if(condição) procedimento; else procedimento; else if(condição) procedimento;

Em Python: if condição: procedimento else: procedimento elif condição: procedimento

Python não tem switch-case.

Estruturas de repetição

Em C: for(índice = algum_valor; condição;incremento, decremento, etc) procedimento; while(condições) procedimento; do(condições) procedimento; while(condições);

Em Python: for (indice) in range(valmax): procedimento while condições: procedimento

Arrays

Arrays não existem em python(pelo menos, não na biblioteca padrão). No entanto, existe o conceito de lista, que funciona como um array. A diferença principal é que enquanto os arrays de C só guardam o mesmo tipo de dado, as listas de Python guardam qualquer tipo de dado. Em C: int arr[tamArr] = {...} //só pode conter elementos do tipo inteiro

Em Python: arr = [...] #pode conter elementos de qualquer tipo de dado

-Acessando elementos do array Em C: int v[tam] = {...} para acessar o valor que o array guarda na posição x, basta utilizar v[x]

Em Python: v = [...] Para acessar o valor que o array guarda na posição x, basta utilizar v[x]

Funções/Métodos/Procedimentos

Em C: tipoDeDadoRetorno funcao(parametros) { procedimentos; return algo; } Em Python: def funcao(argumentos): procedimentos return algo

Observações Finais

Python é uma linguagem aparentemente muito poderosa e fácil de se utilizar. Notei, também, que cada uma dessas estruturas não necessita de chaves delimitando seus procedimentos. O que define se um procedimento faz parte de uma função é a identação do código.

Bibliografia

https://www.w3schools.com/python/python_datatypes.asp https://www.geeksforgeeks.org/data-types-in-c/ https://www.youtube.com/watch?v=rfscVS0vtbw&list=WL&index=3&t=5120s

gabrielm2q commented 2 years ago

Web Scraping com Python


Introdução ao Python

AdneMoretti commented 2 years ago

Backend

Back-End

O desenvolvimento web é dividido em front-end e back-end. O backend é todo o desenvolvimento e estruturas que possibilitam a operação do sistema, não é visto pelo cliente e está associado com o Server Side, como a própria tradução diz, o lado do servidor. O desenvolvimento do backend está voltado para os servidores, APIs, bancos de dados, segurança da informação, etc. Dentre as linguagens mais utilizadas temos o python.

Entenda o backend

Python

É uma linguagem de programação de alto nível, muito eficiente e de simples sintaxe e entendimento, possui tipagem fraca e pode ser utilizada nos mais diversos contextos. Tem diversas vantagens em sua utilização, incluindo a comunidade open source gigantesca, grande quantidade de suporte e documentação.

Curso introdutório a python Primeiros passos python

Django

É um framework em python para facilitar o desenvolvimento web. Foi feito para suportar projetos escaláveis. Bem completo e traz diversas soluções.

Facilidades herdadas do python. Permite criação de uma aplicação completa com pouco código.

Arquitetura utilizada no Django:

MVT:

Saiba mais sobra Django

Web Scraping

Comparação entre BeautifulSoup e scrapy

Tutorial de web scraping com Scrapy Web Scraping com BeautifulSoup

Scapy: É um framework em python que permite o crawler de diversas páginas web, sites e guardar os dados que tem . É bem completo e não depende de outras adições para fazer o scraping, apesar de suportar outras extensões. Tem vantagens por ser bem rápido.

BeautifulSoup: Diferente do scarpy, beautifulsoup é uma biblioteca de análise em python que possibilita pegar os dados de páginas html e xml. Ele depende de outras ferramentas para que consiga rastrar e pegar dados de páginas web, mas em questão de usabilidade e facilidade é bem vantajoso, portanto, é recomendado para projetos que nao sejam muito grandes e é essencial para iniciantes.

Matheuspimentell commented 2 years ago

Python

O Python é uma linguagem de programação de alto nível e orientada à objetos, que foi introduzida ao mundo em 1991 e hoje, é uma das linguagens de programação mais utilizadas em todo mundo!.

Alguns vídeos sobre Python

Web scraping

Scrapy

O Scrapy é um framework rápido e de alto nível para web scraping, ou seja, para a retirada de dados de sites da web.

Selenium

O Selenium é uma API open source de Python utilizada principalmente para automatizar testes nos navegadores da web.

Beautiful Soup

O Beautiful Soup é uma biblioteca de Python para extração de dados de documentos HTML e XML.

guigudf commented 2 years ago

Usando selinum com python para webcrawling

Matheuspimentell commented 2 years ago

Tutorial de MongoDB com python

MongoDB

O MongoDB é um sistema que guarda bancos de dados noSQL orientado à documentos que é usado para guardar grandes volumes de dados. Ao invés de utilizar dos conceitos de tabelas e colunas assim como os bancos de dados relacionais, o MongoDB usa coleções e documentos. Os documentos consistem em dados "chaveados" e são a unidade básica de dados no MongoDB. Documentos estes que são guardados no formato .bson.

Manual do MongoDB.

Exemplo de um documento que pode ser utilizado pelo MongoDB

{
  "_id": "d61g25d6f1d512e161791"
  "nome": "João",
  "tags": ["Masculino", "Estudante"],
  "data-nasc": "09.09.2009" 
}

Instalação

Agora que já temos um conhecimento básico sobre o que é o MongoDB e como ele funciona, podemos partir para a prática. Para realizar a instalação do MongoDB de acordo com o seu sistema operacional, siga os passos fornecidos pela documentação do MongoDB. Neste tutorial, abordaremos a utilização no sistema operacional Ubuntu, que é uma distribuição Linux.

  1. Importar a public key usada pelo gerenciador de pacotes

    wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -

    Caso a operação acima não retorne um OK:

    • 1.1 Instale o gnupg
    sudo apt-get install gnupg
    • 1.2 Tente realizar a operação novamente
    wget -qO - https://www.mongodb.org/static/pgp/server-5.0.asc | sudo apt-key add -
  2. Criar um arquivo .list para o MongoDB

    echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/_Ubuntu_ focal/mongodb-org/5.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-5.0.list
  3. Atualizar os pacotes locais

    sudo apt-get update && sudo apt-get upgrade
  4. Instalar o pacote oficial mais recente e estável do MongoDB

    sudo apt-get install -y mongodb-org
  5. Conferir a versão instalada

    mongod --version

Rodando o MongoDB no terminal (mongosh)

Para fazer o banco de dados do MongoDB iniciar no seu terminal, basta rodar o comando:

sudo systemctl start mongod
sudo systemctl daemon-reload

E rodar novamente o comando sudo systemctl start mongod.

Para confirmar que o MongoDB iniciou corretamente, basta rodar o comando seguinte em seu terminal:

sudo systemctl status mongod

E por fim, para fechar o MongoDB, basta rodar:

sudo systemctl stop mongod

Mas como desejamos utilizar o mongosh, podemos novamente iniciar o MongoDB com o seguinte comando:

sudo systemctl restart mongod

E para utilizar o mongosh, basta rodar em seu terminal:

mongosh

Para sair do mongosh, basta pressionar 'ctrl+d' em seu teclado.

MongoDB Compass

O compass é um sistema que proporciona uma GUI (Graphical User Interface) para a visualização dos DBs, coleções e documentos salvos.

Instalação

Novamente, iremos considerar o sistema operacional Ubuntu em sua versão LTS mais atual, o 20.04.

  1. Baixe o MongoDB Compass

    wget https://downloads.mongodb.com/compass/mongodb-compass_1.30.1_amd64.deb
  2. Instale o MongoDB Compass

    sudo dpkg -i mongodb-compass_1.30.1_amd64.deb
  3. Para inicial o MongoDB Compass, temos 2 opções:

    1. Podemos apenas iniciá-lo pelo terminal do Ubuntu
      mongodb-compass
    2. Podemos iniciá-lo pelo menu de Apps do Ubuntu

Quando iniciar o MongoDB compass e passar pelo tutorial, iremos ver uma tela como a mostrada abaixo:

Assim, podemos selecionar o opção Connect sem digitar nenhuma connection string para nos conectarmos ao DB local iniciado no Terminal. E com isso, veremos uma tela parecida com a tela a seguir:

Podemos perceber que o MongoDB cria automaticamente 3 DBs chamados: admin, config e local. E assim, podemos selecionar a opção Create database para criar um DB em sua máquina local. E com ela, devemos dar um nome ao DB e outro à uma coleção que fará parte do DB.

Com isso, apenas resta selecionar a opção Create database e iremos ver o DB criado na lista de DBs mostrada no Compass.

Para acessar as coleções de dados disponíveis dentro do DB, precisamos apenas de clicar no painel do DB. Posteriormente, na tela de visualização das coleções do DB, podemos selecionar a coleção que criamos para acessar os dados guardados dentro da mesma.

Nós poderíamos adicionar, remover, editar e pesquisar dados apenas utilizando a GUI do MongoDB Compass, porém, o objetivo deste tutorial é mostrar como acessar, acrescentar, remover e editar dados dentro de um DB por meio de um código em python. Assim, podemos prosseguir para o próximo tópico.

:exclamation: É importante que você disconecte e depois reconecte do DB no MongoDB Compass para ver a seguinte informação na sua tela:

Ela é a connection string chamada de cluster no código python que iremos fazer.

Python

Utilizaremos o python para o acesso ao DB por ser uma linguagem de programação moderna, rápida e que possui diversos tutoriais na web. Com isso, podemos notar que o python possui diversar bibliotecas para manipulação de uma enorme quantidade de coisas, mas como o intuito deste tutorial é demonstrar como realizar o acesso aos dados guardados dentro do DB, iremos utilizar uma biblioteca do python mais conhecida como pymongo.

pymongo

Primeiro, devemos instalar o pymongo em nosso sistema operacional linux. Para isso, devemos seguir os seguintes passos:

Instalação

  1. Instalar o pymongo por meio do gerenciador de pacotes do python, o pip.
    pip install pymongo

Aqui, deixo a documentação do pymongo para que seja de fácil acesso à todos. E a partir de agora, irei mostrar um código de teste que irá realizar a adição, procura, remoção e amostragem de dados no DB por meio de um código python.

Código de teste

Notas: Substituir as seguintes variáveis pelos nomes escolhidos do DB e da coleção criada

db = client.<nomedoDBcriado>
<nomedacoleçãocriada> = db.<nome-da-coleção-criada> #No código abaixo é a variável testing

cluster = "<endereço-do-DB-criado>" #Pode-se obter este endereço por meio do MongoDB Compass
from pymongo import MongoClient #Importando o MongoClient de dentro do pyMongo

#Abaixo temos a variável com a string de conexão ao DB
cluster = "mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.2.2"

#Conecta o client ao cluster (conjunto de DBs) especificado acima
client = MongoClient(cluster)

#Lista todos os DBs e seus nomes
print(client.list_database_names())

#Acessa o DB chamado testDB
db = client.testDB

#Lista todas as coleções dentro do DB selecionado acima
print (db.list_collection_names())

#Dicionário contendo os dados a serem adicionados ao DB
d = {
  "nome": "Harry Potter",
  "profissão": "Auror",
  "casa": "Grifinória",
  "dado notável": "Campeão do tri-bruxo",
  "data-nasc": "31.07.1980"
}

#puxando a coleção testing de dentro do DB
testing = db.testing

#Inserindo um elemento dentro da coleção especificada do DB
testing.insert_one(d)

#Dicionário com uma coleção de 2 dados a serem adicionados ao DB
d2 = [{
  "nome": "Harry Potter",
  "profissão": "Auror",
  "casa": "Cópia",
  "dado notável": "Cópia",
  "data-nasc": "31.07.1980"
},
{
  "nome": "Herminone Granger",
  "profissão": "Ministra da magia",
  "casa": "Grifinória",
  "dado notável": "Ordem da fênix",
  "data-nasc": "19.09.1979"
},
{
  "nome": "Ronald Weasley",
  "profissão": "Auror",
  "casa": "Grifinória",
  "dado notável": "Ordem da fênix",
  "data-nasc": "01.03.1980"
},
{
  "nome": "Tom Marvolo Riddle",
  "profissão": "O senhor das trevas",
  "casa": "Sonserina",
  "dado notável": "Herdeiro de Salazar Sonserina",
  "data-nasc": "31.12.1926"
},
{
  "nome": "Draco Lucius Malfoy",
  "profissão": "Assistente à ministra da magia",
  "casa": "Sonserina",
  "dado notável": "Apanhador (quadribol)",
  "data-nasc": "05.06.1980"
},
{
  "nome": "Gilderoy Lockhart",
  "profissão": "Escritor",
  "casa": "Corvinal",
  "dado notável": "Professor",
  "data-nasc": "26.01.1964"
},
{
  "nome": "Albus Dumbledore",
  "profissão": "Ex-diretor de hogwarts",
  "casa": "Grifinória",
  "dado notável": "Ordem de merlin",
  "data-nasc": "X.08.1881"
},
{
  "nome": "Newton Scamander",
  "profissão": "Magizoologista",
  "casa": "Lufa-lufa",
  "dado notável": "Escritor",
  "data-nasc": "24.02.1897"
}]

#Inserir vários dados na coleção especificada do DB
testing.insert_many(d2)

print("------------------------------------------------")
#Procurar por UM dado
result = testing.find_one({"nome": "Gilderoy Lockhart"}) #Método para procurar o primeiro dado que é compatível com a busca
print(result) #Imprime o resultado encontrado
print("------------------------------------------------\n")

#Procura por todos os resultados disponíveis
resultados = testing.find({"casa": "Sonserina"})

#Imrimir todos os resultados encontrados, um a um
print("------------------------------------------------")
for resultado in resultados:
  print(resultado)
  print("------------------------------------------------")
print()

#imprime uma contagem de todos os documentos inseridos na coleção
print("Total de personagens no DB:", testing.count_documents({}))
#Imprime uma contagem dos documentos que contém o argumento passado
print("Total de personagens de Grifinória no DB:", testing.count_documents({"casa": "Grifinória"}))

#Deleta o primeiro dado compatível encontrado
testing.delete_one({"casa": "Cópia"})
print("Total de personagens no DB após a remoção da cópia:", testing.count_documents({}))

#Atualiza o dado desejado
testing.update_one({"nome": "Newton Scamander"}, {"$set": {"profissão": "Escritor"}})

print("Pressione qualquer tecla para encerrar...")
input()

#Deleta todos os dados
testing.delete_many({})

Para ver o resultado, basta digitar em seu terminal:

python3 <nome-do-arquivo>.py

:exclamation: Durante a execução do programa, não encerrá-lo, utilizar o MongoDB Compass para visualizar os dados.

Links úteis