Extraer el valor
Publicado por yoclens (20 intervenciones) el 25/03/2023 17:31:49
Hola Tengo una duda como Puedo extraer el valor el Petro por medio de esta pagina https://www.bancodevenezuela.com/
Valora esta pregunta


0
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
<title>Scraping Api-Json</title>
</head>
<body>
<div class="container mt-4">
<h2 class="text-center my-3"><em>Scraping api-json valor divisas en Venezuela</em></h2>
<div class="container text-center">
<div class="row align-items-start">
<div class="col">
<button id="monitor" class="btn btn-light border">Varias paginas</button>
</div>
<div class="col">
<button id="petro" class="btn btn-light border">Valores del Petro</button>
</div>
<div class="col">
<div class="row">
<div class="col-6">
<input type="date" class="form-control" id="fecha" value="2023-03-24">
</div>
<div class="col-6">
<button id="bancos" class="btn btn-light border">Bancos de Venezuela</button>
</div>
</div>
<small class="text-muted">Recuerde que la ultima fecha laborable fue el 24/03/2023</small>
</div>
</div>
</div>
<div id="spinner" class="row justify-content-center mt-4 d-none">
<div class="col-md-6">
<div class="d-flex align-items-center text-muted">
<strong class="fs-3">Cargando...</strong>
<div class="spinner-border ms-auto" role="status" aria-hidden="true"></div>
</div>
</div>
</div>
<div id="card" class="row justify-content-center mt-4 d-none">
<div class="col-md-6">
<div class="card">
<div class="card-body">
<div id="div"></div>
</div>
</div>
</div>
</div>
</div>
<script>
petro.addEventListener('click', () => {
blanco();
spinner.classList.remove('d-none');
FetchAsyn('api_json.php', {
'petro': true
}).then((ret) => {
console.log(ret);
spinner.classList.add('d-none');
card.classList.remove('d-none');
div.innerHTML = '<pre>' + JSON.stringify(ret, null, 2) + '</pre>';
});
});
monitor.addEventListener('click', () => {
blanco();
spinner.classList.remove('d-none');
FetchAsyn('api_json.php', {
'monitor': true
}).then((ret) => {
console.log(ret);
spinner.classList.add('d-none');
card.classList.remove('d-none');
div.innerHTML = '<pre>' + JSON.stringify(ret, null, 2) + '</pre>';
});
});
bancos.addEventListener('click', () => {
blanco();
spinner.classList.remove('d-none');
FetchAsyn('api_json.php', {
'bancos': true,
'fecha': fecha.value
}).then((ret) => {
console.log(ret);
spinner.classList.add('d-none');
card.classList.remove('d-none');
div.innerHTML = '<pre>' + JSON.stringify(ret, null, 2) + '</pre>';
});
});
const FetchAsyn = async (pag, dataJson) => {
const opciones = {
method: 'POST',
body: JSON.stringify(dataJson),
headers: {
'Content-Type': 'application/json'
}
};
try {
const fetchResp = await fetch(pag, opciones);
const retorna = await fetchResp.json();
return retorna;
} catch (e) {
return e;
}
}
const blanco = () => {
spinner.classList.add('d-none');
card.classList.add('d-none');
}
</script>
</body>
</html>
<?php
/*
*********************************************************
* *
* -- *
* : || : *
* || *
* || *
* || *
* . - || - . *
* ( || ) *
* ) ( || ) ( *
* / || \ *
* ( || ) *
* \ -- / *
* \ ______ / *
* *
* Jefferson Jimenez (JJJT) *
* Cabimas - Venezuela *
* *
* *
* *
* *
*********************************************************
*/
$json = json_decode(file_get_contents('php://input'), true);
if (!empty($json['monitor'])) {
function json_divisas()
{
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://monitordolarvenezuela.com/',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false
));
$ArrayPage = curl_exec($curl);
curl_close($curl);
function armando($valor)
{
preg_match('#<h4[^>]*>(.*?)</h4>#s', $valor, $titulo);
preg_match('#<p[^>]*>(.*?)</p>#s', $valor, $tasa);
preg_match_all('#<small[^>]*>(.*?)</small>#s', $valor, $fecha);
$t = explode('=', $tasa[1]);
$f = strpos($fecha[1][1], '<br />') > 0 ? explode('<br />', $fecha[1][1]) : explode('<br/>', $fecha[1][1]);
$a = explode('actualizado', $f[0]);
$b = explode(' ', $f[1]);
$c = count($b) == 1 ? $b[0] : $b[1];
$d = DateTime::createFromFormat('d/m/Y', $c);
$d = $d->format('Y-m-d');
$array = array(
preg_replace("/[^a-zA-Z0-9]/", "", $titulo[1]) => array(
'tasa_spanish' => trim($t[1]),
'tasa_mysql' => (float)str_replace(',', '.', $t[1]),
'hora_spanish' => substr($a[1], 2),
'hora_mysql' => date('H:i', strtotime(substr($a[1], 2))),
'fecha_spanish' => trim($c),
'fecha_mysql' => trim($d)
)
);
return $array;
}
$out = array();
preg_match_all('#<div[^>]*>(.*?)</div>#s', $ArrayPage, $NewArray);
foreach ($NewArray as $key => $array) {
foreach ($array as $key => $valor) {
if ($key > 8 && $key < 16) {
array_push($out, armando($valor));
}
}
}
$out = array_slice($out, 0, 7, true);
$out = array_reduce($out, 'array_merge', array());
return json_encode($out, true);
}
echo json_divisas();
}
if (!empty($json['petro'])) {
$url = "https://www.bcv.org.ve/estadisticas/graficos/precios-petro";
$options = array(
"ssl" => array(
"verify_peer" => false,
"verify_peer_name" => false
)
);
$context = stream_context_create($options);
$html = file_get_contents($url, false, $context);
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML('<?xml encoding="UTF-8">' . $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$resultados = array();
$columnas = array(
'fecha',
'Yuan/Petro',
'Euro/Petro',
'Lira/Petro',
'Rublo/Petro',
'Dolar CAD/Petro',
'Libra GBP/Petro',
'Franco/Petro',
'Rupia/Petro',
'Dólar/Petro'
);
$firstRow = $dom->getElementsByTagName('tr')->item(1);
$index = 0;
foreach ($firstRow->getElementsByTagName('td') as $cell) {
$resultados[$index][$columnas[$index]] = $index == 0 ? trim($cell->nodeValue) : (float)trim($cell->nodeValue);
$index++;
}
$xpath = new DOMXPath($dom);
$spanUSD = $xpath->query('//span[text()=" USD"]');
$valorUSD = $spanUSD[0]->parentNode->nextSibling->nextSibling->textContent;
array_push($resultados, array("Bs/Petro" => (float)($resultados[9]['Dólar/Petro'] * (trim(str_replace(",", ".", $valorUSD))*0.98781091) ) ));
$resultados = array_reduce($resultados, 'array_merge', array());
echo json_encode($resultados);
}
if (!empty($json['bancos']) && !empty($json['fecha'])) {
$url = "https://www.bcv.org.ve/tasas-informativas-sistema-bancario";
$options = array(
"ssl" => array(
"verify_peer" => false,
"verify_peer_name" => false
)
);
$context = stream_context_create($options);
$html = file_get_contents($url, false, $context);
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML('<?xml encoding="UTF-8">' . $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$table = $dom->getElementsByTagName('table')->item(0);
if ($table) {
$rows = $table->getElementsByTagName('tr');
$results = array();
foreach ($rows as $row) {
$cells = $row->getElementsByTagName('td');
$row_data = array();
foreach ($cells as $cell) {
$row_data[] = $cell->nodeValue;
}
$results[] = $row_data;
}
}
function FiltradoFecha($data, $fecha)
{
$nombres = array("fecha", "banco", "compra", "venta");
foreach ($data as $array) {
if (isset($array[0])) {
if (trim($array[0]) == $fecha) {
$filtrado[] = array_combine($nombres, array_map('trim', $array));
}
}
}
return $filtrado;
}
$fecha = date("d-m-Y", strtotime($json['fecha']));
$res = FiltradoFecha($results, $fecha);
echo json_encode($res, true);
}
console.log(ret['Bs/Petro']);