Un po’ per divertimento e un po’ perché volevo approfondire la mia conoscenza di Ruby e delle regex, oltre che delle espressioni XPath, ho deciso di rilasciare una libreria opensource Ruby che ho creato. Permette infatti di accedere ai dati di viaggiatreno che espone gli orari dei treni di Trenitalia in tempo reale.
Come funziona?
Un paio di anni fa avevo scritto un parser analogo in Python, ma molto meno robusto [proprio perché non utilizzavo le espressioni XPath e le regex]. Il nuovo scraper, scritto in Ruby con l’ausilio di nokogiri, è molto semplice da utilizzare; un esempio:
irb(main):004:0> require './src/Train.rb'
irb(main):005:0> train = Train.new(5033) # numero identificativo del treno (vedi Trenitalia.it)
=> 5033 (REG 5033): Il treno e' arrivato con 8 minuti di ritardo
(state: FINISHED, delay: 8, lastUpdate: )
irb(main):007:0> train.status
=> "Il treno e' arrivato con 8 minuti di ritardo"
irb(main):008:0> train.delay
=> 8
irb(main):009:0> train.lastStop
=> "[X] BERGAMO = SCHEDULED: 07:46 ACTUAL: 07:53\n"
irb(main):010:0> train.trainStops
=> [[X] LECCO = SCHEDULED: 07:03 ACTUAL: 07:04
, [X] VERCURAGO S.GIROLAMO = SCHEDULED: 07:08 ACTUAL: 07:08
, [X] CALOLZIOCORTE OLGINATE = SCHEDULED: 07:11 ACTUAL: 07:11
, [X] CISANO CAPRINO BERGAMASCO = SCHEDULED: 07:22 ACTUAL: 07:21
, [X] PONTIDA = SCHEDULED: 07:26 ACTUAL: 07:32
, [X] AMBIVERE MAPELLO = SCHEDULED: 07:31 ACTUAL: 07:36
, [X] PONTE S.PIETRO = SCHEDULED: 07:38 ACTUAL: 07:43
, [X] BERGAMO = SCHEDULED: 07:46 ACTUAL: 07:53
]
Di conseguenza, un programma alert per venire avvisati via sms (tramite tinsms) solo quando il treno è in ritardo per più di 10 minuti, o quando il treno non è ancora partito (scioperi, malfunzionamenti, etc.), diventa:
require_relative 'src/Train.rb'
require_relative '../sms-utils/sendsms.rb'
RECIPIENT = 'num_tel'
log = Logger.new('log/viaggiatreno-alert.log')
log.level = Logger::DEBUG
train = Train.new(ARGV[0])
if train.delay.to_i >= 10 or train.status == "Il treno non e' ancora partito"
send_sms(RECIPIENT, train)
log.info(train)
end
Ho rilasciato i sorgenti su GitHub: viaggiatreno-scraper – il codice ha licenza GPL, e di conseguenza siete liberi di dire la vostra e soprattutto apportare migliorie!
Un altro esempio di cosa si potrebbe fare?
Ogni giorno alle 11:59PM, si potrebbe raccogliere la situazione di tutti i treni circolati sulla rete ferroviaria; in questo modo, si potrebbero estrarre delle curiose statistiche sul ritardo/anticipo medio, e tanto altro. Scrivere un task MapReduce/Hadoop che fa tutto questo non è per niente complicato…
Sarebbe interessante calcolare l’indice di ritardo medio e confrontarlo con quello ufficiale che viene calcolato da Trenitalia per il rimborso dell’abbonamento.
Vero. Non sarebbe difficile farlo; basta avere la lista di tutti i numeri di treno della linea + un task MapReduce e ogni giorno salvare i dati. A fine mese, calcolare il ritardo medio.