PDA

View Full Version : Estrazione valore numerico da pagina web


Gigabyte2
25-11-2013, 13:40
Salve, dovrei estrarre dinamicamente un valore numerico, che cambia ogni tot minuti, di una pagina web.
Vorrei utilizzare questo valore in un'altra mia pagina: nello specifico devo prendere il valore di una temperatura da un sito che raccoglie misurazioni meteorologiche per poi riutilizzarlo in una pagina PHP o HTML.
Come posso muovermi?

Spero di essermi spiegato!

Tuvok-LuR-
25-11-2013, 14:37
http://net.tutsplus.com/tutorials/php/techniques-and-resources-for-mastering-curl/

Gigabyte2
25-11-2013, 14:49
Dovrei estrapolare dei valori da questa tabella che, chiaramente, è dinamica, per usarli in un testo
http://www.cfr.toscana.it/monitoraggio/stazioni.php?type=idro

Tuvok-LuR-
25-11-2013, 15:15
devi ottenere il contenuto della pagina con curl (se usi php) e poi fare un parsing per ottenere il dato che ti interessa

Gigabyte2
25-11-2013, 16:01
Riesco ad estrarre tutta la pagina, ma non riesco ad isolare il valore che mi interessa

VICIUS
25-11-2013, 17:02
Nel codice della pagina c'è un tag <script> che contiene un sacco di righe come queste:
VALUES[0] = new Array("TOS01004005","Carrione","Carrara","MS","Carrione","A2","","","0.90","5.89","0.06","0.06","0.03","25/11 16.45","NU","1");
VALUES[1] = new Array("TOS01004007","Carrione","Avenza","MS","Versilia","A2","","","1.17","","0.03","0.04","0.00","25/11 16.45","NU","1");
Una volta scaricato il contenuto della pagina. Ti basta scorrere riga per riga finche non trovi quella che ti interessa. Poi estrai il valore numerico con una espressione regolare o a mano. Dovrebbe essere piuttosto semplice da realizzare.

_mRkZ_
30-11-2013, 01:06
Dicci i valori che devi estrarre da quella tabella così possiamo fare una regex (Espressione regolare) su misura :)


EDIT: La regex era talmente facile che, avendo tempo libero, mi sono messo a fare qualcosa di veloce, senza perdere troppo tempo sul matching :)

Script:

<?php
// Recupero il contenuto della pagina
$pagina = file_get_contents('http://www.cfr.toscana.it/monitoraggio/stazioni.php?type=idro');

// Divido la pagina in righe e le metto in un array
$righe = split("\n", $pagina);

foreach ($righe as $riga) { // Leggo riga per riga...
// Verifico se la riga contiene informazioni che mi servono
if (preg_match('/VALUES\[(?<numero>.*?)\] = new Array\("(?<codice>.*?)","(?<fiume>.*?)","(?<stazione>.*?)","(?<provincia>.*?)","(.*?)","(?<zonadiallerta>.*?)","(.*?)","(.*?)","(?<attuale_mszi>.*?)","(?<attuale_mcs>.*?)","(?<h6>.*?)","(?<h1>.*?)","(?<h3>.*?)","(?<ultimi_dati>.*?)","(?<stato>.*?)","(.*?)"\);/m', $riga, $dati)) {
// Metto tutte le informazioni in variabili (per comodità!)
$_numero = $dati['numero'];
$_codice = $dati['codice'];
$_fiume = $dati['fiume'];
$_stazione = $dati['stazione'];
$_provincia = $dati['provincia'];
$_zonadiallerta = $dati['zonadiallerta'];
$_attuale_mszi = $dati['attuale_mszi'];
$_attuale_mcs = $dati['attuale_mcs'];
$_h1 = $dati['h1'];
$_h3 = $dati['h3'];
$_h6 = $dati['h6'];
$_ultimi_dati = $dati['ultimi_dati'];
$_stato = $dati['stato'];

// Valori estratti...
echo "
<b>$_numero</b><br />
&nbsp; Codice: $_codice <br />
&nbsp; Fiume: $_fiume <br />
&nbsp; Stazione: $_stazione <br />
&nbsp; Provincia: $_provincia <br />
&nbsp; Zona di allerta: $_zonadiallerta <br />
&nbsp; Attuale msz i: $_attuale_mszi <br />
&nbsp; Attuale mc/s: $_attuale_mcs <br />
&nbsp; Δh1: $_h1 <br />
&nbsp; Δh3: $_h3 <br />
&nbsp; Δh6: $_h6 <br />
&nbsp; Ultimi dati: $_ultimi_dati <br />
&nbsp; Stato: $_stato <br /><br />
";
}
}
?>


