Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Marcos-Henrique-Warmling #1

Merged
merged 13 commits into from
Mar 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=senhaDoDB

#caso voce não esteja usando linux, modifique o valor abaixo para a localização do seu chrome
CHROME_PATH=google-chrome
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
.idea/
/vendor
*.lock
*.env
4 changes: 4 additions & 0 deletions .htaccess
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
RewriteEngine on
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [L]0
101 changes: 101 additions & 0 deletions PROJETO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@

# Web Scraping

Projeto feito para o processo seletivo da empresa Agilize "https://agilize.com.br/".
projeto feito em PHP ,Mysql, e um pouco de javaScript.




## REQUISITOS PARA RODAR O PROJETO LOCALMENTE

**Chrome** (necessário para o a biblioteca chrome-php)
```
https://www.google.com/intl/pt-BR/chrome/
```

**PHP v8.0.0^**
```
https://www.php.net/downloads
```

**Composer v2.0.0^**
```
https://getcomposer.org/download/
```

**Mysql**
```
https://www.mysql.com/downloads/
```

**XAMPP** (windows)
```
https://www.apachefriends.org/pt_br/index.html
```

**Apache** (linux)
```
https://www.layerstack.com/resources/tutorials/Installing-Apache-server-on-Linux-Cloud-Servers
```

Dependendo da distribuição linux e da intalação do php sera necessario a instalação de alguns pacotes do PHP
```
sudo apt-get install php-xml
sudo apt-get install php-mbstring
sudo apt-get install -y php-mysqli

```




## Como iniciar o projeto

Primeiramente va até onde esta armazenado o seu projeto, e modifique o arquivo **.env.example**
para os seus respectivos dados do Mysql. Assim que terminar renomeie o arquivo para **.env**.
Este arquivo é onde fica os dados sensiveis, que não devem ser compartilhados.


### Windows
Abra o aplicativo XAMPP, e inicie o serviço apache, grave a porta pois ela que voce vai usar para
acessar o servidor local

### Linux
Acesse o repositorio do projeto, e insira os seguintes comandos no terminal:
```
composer update
php -S localhost:8000
```
a porta do php pode ser modificada, mas a padrão linux é a 8000.


# API
Acesse as Urls abaixo para executar a criação, inserção e retorno dos dados.
Elas podem ser acessadas pelo navegador, ou aplicativos de simulação como o PostMan.
Como exemplo irei usar a porta 8000, porem use a porta em que voce inicializou o localhost,
ou a porta dada pelo XAMPP.

## Criando e populando o banco de dados

### Criar o banco de dados
```
http://localhost:8000/DB/create
```

### Inserir os dados no Mysql
```
http://localhost:8000/DB/populate
```



## Retorno da api

```
http://localhost:8000/api/dados
```




7 changes: 7 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"require":{
"slim/slim": "2.0",
"vlucas/phpdotenv": "^5.0",
"chrome-php/chrome": "^1.0"
}
}
10 changes: 10 additions & 0 deletions index.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php echo
// Url amigavel
$url = (isset($_GET["url"]))?$_GET["url"]:false;
$url = array_filter(explode('/', $url));
$file = (isset($url[0]))?$url[0].".php":"./src/routes/routes.php";
if (is_file($file)) {
include($file);
} else {
include('./src/routes/routes.php');
}
13 changes: 13 additions & 0 deletions scriptSQL.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
DROP DATABASE IF EXISTS raspagem_despesas;
CREATE DATABASE raspagem_despesas;
USE raspagem_despesas;
CREATE TABLE IF NOT EXISTS info(
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
mes_ano VARCHAR(7),
orgao_superior VARCHAR(100),
entidade_vinculada VARCHAR(100),
valor_empenhado FLOAT,
valor_liquidado FLOAT,
valor_pago FLOAT,
valor_restos_a_pagar_pagos FLOAT
)
31 changes: 31 additions & 0 deletions src/dataBase/connection.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php
if ($page == 'route') {
$pageLoad = "./vendor/autoload.php";
} else {
$pageLoad = "../../vendor/autoload.php";
}



// pega os valores do arquivo .env
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . '/../../');
$dotenv->load();
$mysql_host = $_ENV['MYSQL_HOST'];
$mysql_user = $_ENV['MYSQL_USER'];
$mysql_pass = $_ENV['MYSQL_PASSWORD'];
$mysql_db = "raspagem_despesas";

