PHP - Extraer el valor

 
Vista:
Imágen de perfil de yoclens
Val: 19
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 393
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Extraer el valor

Publicado por Jefferson (203 intervenciones) el 25/03/2023 17:50:42
Hola , en un momento te elaboró un código para extraer no solo el valor de petro, también el valor del dólar de varias páginas como DolarToday, Monitor, Binance, BCV, etc.. así como también el valor de venta Bs/Dolar de los principales bancos activos del país.

Ya tengo pensado en como crearlo.! Dame un momento

Saludos Jefferson
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 393
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Extraer el valor

Publicado por Jefferson (203 intervenciones) el 25/03/2023 20:11:49
Hola aquí lo tienes:

Para tal fin use el método scraping utilizando curl y file_get_contents accediendo al DOMDocument.

Lamentablemente no comente las líneas, porque lo hice muy rápido y es una fastidio escribir tanto (espero logres entenderlo).

Primeramente crea un archivo index.php y copia/pega este código

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<!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>

Como ninguna de estas paginas, poseen apis de consulta, pues toco hacerle scraping y simular una respuesta como lo harian estas.

Crea otro archivo api_json.php y copia/pega este código

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
<?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);
}

Espero le saques provecho, tu y algún otro venezolano atascado en obtener los precios en divisas

Saludos
Jefferson Jiménez
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de yoclens
Val: 19
Ha aumentado su posición en 4 puestos en PHP (en relación al último mes)
Gráfica de PHP

Extraer el valor

Publicado por yoclens (20 intervenciones) el 26/03/2023 06:59:41
Muchas gracias justo lo que necesitaba, ahora para extraer y mostrar los datos o guardo en una variable el valor del petro como lo haría.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Extraer el valor

Publicado por Kathyu (905 intervenciones) el 26/03/2023 12:56:45
@Jefferson, admiro sus ganas de ayudar, pero usted ya hizo algo igual o muy similar para el mismo usuario en Esta Pregunta.

Se que no me importa donde o a quien usted le responda o ayude pero considere lo siguiente:

1- Esta mal acostumbrando a mucha gente a que se lo de todo listo.
2- No fomenta el uso de la investigación de un problema ni mucho menos en probar antes de pedir todo ya hecho.
3- Es tanto, que en la siguiente respuesta de esta misma pregunta el OP le pide como mostrar los datos o guardarlos en variables, ¿Que sucede? Que para nada se fomenta lo que digo en el item 2.
4- A veces es bueno responder con Pseudocódigo para ver el compromiso de cada usuario por resolver sus problemas, de lo contrario en esta web hay un apartado para contratar a profesionales para resolver problemas como este.

He visto que hay "ciertos usuarios" que les gusta que todo se lo den ya listo y eso en otros sitios no es permitido, en lo personal no me gustaría que tomaran de referencia a LWP como un sitio donde se les hace todo lo que piden.

Por eso muy a menudo mando a que lean el post Como formular UNA BUENA PREGUNTA para obtener ayuda más rápido en LWP porque ahí se abordan varias maneras de como pedir ayuda de manera correcta, es más, ya he visto que otros usuarios lo usan también para pedir a los que preguntan que se esfuercen un poco más, siquiera en pedir ayuda. Le recomiendo que usted también lo lea ya que es un profesional con soluciones y códigos muy bien elaborados :-)

Solo es mi opinión personal, espero no generar mucha polémica...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 393
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Extraer el valor

Publicado por Jefferson (203 intervenciones) el 26/03/2023 17:05:32
Hola @yoclens
Para extraer el valor del Petro
1
console.log(ret['Bs/Petro']);

Hola @Kathyu
Soy ferviente seguidor de tus respuestas, al igual que la de muchos otros acá.
Te explico que este OP me escribe por privado solicitándome este favor, (ya previamente también otro OP de stackoverflow me lo había comentado) y en harás de que la respuesta fuese publica (para que les sirviera a la comunidad) fue cuando le solicite que posteara la pregunta al foro.

Razón tienes en que no debo entregar mi ayuda "todo listo" pero de verdad me deje llevar por la necesidad que he visto en mis paisanos con el tema de las divisas en mi pais, te comento que esto acá es una locura, el precio sube cada 5hrs y entiendo que los comerciantes deben tener la herramienta que les permita monitorear el tipo de cambio.

Conozco las normas del foro y me disculpo si cuando posteo mis respuestas lo hago 'todo listo' en lo futuro tratare de ser mas como el que te de la caña para la pesca y no el pescado.

Saludos Jefferson Jiménez
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 1.802
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Extraer el valor

Publicado por Kathyu (905 intervenciones) el 27/03/2023 14:18:39
Tranquilo solo era mi opinión y me alegra que todo se haya entendido bien.

Todos acá tenemos las ganas de ayudar, indiferente de donde sean o si son pro o van iniciando. Gracias por responder.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar