Skip to content

Commit

Permalink
Dados modificados
Browse files Browse the repository at this point in the history
  • Loading branch information
BiancaPatrocinio7 committed Dec 5, 2023
2 parents ccab538 + 258df14 commit fcede00
Show file tree
Hide file tree
Showing 2,664 changed files with 8,692,521 additions and 270,323 deletions.
17 changes: 17 additions & 0 deletions .github/ISSUE_TEMPLATE/template-.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
name: 'Template '
about: Criar Issue para a sprint
title: Título da ISSUE
labels: ''
assignees: ''

---

# Descrição
Escreva a descrição a aqui...
# Objetivos
- [ ] Escreva os objetivos aqui...
# Responsáveis
@Escreva o nickname dos responsáveis aqui...
# Critérios de avaliação
* Escreva os critérios de avaliação aqui...
35 changes: 35 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: Python CI

on:
pull_request:
push:
branches:
- implementacao


jobs:
lint:
runs-on: ubuntu-latest

steps:
- name: Checkout Repository
uses: actions/checkout@v3

- name: Instalando o Python
uses: actions/setup-python@v4
with:
python-version: '3.10'

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pylint
pip install selenium
pip install PyPDF2
- name: Run Pylint
run: |
pylint Camada_Dados/extrair.py
pylint Camada_Dados/regex.py
pylint Camada_Dados/web_scraper.py
23 changes: 23 additions & 0 deletions 2009TESTE.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"nomeMunicipio": "IBIRUBÁ",
"dataPost": "2009-08-20",
"haNomeacao": true,
"haExoneracao": false,
"nomeados/exonerados": {
"nomes_apos_nomeacao": [
"DOMINGOS TADEU DALLA COSTA",
"MARIA FAGUNDES TOLEDO",
"",
"Jose Dorival Silva da Cruz como Coordenador Administrativo de Obras. \nGUSTAVO ROBERTO SCHROEDER",
"JOSE DORIVAL SILVA DA CRUZ",
"Rene Vicente da Silva como Coordenador do De partamento de Indústria e Comércio.\n \nGUSTAVO ROBERTO SCHROEDER",
"RENE VICENTE DA SILVA",
"Michele Aline Aldebrand Artmann como Assesso ra de Gabinete do Secretário Geral.\nGUSTAVO ROBERTO SCHROEDER",
"MICHELE ALINE ALDEBRAND ARTMANN"
],
"nomes_apos_exoneracao": [
"DOMINGOS TADEU DALLA COSTA",
"MARIA FAGUNDES TOLEDO"
]
}
}
26 changes: 26 additions & 0 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Código de Conduta do Squad 8

## Objetivo e abrangência do Código:

Este documento tem como objetivo direcionar e guiar os relacionamentos dentro da produção do projeto, abrangendo a colaboração entre os integrantes do squad/grupo, o contato dos nossos desenvolvedores com os outros grupos envolvidos na disciplina, a nossa comunicação com a professora Carla Rocha, que será nossa orientadora durante a realização do projeto, e, por último, a interação entre a criação do produto e seus usuários.

Dessa forma, a partir deste código serão definidos princípios básicos que deverão nortear todo o seguimento do projeto, seja no dia a dia, seja em situações de conflito ou obstáculos que possam surgir nas relações interpessoais ou mesmo intrapessoais.


## Orientações Gerais de Conduta:

Em primeiro lugar, é necessário priorizar o respeito aos direitos básicos que devem ser concebidos a todo ser humano, sem distinção. É inaceitável qualquer tipo de discriminação ou ameaça por motivo de intentidade de gênero, orientação sexual, condição social, idade, raça, etnia, religião ou condição de saúde, em qualquer instância, física ou verbal. Garantir o bem-estar de todos os envolvidos é uma responsabilidade geral e imprescindível, a fim de cultivar um ambiente proveitoso e saudável, em que todos se sintam confortáveis para conviver entre si e expressar ideias ou pensamentos pertinentes ao trabalho.

É de suma importância compreender que o Squad 8 não tolera conflito de interesses entre os seus integrantes, e se opõe fortemente a utilizar qualquer tipo de influência ou responsabilidade para benefício unicamente próprio ou a tirar proveito de uma função ou situação para privilegiar a si mesmo ou a terceiros.


## Privacidade e segurança da informação:

O Squad 8 também preza pela privacidade e a segurança dos dados e informações gerados durante o desenvolvimento do projeto. Há a compreensão de que o trabalho que está sendo produzido faz parte do cumprimento de requisitos para uma disciplina acadêmica, porém todos os dados e arquivos publicados publicamente deverão ser revisados e fiscalizados por todos os integrantes da equipe. Além disso, se alguma outra equipe desejar se inspirar ou utilizar algo criado pelo Squad 8, a equipe em questão precisará entrar em contato conosco e fazer uma solicitação.


## Práticas essenciais:

A produtividade e a eficiência da equipe devem ser priorizadas durante todo o processo de produção. O Squad 8 deve elaborar um plano que especifica os objetivos e tarefas que deverão ser completados a cada ciclo de trabalho (sprint), além de designar a cada tarefa um prazo e um ou mais integrantes para realizá-la. Cabe aos próprios integrantes se planejar e organizar para que não haja desperdício de recursos, esforço ou, especialmente, tempo.

Por último, a ferramenta mais importante para a realização do projeto e a entrega de um bom produto é a **comunicação**. Todas as decisões, problemas, obstáculos, preocupações ou dificuldades devem ser comunicadas devidamente a toda a equipe. Dessa forma, é possível levantar benefícios e desvantagens de uma ideia, debater uma forma de resolver um problema ou levantar alternativas para o seguimento do projeto. Por isso, lembre-se: caso vocẽ encontre algum empecilho em seu caminho, seja falta de tempo ou disponibilidade, seja um problema pessoal, não hesite em **comunicar** para a equipe, pois juntos podemos encontrar uma solução!
30 changes: 30 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@