Output:

0
Codice: TOS01004005
Fiume: Carrione
Stazione: Carrara
Provincia: MS
Zona di allerta: A2
Attuale msz i: 0.74
Attuale mc/s: 2.39
Δh1: -0.01
Δh3: -0.01
Δh6: 0.00
Ultimi dati: 30/11 01.30
Stato: NC

1
Codice: TOS01004007
Fiume: Carrione
Stazione: Avenza
Provincia: MS
Zona di allerta: A2
Attuale msz i: 1.13
Attuale mc/s:
Δh1: 0.00
Δh3: 0.00
Δh6: 0.00
Ultimi dati: 30/11 01.30
Stato: NC

... ETC


Se ti servono determinati valori basta semplicemente un IF e fai l'echo solamente di ciò che ti interessa :)
PS: Data l'ora non ho nemmeno controllato se i dati estratti sono tutti corretti, ma mi sembra di si :D ..ti ho dato comunque un buono spunto per tutto ciò che devi fare :)

Spero di essere stato utile, per qualsiasi chiarimento sono qui.

dan168
27-06-2015, 08:12
Salve, riprendo questo vecchio topic perchè ho la necessità di estrapolare dei dati (il cambio fra varie valute e il baht thailandese) in questo ed altri siti similari:
http://www.lindaexchange.com/exchange-rate.html
Dovrò poi realizzare una tabella con i vari dati di varie banche, ma questo non è un problema.

Ho testato lo script di _mRkZ_ (vedi post precedende) ma non mi funziona.

Qualcuno mi può aiutare?
Grazie in anticipo.

OoZic
27-06-2015, 16:44
https://import.io/ senza dover scrivere codice per fare crawling e parsing.

Con import.io hai gia' un API che puoi chiamare dalla tua seconda pagina per ottenere i dati della prima in formato JSON (o csv o xml anche)

dan168
28-06-2015, 16:57
Grazie per la segnalazione, molto interessante...spero di riuscire a capirne a fondo il funzionamento.

Nell'attesa...volevo chiedere se e come fosse possibile estrapolare solo un numero dalla pagina che ho indicato ( http://www.lindaexchange.com/exchange-rate.html ) ossia il valore dell'Euro (vedi Euro Zone - Buy), magari ricavandone un link da apporre in un mio sito web.
Stavo anche analizzando la possibilità di farlo visualizzando il codice sorgente della pagina...ma le mie capacità tecniche non sono all'altezza!!! :muro:

OoZic
28-06-2015, 22:56
http://stackoverflow.com/questions/3139879/how-do-i-get-currency-exchange-rates-via-an-api-such-as-google-finance

dan168
30-06-2015, 20:28
Ti ringrazio ancora per la tua risposta.....solo che è tutto un pò troppo complicato per me!

Mi servirebbe solo uno script come è stato fatto in precedenza (ma non mi pare funzionante) che estrae anche un solo valore dalla pagina indicata...poi lo ripeterei per tutti i valori che mi interessano.

Grazie comunque.

OoZic
30-06-2015, 23:50
Cosa non capisci?

Possiamo aiutarti.

Scrivere lo script no :asd: