Purple exclamation mark.svg Planning the future of Botwiki! - Help us bring Botwiki up to date, contribute to our strategy discussion, add bot scripts, and contribute manuals, guides, and tutorials! Almost anything related to bots, particularly those used to edit mediawiki, is welcome.

Red exclamation mark.svg UNABLE TO EDIT? - We've experienced attacks by spambots lately and now require you to confirm your e-mail before you can edit (go to your preferences, enter an e-mail address, and request a confirmation e-mail, then go to your e-mail and click on the confirmation link). We also require new accounts to make a few edits and wait a few minutes before before you can create a page; however, if this is a problem contact us in #botwiki and we can manually confirm your account. Sorry for the inconvenience.

Python:UpdateTimeTableTrenitalia.py

From Botwiki
Jump to: navigation, search

Readme-it

#!/usr/bin/python
# -*- coding: utf-8  -*-
"""
Script for my dad to update trenitalia's timetable in a .xls file.
 
If you want to use this script too, change the stations.
 
This file needs [[Python:Excel.py]] on http://botwiki.sno.cc/
and it's compatible only for windows.
 
3.60€ gained :-D
"""
#
# (C) Filnik, 2008
#
# Distributed under the terms of the MIT license.
#
__version__ = '$Id: $'
#
 
import excel
import urllib2, re, time, datetime
import pywintypes
 
def pageText(url):
    user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7'
    try:
        request = urllib2.Request(url)       
        request.add_header("User-Agent", user_agent)
        response = urllib2.urlopen(request)
        text = response.read()
        response.close()
        # When you load too many pages, this function can give errors, so catch them.
    except urllib2.HTTPError:
        print u"Server error. Pausing for 10 seconds... " + time.strftime("%d %b %Y %H:%M:%S (UTC)", time.gmtime())
        time.sleep(10)
        request = urllib2.Request(url)
        request.add_header("User-Agent", user_agent)
        response = urllib2.urlopen(request)
        text = response.read()
        response.close()
    return text
 
def main():
    # CAMBIA QUI SOTTO!!
    stazione_partenza = 'Ponte Di Brenta'
    stazione_arrivo = 'Ve. Mestre'
    xls_file = 'C:\\Arch_Excell\\CASA_AUTO\\orari_treni\\orari_treni_temp.xls'
    # NON STA TOCCARE QUA SOTTO! Grazie :-)
 
    print """Programma per scaricare in un file .xls la tabella degli orari dei treni con:
Stazione di Partenza: %s
Stazione di Arrivo: %s
Nel file .xls: %s
Per cambiare i settaggi, modificare manualmente il file.
--------------------------------------------------------
""" % (stazione_partenza, stazione_arrivo, xls_file)
    #"""
    # Now we have to find out what is yesterday and what is tomorrow
    # Local time in seconds basing on a selected time (default function)
    current_time = time.time()
    # Seconds In A Day    
    siad = 24*60*60
    # Getting the current time in a tuple with the day, month, year and so on
    date = time.localtime(current_time + siad)
    # Pick up the year
    year = date[0]
    # Pick up the month
    month = date[1]
    # Pick up the day
    day = date[2]
 
    num_pag = 1
    # Inizializzo questa variabile (non si puo' aggiungere testo alle variabili non esistenti)
    HTML_text = ''
    # Devo prendere da stazione 1 a stazione 2 e viceversa, quindi faccio 2 giri.
    secondo_giro = False
    print "Prelevo gli orari di domani, %s/%s/%s...\n" % (day, month, year) 
    while 1:
        print "Prelevo gli orari: %s -> %s..." % (stazione_partenza, stazione_arrivo)
        while 1:
            print "Carico la pagina: %s..." % num_pag
            url = 'http://orario.trenitalia.com/b2c/TimeTable?stazin=' + stazione_partenza.replace(' ', '%20') \
                  + '&stazout=' + stazione_arrivo.replace(' ', '%20') + '&datag=' + str(day) + '&datam=' + str(month) + '&dataa=' + str(year) + \
                  '&timsh=0&timsm=00&lang=it&nreq=5&channel=tcom&sort=0&npag=' + str(num_pag) + '&solotreno=0&noreservation=0&economy=1'
            HTML_text_temp = pageText(url)
            pulsante_successive_regex = r'value="Successive"'
            pulsante_successive = re.findall(pulsante_successive_regex, HTML_text_temp)
            HTML_text += HTML_text_temp
            if pulsante_successive == []:
                break
            else:
                num_pag += 1
                time.sleep(1) # Diamo un secondo di pausa al server...
                continue
        print "\nPrendo gli orari dalle pagine caricate...\n"
        # Il testo in HTML e' formattato un po' maluccio, percio' nella regex di arrivo c'e' la stazione di partenza e viceversa
        # ma e' giusto cosi'.
        regex_partenza = r'<font face="Verdana,Arial" size="1" color="#000000">(.*?)</font><font face="Verdana,Arial" size="1" color="#000000"></font>'
        orari_partenza = re.findall(regex_partenza, HTML_text)
        regex_arrivo = r'<font face="Verdana,Arial" size="1" color="#000000"><a title="' + stazione_partenza + \
                         '"><font color="#000000">.*?</font></a></font><a href="#notep"><font face="Verdana,Arial" size="1" color="#000000"></font></a></td><td .*?><font face="Verdana,Arial" size="1" color="#000000">(.*?)<br>'
        orari_arrivo = re.findall(regex_arrivo, HTML_text)
        regex_durata = r'<font face="Verdana,Arial" size="1" color="#000000"><a title="' + stazione_arrivo + \
                       '"><font color="#000000">.*?</font></a></font><a href="#notea"></a></td><td .*?><font face="Verdana,Arial" size="1" color="#000000">(.*?)</font>'
        orari_durata = re.findall(regex_durata, HTML_text)
        if orari_partenza == [] or orari_arrivo == [] or orari_durata == []:
            raise Exception("Hanno cambiato l'HTML e non riesco a prendere i dati")
        if secondo_giro == True:
            orari_partenza_2 = orari_partenza
            orari_arrivo_2 = orari_arrivo
            orari_durata_2 = orari_durata
            break # Esco dal ciclo, gia' fatto il secondo giro
        else:
            num_pag = 1
            HTML_text = ''
            secondo_giro = True
            orari_partenza_1 = orari_partenza
            orari_arrivo_1 = orari_arrivo
            orari_durata_1 = orari_durata
 
            stazione_partenza_temp = stazione_partenza
            stazione_partenza = stazione_arrivo
            stazione_arrivo = stazione_partenza_temp
    print "Bene, ho scaricato tutti i dati. Ora procedo alla creazione del file .xls"
    #"""
    B2 = '%s ===> %s' % (stazione_arrivo, stazione_partenza)
    G2 = '%s ===> %s' % (stazione_partenza, stazione_arrivo)
    B4 = 'Partenza %s' % stazione_arrivo
    C4 = 'Arrivo %s' % stazione_partenza
    E4 = 'Durata'
    G4 = 'Partenza %s' % stazione_partenza
    H4 = 'Arrivo %s' % stazione_arrivo
    J4 = 'Durata'
    # Apro il file, metto un try/finally per chiuderlo anche in caso di errore
    try:
        excel_file = excel.main(directory = xls_file)
    except pywintypes.com_error:
        raise Exception("Il file non esiste, crealo vuoto che poi lo riempio. Grazie.")
    try:
        # Preparo la "testa" del file
        excel_file.formula('B2', B2)
        excel_file.formula('G2', G2)
        excel_file.formula('B4', B4)
        excel_file.formula('C4', C4)
        excel_file.formula('E4', E4)
        excel_file.formula('G4', G4)
        excel_file.formula('H4', H4)
        excel_file.formula('J4', J4)
        # Pulisco le colonne prima di inserire i nuovi dati
        riga_iniziale = 6 # B6, C6.. quella dove iniziano i dati
        for numero in range(riga_iniziale, 150):
            excel_file.formula('B%s' % numero, '') # Pulisco inserendo una stringa vuota nelle celle
            excel_file.formula('C%s' % numero, '')
            excel_file.formula('E%s' % numero, '')
            excel_file.formula('G%s' % numero, '')
            excel_file.formula('H%s' % numero, '')
            excel_file.formula('J%s' % numero, '')          
 
        # Inserisco le prime tre colonne       
        for numero in range(0, len(orari_partenza_1)):
            print 'Scrivo nella cella: B%s' % (riga_iniziale + (numero * 2))
            excel_file.formula('B%s' % (riga_iniziale + (numero * 2)), orari_partenza_1[numero])
            print 'Scrivo nella cella: C%s' % (riga_iniziale + (numero * 2))
            excel_file.formula('C%s' % (riga_iniziale + (numero * 2)), orari_arrivo_1[numero])
            print 'Scrivo nella cella: E%s' % (riga_iniziale + (numero * 2))
            excel_file.formula('E%s' % (riga_iniziale + (numero * 2)), orari_durata_1[numero])            
        # Inserisco le altre tre colonne
        for numero in range(0, len(orari_partenza_2)):
            print 'Scrivo nella cella: G%s' % (riga_iniziale + (numero * 2))
            excel_file.formula('G%s' % (riga_iniziale + (numero * 2)), orari_partenza_2[numero])
            print 'Scrivo nella cella: H%s' % (riga_iniziale + (numero * 2))
            excel_file.formula('H%s' % (riga_iniziale + (numero * 2)), orari_arrivo_2[numero])
            print 'Scrivo nella cella: J%s' % (riga_iniziale + (numero * 2))
            excel_file.formula('J%s' % (riga_iniziale + (numero * 2)), orari_durata_2[numero])   
    finally:  
        excel_file.save(xls_file)
if __name__ == "__main__":
    main()
Personal tools
Share