Antes de fazer qualquer alteração no repositório, crie uma issue e se responsabilize por essa alteração. Atente-se a [política de branchs](https://github.com/unb-mds/2023-2-Squad08/blob/main/docs/Pol%C3%ADticas%20/Branches.md)
e a [política de commits](https://github.com/unb-mds/2023-2-Squad08/blob/main/docs/Pol%C3%ADticas%20/Commits.md).

## Histórico de versões

| Data | Versão | Descrição | Autor |
| :--------: | :----: | :----------: | :---------------: |
| 23/10/2023 | 0.1 | Envio inicial | [Vitor Feijó](https://github.com/vitorfleonardo)|

## Criação de Issues

Ao criar issues atente-se as seguintes questões:

- Já existe issue referente ao assunto que você pretende abordar na sua? Se sim, trabalhe a partir da issue já criada
- Adicione um título que sintetize bem o problema abordado na issue
- Adicione uma descrição adequada, de modo que qualquer membro do repositório consiga compreender qual é o problema
- Adicione ao menos um Assignee
- Adicione as Labels adequadas
- Adicione a milestone referente a sprint em que o problema será trabalhado

## Criação de Pull Request

Ao fazer um pull request atente-se para:

- Linkar o PR a sua Issue correspondente
- Marcar um dos responsáveis para revisão

## Dúvidas e sugestões
Se você tiver alguma dúvida ou sugestão sobre como contribuir para o Guia UnB, sinta-se à vontade para entrar em contato com a equipe de desenvolvimento.
92 changes: 92 additions & 0 deletions Camada_Dados/ImplementaçãoWebScrapper.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# Implementação WebScrapper

## Introdução
Uma das etapas iniciais para o desenvolvimento desse projeto é a disposição dos Diarios Oficiais, os arquivos PDF's de cada dia são dispostos no site dos Diarios Oficiais dos Municípios do Rio Grande do Sul, no caso desse estado se tem diarios desde 2009 até o atual ano. Obter esses arquivos manualmente é possível, porém é um processo de acessar cada dia, de cada mês em cada ano e verificar a existência de um arquivo para aquele dia e se sim baixá-lo, o que é extremamente desgastante e passível de erro. Por conta disso, o processo de obtenção de cada um dos PDF's será feito por um bot.

## Metodologia

Utilizando do Python e algumas bibliotecas, no qual se destaca a biblioteca Selenium, é possível programar um bot que simule os cliques de um usuário no site. Dessa forma mapeando o caminho que o usuário deveria tomar para acessar cada um destes arquivos manualmente é passado como comandos para o computador que os realizará de forma automática.

## Programação
Primeiramente é necessário realizar alguns imports que serão necessários para o código:

~~~python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import os
import shutil
import time
import re
~~~
Após os imports é escolhido o navegador que será usado para realizar essas operações e acoplado o link do site.

~~~python
driver = webdriver.Chrome()
driver.get("https://www.diariomunicipal.com.br/famurs/o-que-e")
~~~

Quando analisado o site é perceptivel que é possível clicar no dia para acessar uma página com seu respectivo PDF, mas o mês e o ano devem ser selecionados numa barra acima. Conseguindo o xpath das seletoras de ano e mês é possível simular o acesso a um mês ou ano específico com o Select.

~~~python
calendar_month = driver.find_element(By.XPATH,"//*[@id='calendar_month']")
calendar_year = driver.find_element(By.XPATH,"//*[@id='calendar_year']")

month_selector = Select(calendar_month)
year_selector = Select(calendar_year)
~~~

Após isso foi realizado 3 loopings para a passagem de todos os anos, meses e dias, por isso há um contador para cada. Em cada uma das iterações de dia é acionado pela xpath de um dia correspondente ao contador e então é dado um .click() no elemento, o que abre um popup que contém o arquivo que então é selecionado e começa o download na máquina que está executando o código.
Em cada trecho é verificado a existência do bloco de download e se ele existe, se é do tipo simples ou simples2, seguindo de acordo com as inspeções feitas no código do site.
WebDriverWait é um comando para melhor experiência com possíveis delays, já que pode-se inserir um tempo que o código vai esperar para alguma tela ou ação acontecer no site e caso ela aconteca ele ignora o tempo e prossegue o código.
~~~python
if driver.find_element(By.XPATH, "//*[@id='materia-aviso']").get_attribute("style") == "display: block;" or driver.find_element(By.LINK_TEXT, str(contador_dia)).find_element(By.XPATH, './ancestor::td').get_attribute("class") == "weekend ":
print(f'Não tem matéria pra esse dia: {contador_dia}/{contador_mes}/{contador_ano}')
else:
if driver.find_element(By.XPATH, "//*[@id='containerDownload']").get_attribute("style") == "display: block;" and driver.find_element(By.LINK_TEXT, str(contador_dia)).find_element(By.XPATH, './ancestor::td').get_attribute("class") == "weekday ":

element = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.XPATH, "//*[@id='btDownloadSimples']"))
)
PDF = driver.find_element(By.XPATH, "//*[@id='btDownloadSimples']")
print(f'Edição: {contador_dia}/{contador_mes}/{contador_ano}')

PDF.click()
if driver.find_element(By.XPATH, "//*[@id='containerDownloadNova']").get_attribute("style") == "display: block;" and driver.find_element(By.LINK_TEXT, str(contador_dia)).find_element(By.XPATH, './ancestor::td').get_attribute("class") == "weekday "
element = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.XPATH, "//*[@id='btDownloadSimples2']"))
)
PDF = driver.find_element(By.XPATH, "//*[@id='btDownloadSimples2']")
print(f'Edição: {contador_dia}/{contador_mes}/{contador_ano}')
PDF.click()
~~~

Ao final, o driver fecha e se inicia outro processo importante para essa etapa, que é a padronização desses documentos para que seja melhor sua manipulação, no código abaixo a variavél arquivos recebe uma lista com todos os documentos na pasta de download e então para cada arquivo ali contido ele usa de um processo de busca por regular expression (Regex), procurando o padrão de 4 digitos-2digitos-2digitos, que corresponde no nome do arquivo a sua data. Então é trocado o nome de cada um para sua data e então printado a data.
~~~python
padrao = r"(\d{4})-(\d{2})-(\d{2})"
arquivos = os.listdir("diretório padrão dos downloads do computador que executar")
caminho = "diretório padrão dos downloads do computador que executar"
for arq in arquivos:
correspondencia = re.findall(padrao, os.path.basename(arq))
for match in correspondencia:
ano, mes, dia = match
caminhoArq = os.path.join(caminho, arq)
os.rename(caminhoArq, f'{ano}-{mes}-{dia}.pdf')
print(os.path.basename(arq))
~~~
Como já descrito acima, os documentos estavam na pasta de downloads, quando renomeados eles são trazidos para a pasta geral do projeto, para organizar isso o código abaixo pesquisa para cada arquivo na pasta geral e que terminam em .pdf para então traze-los a uma pasta específica do projeto.
~~~python
for docs in os.listdir("Pasta geral do Projeto"):
if docs.endswith(".pdf"):
caminhoAtual = os.path.join("Pasta geral do Projeto", docs)
caminhoDestino = os.path.join("Pasta específica do projeto", docs)
shutil.move(caminhoAtual, caminhoDestino)
~~~

## Referências
> 1. Documentação da biblioteca Selenium (Documentação não oficial): https://selenium-python.readthedocs.io/.
> 2. Documentação Python/OS: https://docs.python.org/pt-br/3/library/os.html
> 3. Documentação Python/re: https://docs.python.org/pt-br/3/library/re.html
> 4. Documentação Python/shutil: https://docs.python.org/pt-br/3/library/shutil.html
Acessos: As documentações citadas acima foram acessadas durante maior parte dos dias da semana que compreende a Sprint 3 (25/09 a 02/10).
File renamed without changes.
Binary file added Camada_Dados/__pycache__/__init__.cpython-38.pyc
Binary file not shown.
Binary file added Camada_Dados/__pycache__/extrair.cpython-38.pyc
Binary file not shown.
56 changes: 56 additions & 0 deletions Camada_Dados/dados_para_os_Graficos/resumo_do_ano/Rank.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
{
"municipios_com_mais_nomeacoes": [
{
"municipio": "campo bom",
"nomeacoes": 700,
"exoneracoes": 116
},
{
"municipio": "ibirubá",
"nomeacoes": 598,
"exoneracoes": 100
},
{
"municipio": "santo ângelo",
"nomeacoes": 459,
"exoneracoes": 55
},
{
"municipio": "augusto pestana",
"nomeacoes": 398,
"exoneracoes": 107
},
{
"municipio": "independência",
"nomeacoes": 350,
"exoneracoes": 149
}
],
"municipios_com_mais_exoneracoes": [
{
"municipio": "independência",
"nomeacoes": 350,
"exoneracoes": 149
},
{
"municipio": "campo bom",
"nomeacoes": 700,
"exoneracoes": 116
},
{
"municipio": "santana da boa vista",
"nomeacoes": 194,
"exoneracoes": 111
},
{
"municipio": "augusto pestana",
"nomeacoes": 398,
"exoneracoes": 107
},
{
"municipio": "ibirubá",
"nomeacoes": 598,
"exoneracoes": 100
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
[
{
"municipio": "boa vista do cadeado",
"nomeacoes": 2,
"exoneracoes": 2
},
{
"municipio": "butiá",
"nomeacoes": 3,
"exoneracoes": 0
},
{
"municipio": "caibaté",
"nomeacoes": 6,
"exoneracoes": 0
},
{
"municipio": "ibirubá",
"nomeacoes": 68,
"exoneracoes": 14
},
{
"municipio": "publicado por gabinete ou afins",
"nomeacoes": 2,
"exoneracoes": 0
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
[
{
"municipio": "barros cassal",
"nomeacoes": 68,
"exoneracoes": 2
},
{
"municipio": "ibirubá",
"nomeacoes": 140,
"exoneracoes": 32
},
{
"municipio": "publicado por gabinete ou afins",
"nomeacoes": 5,
"exoneracoes": 3
},
{
"municipio": "são leopoldo",
"nomeacoes": 4,
"exoneracoes": 2
}
]
Loading

0 comments on commit fcede00

Please sign in to comment.