//se conecta com o banco de dados
function getMysqlConnection()
{
global $mysql_host, $mysql_user, $mysql_pass, $mysql_db;

$conn = new mysqli($mysql_host, $mysql_user, $mysql_pass, $mysql_db, );
mysqli_query($conn, "SET CHARACTER SET 'utf8'");
mysqli_query($conn, "SET SESSION collation_connection ='utf8_unicode_ci'");

if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
return $conn;
}
21 changes: 21 additions & 0 deletions src/dataBase/createDB.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php
function createDb($conn)
{
//Dropa a tabela atual e cria uma nova
$sql =
"DROP DATABASE IF EXISTS raspagem_despesas;
CREATE DATABASE raspagem_despesas;
ALTER DATABASE raspagem_despesas CHARACTER SET utf8 COLLATE utf8_general_ci;
USE raspagem_despesas;
CREATE TABLE IF NOT EXISTS info(
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
mes_ano VARCHAR(7),
orgao_superior VARCHAR(100),
entidade_vinculada VARCHAR(100),
valor_empenhado FLOAT,
valor_liquidado FLOAT,
valor_pago FLOAT,
valor_restos_a_pagar_pagos FLOAT
);";
$conn->multi_query($sql);
}
8 changes: 8 additions & 0 deletions src/dataBase/getDbValues.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php
function getMysqlValues($conn)
{
$sql = "SELECT * FROM info";
$result = $conn->query($sql);
$res = json_encode($result->fetch_all(MYSQLI_ASSOC));
return $res;
}
33 changes: 33 additions & 0 deletions src/dataBase/insertDbValues.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php
require_once("./src/scraping/filterValues.php");
require_once("./src/scraping/scrapValues.php");


function getValues()
{
$items = getScrapValues();
$formattedValues = separatedValuesInVariables($items);
return $formattedValues;
}

function insertInDb($conn)
{
$formattedValues = getValues();
$sql = "INSERT INTO info (mes_ano,orgao_superior,entidade_vinculada,valor_empenhado,
valor_liquidado,valor_pago,valor_restos_a_pagar_pagos) VALUES (?,?,?,?,?,?,?)";
$stmt = $conn->prepare($sql);

for ($i=0; $i < count($formattedValues[0]); $i++) {
$stmt->bind_param(
"sssdddd",
$formattedValues[0][$i],
$formattedValues[1][$i],
$formattedValues[2][$i],
$formattedValues[3][$i],
$formattedValues[4][$i],
$formattedValues[5][$i],
$formattedValues[6][$i]
);
$stmt->execute();
}
}
49 changes: 49 additions & 0 deletions src/routes/routes.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php
$page = "route";
require_once("./vendor/autoload.php");
require_once("./src/dataBase/getDbValues.php");
require_once("./src/dataBase/connection.php");
require_once("./src/dataBase/createDB.php");
require_once("./src/dataBase/insertDbValues.php");
$app = new \Slim\Slim();
$conn = getMysqlConnection();
$app->get('/', function () {
echo 'home';
});

$app->get('/api/dados', function () {
global $conn;
try {
$values = getMysqlValues($conn);
echo $values;
} catch (Exception $e) {
echo 'error';
}
});

$app->get('/DB/create', function () {
global $conn;
try {
createDB($conn);
echo 'banco de dados criado';
} catch (Exception $e) {
echo 'erro a criar a base de dados';
}
});

$app->get('/DB/populate', function () {
global $conn;
try {
$values = getMysqlValues($conn);
if ($values == '[]') {
insertInDb($conn);
echo 'populado com sucesso';
} else {
echo 'banco de dados ja populado';
}
} catch (Exception) {
echo "erro a popular a base de dados";
}
});

$app->run();
57 changes: 57 additions & 0 deletions src/scraping/filterValues.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?php
$date = [];
$agency = [];
$entities = [];
$committedValue = [];
$liquidatedValue = [];
$paidValue = [];
$unpaidValue = [];

function removeUselessValues($items)
// remove os "detalhar" dos dados
{
array_splice($items, 0, 8);
for ($i = 0; $i < count($items); $i++) {
if ($items[$i] == "Detalhar") {
array_splice($items, $i, 1);
}
}
return $items;
}

function formatValues($data)
{
$items = removeUselessValues($data);
foreach ($items as $key => $value) {
$items[$key] = str_replace(".", "", $value);
$items[$key] = str_replace(" ", "", $value);
$items[$key] = str_replace(",", ".", $items[$key]);
}
return $items;
}

function separatedValuesInVariables($items)
{
// separa os valores em variaveis
global $date, $agency, $entities, $committedValue, $liquidatedValue, $paidValue, $unpaidValue;
$value = formatValues($items);

for ($i = 0; $i < count($value); $i++) {
if ($i % 7 == 0) {
$date[] = $value[$i];
} elseif ($i % 7 == 1) {
$agency[] = $value[$i];
} elseif ($i % 7 == 2) {
$entities[] = $value[$i];
} elseif ($i % 7 == 3) {
$committedValue[] = $value[$i];
} elseif ($i % 7 == 4) {
$liquidatedValue[] = $value[$i];
} elseif ($i % 7 == 5) {
$paidValue[] = $value[$i];
} elseif ($i % 7 == 6) {
$unpaidValue[] = $value[$i];
}
}
return [$date, $agency, $entities, $committedValue, $liquidatedValue, $paidValue, $unpaidValue];
}
Loading