Archivio mensile:luglio 2016

Star Trek: Discovery!

Ieri sera alle 23.00 durante il panel alla San Diego Comic Con dedicato al 50° anniversario di Star Trek, lo show runner Bryan Fuller ha finalmente annunciato il titolo della nuova serie di Star Trek in arrivo su NETFLIX a Gennaio 2017.

La nuova incarnazione di Star Trek in televisione si chiamerà STAR TREK: DISCOVERY.

yedhzj5Purtroppo Fuller è stato avaro di dettagli, ma contestualmente all’annuncio del titolo ha anche mostrato un breve teaser trailer (con CGI ovviamente placeholder) che mostra la USS Discovery NCC 1031 uscire da un asteroide:

Il design della Discovery è un po’ grezzo, tuttavia uno dei produttori esecutivi della serie ha affermato che non è ancora definitivo.

screen-shot-2016-07-23-at-6-15-31-pm-480x221

 

screen-shot-2016-07-23-at-6-15-58-pm-480x272

L’ultima informazione che Fuller ci ha concesso è stata la conferma che la serie sarà ambientata nel Prime Universe e non nella Kelvin Timeline:

Gli annunci ufficiali terminano qui, per il momento, ma ci sono alcune cose su cui si può iniziare a ragionare. Al di là del discorso fatto sull’inclusività durante il panel e dall’affermazione che donne e persone LBGT giocheranno un ruolo più importante rispetto al passato nella nuova incarnazione di Star Trek, il teaser ci da qualche piccolo dettaglio.

Per prima cosa, il numero di registro: NCC 1031. Analizzando strettamente il numero, sembrerebbe una nave costruita prima dell’Enterprise originale (NCC 1701), ma dopo l’Enterprise di  Archer (NX 01). Questo potrebbe posizionare temporalmente DSC prima della Serie Classica e dopo Enterprise.

Tuttavia, come avrete notato, ho parlato di “data di costruzione”: potrebbe essere, infatti, che la nave per quanto vecchia sia stata riutilizzata (ricordiamo il furto dell’Enterprise dal museo nei film) per qualche ragione.

Oppure, potrebbe trattarsi di una versione più nuova di una vecchia Discovery, mantenendone il numero di registro senza aggiungere lettere (come accade per la Defiant su Deep Space Nine).

Naturalmente la spiegazione più semplice potrebbe essere che in effetti la serie è ambientata prima della Serie Classica e prima di Kirk. Tuttavia, un indizio sul fatto che le cose non sono così semplici lo da Fuller stesso affermando che non vogliono ancora svelarci il periodo temporale, suggerendo che c’è qualcosa di più importante legato a questa scelta.

Potrebbe essere che la nuova serie di Star Trek racconti le avventure delle navi chiamate Discovery e che ogni stagione cambierà periodo temporale per seguire le avventure delle successive incarnazioni della nave, dando significato alla forma plurale del testo apparso nel primo teaser “New Crews“. Una prima stagione potrebbe seguire la Discovery originale, un’altra la Discovery B, un’altra ancora la Discovery D, e via dicendo, percorrendo la time line. Questo sembrerebbe in accordo con la risposta di Fuller di qualche mese fa alla domanda se incontreremo o meno personaggi noti: “prima o poi”.

Tutto è possibile a questo punto. Personalmente, dopo la buona notizia che conferma che DSC sia ambientata nel Prime Universe, la mia speranza sarebbe che fosse anche ambientata dopo Voyager/Nemesis e quindi interamente nel futuro, senza trattarsi di un ulteriore prequel. Tuttavia, credo che l’opzione che vede la serie seguire le varie navi chiamate Discovery sia piuttosto meritevole d’attenzione e che potrebbe risultare corretta.

Prima di chiudere un piccolo dettaglio: nel nuovo teaser, quando scompare il logo di Star Trek: Discovery per fare posto al messaggio che segnala che la serie sarà disponibile su CBS All Access si sente l’inconfondibile effetto sonoro di una nave che si occulta…

Non resta che aspettare le prossime rivelazioni, che accadranno probabilmente più vicini al mese di Settembre data per la quale inizieranno le riprese!

Star Trek Beyond – Recensione

Iniziamo con un ovvio avviso: Se non avete visto Star Trek Beyond, chiudete questa pagina poiché sarà ovviamente piena di spoilers.

Bene, cominciamo. Ieri sera ho visto Star Trek XIII, ovvero il terzo film della Kelvin Timeline, Star Trek Beyond. Giusto per dare un po’ di background sui miei gusti, diciamo così, ho apprezzato molto Star Trek XI (Star Trek 2009), ma dopo una prima impressione positiva, ho valutato negativamente Star Trek XII (Star Trek Into Darkness) per le assurde scelte, per i buchi di trama e per l’insensatezza generale del film (sebbene ci siano degli ottimi momenti).

Prima di approcciare Star Trek Beyond, reduce da Into Darkness, ero quindi un po’ cauto, rifiutando di lasciarmi andare a facili entusiasmi o facili critiche (nonostante il primo teaser del film sia la cosa più brutta mai legata al nome di Star Trek).

Durante la visione del film mi sono chiesto più volte “Mi sta piacendo?” e la risposta, stranamente, era “Boh.”. Quel “boh” chiarisce il problema del film. Non è un brutto film, ma non è neppure un film bello. Non suscita entusiasmo come un film bello che appassiona, ma non suscita neppure fastidio come un film che non piace. Il perché è presto detto: durante il film si susseguono momenti positivi e momenti negativi in modo che non si faccia in tempo a compiacersi di qualcosa che immediatamente si viene riportati sulla neutralità da un avvenimento o scelta di trama quanto meno discutibile.

Se la prima metà del film possa essere comunque descritta come un noioso susseguirsi di scene d’azione, la seconda metà migliora anche sensibilmente, ma in piena coerenza con il film, non fa altro che riportare l’asticella del voto sulla mera sufficienza.

Evitando una recensione pura e semplice (al di là di queste poche parole introduttive), analizziamo in forma di lista ciò che ha di buono il film e poi ciò che ha di negativo.

Positivi:

  • Gli effetti speciali. Senz’altro di prim’ordine, la scena della distruzione dell’Enterprise è quella che meglio esemplifica l’eccellente lavoro tecnico del film.
  • I character moments. Questo forse il punto più a favore del film: la chimica fra i personaggi, i dialoghi tra loro e il senso di famiglia fra l’equipaggio dell’Enterprise è catturato in maniera egregia come in nessun film della Kelvin Timeline al punto da non fare affatto rimpiangere i film del Prime Universe. Questo il miglior complimento che mi sento di fare a Star Trek Beyond, senza riserve.
  • Continuity. Il film ha dei momenti di continuity con Star Trek Enterprise, l’unica serie tv del Prime Universe che è canonicamente in comune ad entrambe le timeline. Si parla di MACO e degli Xindi (Stagione 3 di Enterprise), si vede una NX (La Franklin) che è molto simile come design all’Enterprise NX-01, si parla di motore a Curvatura 4 (costruita quindi prima della NX-01, nonostante il numero di registro sia successivo perché ricommissionata per le Guerre Romulane, che vengono citate).
  • L’omaggio a Leonard Nimoy. All’inizio del film, due vulcaniani informano Spock che l’Ambasciatore Spock è deceduto, consegnandogli un pacchetto con alcuni suoi effetti personali. All’inizio ci viene mostrata una fotografia con il viso dell’Ambasciatore e la data stellare di nascita e di morte. In seguito Spock ammette la sua tristezza per l’avvenimento con McCoy, pur dicendo che è illogico temere la morte. Alla fine del film, Spock apre il pacchetto contenente gli effetti personali dell’Ambasciatore e rinviene questa fotografia:
    8447127_orig
    Decisamente un momento toccante e fra i migliori del film.
  • Il finale con la celebre frase “Spazio, ultima frontiera” recitata da tutti i membri dell’equipaggio e la partenza dell’Enterprise-A.
  • Nonostante il trambusto causato sul web nei giorni scorsi della rivelazione, la scena in cui Sulu e il suo compagno si abbracciano con figlia al seguito sulla Yorktown l’ho trovata buona. Certo, è brevissima (4 secondi netti) e credo che il 90% del pubblico non farà 2+2, ma è un modo più che dignitoso di avere il primo personaggio LBGT in Star Trek. Sulu è gay e ha una figlia (Demora Sulu, futuro timoniere dell’Enterprise B). Almeno nel futuro non è una questione su cui discutere come ancora lo è nel 2016, specie in Italia!

Gli aspetti positivi, per quanto sicuramente interessanti, finiscono qui. Nessuno di essi (eccezion fatta per l’ottimo lavoro su personaggi e dialoghi tra loro) eccelle in maniera significativa.

Negativi:

  • Le scene d’azione si susseguono senza tregua al punto che sembra che il film abbia FRETTA di passare da una scena d’azione alla successiva, non dando minimamente il tempo di riflettere su ciò che sta accadendo e soprattutto sul perché. Da ciò consegue che le scene d’azione, per quanto molto ben fatte tecnicamente, abbiano un impatto emotivo trascurabile. Scorrono via senza infamia e senza lode.
  • Il momento di facepalm più violento al punto da sfiorare la commozione cerebrale è quando trasmettono a massimo volume la canzone dei Beastie Boys “Sabotage” per distruggere le “api” di Krall. Veramente, non ho parole per descrivere l’imbarazzo per quella scena. Potevano accontentarsi di averla trasmessa a bordo della Franklin quando Scotty e Jaylah stavano eseguendo le riparazioni, ma usarla come mezzo per distruggere decine di navi della flotta di Krall è veramente troppo.
  • Il cattivo di turno, Krall. Per tutto il film ci si chiede quali siano le motivazioni e per quasi tutto il film esse ci vengono negate. Sembra il solito cattivo, trito e ritrito, che vuole distruggere la federazione “perché si”. Quando, a film quasi finito, ero rassegnato al fatto che sarebbe restato un “mistero” ecco che vengono rivelate le sue motivazioni e la sua identità. Le sue motivazioni sono RIDICOLE e ASSURDE e la sua identità forzata in maniera che non ha eguali.
    Krall è un MACO, eroe che ha prestato servizio contro gli Xindi e durante le Guerre Romulane. Quando la Federazione è nata nel 2161, i MACO vengono tutti riassegnati (non essendoci più bisogno di un esercito, dato che la Federazione è un entità pacifica) e a Krall (Balthazar M. Edison, il suo nome umano) viene assegnato il comando della Franklin. Fin qua tutto bene no? Eroe di guerra a cui affidano nientemeno che una nave da comandare. Ebbene, a causa di “reasons” si schianta con la nave sul pianeta oggetto del film. L’incidente è grave, molti del suo equipaggio muoiono e chiede soccorso alla Federazione. Soccorso che non arriva.
    Bon! Ecco le sue motivazioni! Era un soldato e voleva restare a fare il soldato, la Federazione lo ha trasformato in un capitano (come osano!) e poi non sono andati a salvarlo perché “lo hanno ignorato”. Quindi ora li odia tutti e deve lanciarsi in una crociata (usando un’arma che non si sa bene come o perché abbia trovato e come mai parte di essa fosse in mano di Kirk senza che questi ne conoscesse il valore) per distruggere i mondi della Federazione. Per cortesia. Basta con queste assurdità. Se non siete capaci di creare un cattivo con motivazioni sensate, SMETTETE DI PROVARCI. Tralascio volutamente il fatto che abbia trovato un modo, su quel pianeta, di assorbire altri esseri viventi assumendone l’aspetto e prolungandosi la vita. Non mi va di sparare sulla croce rossa.
  • Mi rendo conto che lo Spock della Kelvin Timeline sia più emotivo dello Spock del Prime Universe poiché perdere la madre E il suo pianeta natale lo abbia sconvolto al punto da far sì che la sua parte umana ogni tanto emerga, ma è proprio necessario vederlo così emotivo in ogni film? Piange per la morte dell’Ambasciatore (pur notando, quantomeno, che sia illogico per lui farlo), Ride alla battuta di McCoy sul fatto che lui avrebbe fatto una festa se fosse morto Spock, Finge di non capire cosa voglia dire “Stronzate!”, ma poi dimostra di averlo capito benissimo in una forzata battuta di rimando a McCoy (si fossero fermati al “Non capisco cosa c’entrino gli escrementi con questa situazione” sarebbe stato invece perfetto). Vuole essere assegnato alla missione di salvataggio perché c’è Nyota (pur essendo illogico che lui, ferito, partecipi alla missione)… e altro. Spock è davvero poco riuscito in questo film anche se non al punto della furia omicida che lo assale alla fine del pessimo Into Darkness. Ammetto che se si voglia far passare che questo Spock sia più umano che vulcaniano, si potrebbero tralasciare questi difetti, ma il risultato è caricaturale. Spock della Kelvin Timeline risulta FINGERE di essere un Vulcaniano, quando in realtà non lo è.
  • Era proprio necessario distruggere l’Enterprise? Va bene che ne ha risultato un’ottima scena di combattimento, però questa necessità di distruggere di continuo l’Enterprise o di danneggiarla gravemente ad ogni film rende l’accadimento stesso privo di alcun mordente.
  • Dopo solo 3 anni di missione quinquennale Kirk vuole già abbandonare il comando per diventare Vice Ammiraglio della York Town (un lavoro d’ufficio)? Eh? Si è già scocciato? Poi, dopo l’avventura in Beyond, cambia improvvisamente idea? Capisco il voler affiancare i “dubbi di Kirk” con quelli, ben più legittimi, di Spock che meditava di abbandonare la Flotta Stellare (come per altro diceva di voler fare alla fine di Star Trek 2009) per aiutare la sua specie a Nuovo Vulcano… ma è assurdo che James T. Kirk, si sia annoiato di fare il Capitano dopo solo tre anni. Com’è assurdo che cambi  velocemente idea alla fine del film, in tempo per lanciarsi con l’Enterprise A verso una nuova avventura. Avrebbero fatto meglio a rimuovere queste scene invece che aggiungerle.

Alla fine momenti positivi e negativi si inseguono e si equivalgono, facendo sì che il film non decolli mai, ma che mai si affossi. Il mio voto, almeno all’attivo della prima visione, è un mero 6/10.
Star Trek Beyond è un film che, senza infamia e senza lode, lascia trascorrere 2 ore di tempo osservando effetti speciali, pregevoli character moments e… opinabili scelte di trama. 

Python e Selenium per Web Scraping

Introduzione

A volte può essere necessario consultare più volte lo stesso sito alla ricerca di qualche informazione aggiornata. Ad esempio per verificare le previsioni meteo di una determinata città, oppure per controllare la disponibilità di un servizio o articolo che si desidera acquistare.

Oltre a recarsi manualmente e personalmente sul sito in questione, c’è la possibilità di scrivere uno script che si occupi più o meno automaticamente di reperire le informazioni richieste. Questa procedura è chiamata Web Scraping.

Per la creazione di questo script si può usare qualsiasi linguaggio di programmazione, ma spesso – per semplicità e comodità – si adopera Python un linguaggio interpretato.

Vediamo come fare!

Installazione

  1. Installiamo la versione 3.5 di Python, scaricando dal sito ufficiale la versione più recente. Questo tutorial usa la versione 3.5 (32 bit).
  2. Dopo l’installazione, è necessario installare la libreria Selenium che si occupa di Web Scraping & Automation su Python. La libreria si installa semplicemente aprendo il prompt dei comandi, digitando:
    pip install Selenium
    

    “pip” è un utility inclusa nell’installazione base di Python. Se digitando il comando di sopra, non si avvia l’installazione c’è un problema di impostazione del PATH di Python. Nulla di grave, per risolvere rapidamente, portatevi con il prompt dei comandi alla cartella SCRIPTS contenuta dentro la vostra installazione di Python (esempio: C:\Users\NOMEUTENTE\AppData\Local\Programs\Python\Python35-32\Scripts) e rilanciate il comando; troverete pip.exe che vi consentirà di lanciare la procedura di installazione di Selenium.

  3. Scarichiamo ChromeDriver, una versione “semplificata” di Chrome che verrà adoperata da Selenium per il Web Scraping.
  4. Creiamo una cartella dove andremo a posizionare il nostro script python e copiamo il file chromedriver.exe che abbiamo scaricato al punto 3.

Siamo pronti!

Lo Script

È il momento di scrivere il nostro script. Per questo esempio, andremo a reperire informazioni dal sito https://fibra.click/, comodissimo sito per verificare la copertura FTTC di Tim.

Prima di cominciare una parola di avvertimento: la procedura di Web Scraping, se portata all’eccesso (numerosissime richieste in un arco limitato di tempo) è chiaramente malvista poiché va ad appesantire spesso inutilmente il sito in questione (alla stregua di un attacco DDOS). Diversi siti cercano attivamente di scongiurare questa pratica, anche per questa ragione. Lo script che faremo con questo tutorial, comunque, utilizza una vera e propria pagina web per inviare le richieste di dati, procedura comunque lenta (si simula l’intevento di un utente) che non provoca alcun disagio al sito in questione, ma comunque ricordiamoci di non sovraccaricare i siti che andiamo ad analizzare.

Per prima cosa creiamo un nuovo file di testo, chiamiamolo WebScrapeTutorial.py e salviamolo nella cartella in cui abbiamo messoil file chromedriver.exe. Possiamo usare un qualsiasi editor di testo per scrivere il codice dello script, da blocco note, passando per Notepad++ fino a IDLE il piccolo editor incluso con Python. Scegliete lo strumento che volete.

Iniziamo quindi a digitare il codice:

#!/usr/bin/env python
# -*- coding: latin-1 -*-

import os
import time
import sys
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

 

Queste prime linee si occupano di impostare l’encoding di testo (per poter usare le lettere accentate) e di caricare le librerie che andremo ad utilizzare.


application_path = os.path.dirname(__file__)
chromedrv_path = application_path+"\chromedriver.exe"

Qui dichiariamo due variabili. La prima memorizza il path in cui è posizionato il file .Py, la seconda invece crea il percorso completo per il file chromedriver.exe necessario a Selenium per operare correttamente.


# FUNCTIONS
def GiveInfo():
    print("CENTRALE: \n" + central_planned + "\n") 

    # Format the cabinets data
    try:
        lines = cabinets_planned.splitlines()
        lines.remove('torna alla lista delle centrali')
        lines.remove('Clicca qui per scoprire')
        lines.remove('come identificare l\'armadio')
        lines.remove('torna alla lista delle centrali')
        for item in lines:
            if item:
                print(item)
    except:
        print("\nNon ci sono armadi pianificati. Spiacente!")

    print("\n" + lastUpdate + "\n")

Definiamo una semplice funzione chiamata GiveInfo() il cui compito è quello di mostrare a schermo le informazioni raccolte dal nostro script. Dopo un print() iniziale che formatta il testo da mostrare a schermo, si apre un blocco try…except.
Nel blocco try si prende la variabile cabinets_planned (che vedrete più avanti nel codice) e la si divide in diverse linee, andandola quindi a memorizzare nella variabile lines.
Quindi si cerca di rimuovere da questa variabile, le linee che non vogliamo mostrare a schermo perché inutili; sono linee che appaiono sul sito che andremo a “scrapare”, ma che non servono per l’output finale.
A questo punto, con un ciclo for, stampiamo a schermo le linee restanti: esse saranno le informazioni riguardo tutti gli armadi ripartilinea pianificati.
Il blocco except si occupa di intercettare un errore (cioè l’impossibilità di trovare le linee che cerchiamo di rimuovere) e di mostrare a schermo un messaggio che spiega che non ci sono armadi pianificati.


print ("Inserisci la città per la quale verificare la copertura FTTC: ")
city = input()

if not city:
    print("Città default: Melegnano\nIn lavorazione...\n")
    city = "Melegnano"
else:
    print("Città scelta: " + city + "\nIn lavorazione...\n")

Con questo codice inizia lo script vero e proprio. Con il comando print() mostriamo a schermo il testo nel quale chiediamo all’utente di inserire il comune per il quale vuole verificare la copertura (il campo COMUNE che bisogna inserire sul sito fibra.click), mentre con il comando input() raccogliamo l’input dell’utente e lo mettiamo nella variabile city.

A seguire facciamo un controllo mediante if…else per verificare se l’utente ha digitato o meno una città. Se non l’ha digitata, inseriamo una città default (così si evita di incorrere in un errore, ma è anche comodo nel caso si voglia controllare frequentemente lo stesso comune), in caso contrario (else) mostriamo a schermo la città scelta.


driver = webdriver.Chrome(chromedrv_path)
driver.set_window_position(-5000, 0)
driver.get('https://fibra.click/');

time.sleep(1) # Pausa di 1 secondo prima del prossimo comando

È il momento di utilizzare Selenium! Creiamo una variabile chiamata driver e quindi carichiamo un web driver Chrome passando come parametro il percorso in cui si trova il chromedriver.exe. Posizioniamo la schermata di Chrome al di fuori dello schermo (per non mostrarla all’utente, dato che lo script si occuperà di automatizzarne le interazioni, e poi con il comando GET andiamo a caricare il sito in questione.
In chiusura il comando time.sleep() permette di aspettare un secondo prima dei prossimi comandi, per dare il tempo a Selenium di aprire la pagina scelta. Questo valore potrebbe dover aumentare nei siti più complessi e pesanti.


search_box = driver.find_element_by_class_name('input_home')
search_box.send_keys(city)
search_box.send_keys(Keys.RETURN)

time.sleep(3) # Pausa di 3 secondi prima del prossimo comando

Adesso inizia la “magia”. Cerchiamo l’elemento “input_home” nel sito e lo memoriziamo nella variabile search_box.
Andando ad aprire il codice sorgente del sito fibra.click, possiamo infatti vedere che il campo dove inserire il nome del comune si chiama proprio INPUT_HOME. Così facendo possiamo dire a Selenium qual è il campo col quale dovrà interagire.

Ecco infatti una parte del codice HTML del sito in questione:


<div class="block1 centered">
			<h2>Con FibraClick puoi verificare la<br>
				copertura della fibra FTTC di TIM</h2>
			<br>
			<img class="home_artwork" alt="" src="/resources/home_artwork.png">
			<br>
			<p>Inserisci il nome del comune<br>per effettuare la ricerca.</p>
			<br>
			<div class="input_ricerca">
				<input type="text"
					   class="input_home"
					   placeholder="Esempio: Trento"
					   v-model="cap"
					   v-on:keypress.13="search">
				<a class="button" v-on:click="search"><img src="resources/search_icon.png" style="width:25px;margin-top:5px"></a>
			</div>
			<br><br>
		</div>

Si vede che la “class” della casella di testo si chiama proprio input_ricerca.
Il comando send_keys() serve proprio a inviare il testo alla casella di testo, nello specifico il nome della città chiesta all’utente all’inizio dello script.

Il successivo send_keys(Keys.RETURN) fa proprio quello che sembra: preme il pulsante INVIO, dando il via alla ricerca!


try:
    planned = driver.find_element_by_xpath('//*[@id="risultati_centrali"]/table/tbody/tr/td[2]')
    central_planned = planned.text  #get the planned data for central
    planned.click()     #click on the central to get the cabinets
    time.sleep(3)       #give some time to load info
except:
    print("Non ho trovato alcuna centrale pianificata per " + city)
    central_planned = "Non pianificata"

Qui inizia un blocco try…except nel quale andiamo a cercare il campo sul sito che mostra la data (se presente) di pianificazione della centrale per il comune ricercato.

In questo caso, invece di usare find_element_by_class, utiliziamo un altro sistema: by_xpath.
XPATH è il “nome” di un elemento specifico che magari non ha una sua classe o nome specificato. Trovare l’XPATH in questione è semplice: basta aprire il sito in questione con Chrome, cliccare col destro sul campo / dato per il quale si vuol conoscere l’XPATH (nel nostro caso la riga in arancione o verde con su scritto “Pianificato/Attivo per/il DATA”) e cliccare su ISPEZIONA. A questo punto apparirà una finestrella a lato, li basta cliccare con il pulsante destro del mouse sulla linea già evidenziata (che mostrerà il testo in questione) e fare click su Copy > Copy XPATH. Ora abbiamo l’XPATH dell’elemento che ci serve, e possiamo quindi inserirlo come argomento della funzione find_element_by_xpath().

Subito dopo, creiamo una variabile chiamata central_planned (che già abbiamo visto nella funzione GetInfo()) e vi mettiamo il testo del campo che abbiamo trovato con la funzione di cui sopra.
Il comando click() che segue serve a cliccare sopra l’elemento in questione, che nel sito fibra.click serve per allargare la centrale scelta per andare ad analizzare gli armadi pianificati.
Segue la classica attesa (in questo caso di tre secondi).

Il blocco except che viene chiamato in causa se non viene trovato l’elemento in questione (nel caso, ad esempio, di assenza totale di pianificazione per il comune scelto) si occupa di dare un messaggio d’errore all’utente, senza causare però alcun crash.


# get the cabinets

try:
    cabinets = driver.find_element_by_xpath('//*[@id="risultati_armadi"]')
    cabinets_planned = cabinets.text
except:
    print("Non ho trovato alcun armadio pianificato per " + city)
    cabinets_planned = "Non pianificati"

In questo blocco successivo, si fa esattamente la stessa cosa, andando però a cercare l’XPATH dell’elemento che mostra i risultati degli armadi pianificati. Come prima, si procede manualmente sul sito e si ricerca l’XPATH che ci serve.


#get date
try:
    updated = driver.find_element_by_xpath('//*[@id="block2"]/span')
    lastUpdate = updated.text
except:
    lastUpdate = "Non sono riuscito a trovare la data dell'ultimo aggiornamento."

L’ultimo blocco ha lo scopo di andare a reperire la nota in fondo alla pagina che mostra, nel nostro caso, a quale versione corrispondono i dati TIM di questa ricerca.


GiveInfo()

print ("Premi invio per chiudere!")
check = input()

driver.quit()

Ecco finalmente la chiamata alla funzione che abbiamo definito all’inizio. Ora abbiamo tutte le variabili colme di informazioni e la funzione GiveInfo() può mostrarle in maniera pulita e ordinata all’utente.

Segue quindi la richiesta di chiusura seguita dall’attuale chiusura del driver e dello script.

Ecco nella sua interezza il codice completo dello script:


#!/usr/bin/env python
# -*- coding: latin-1 -*-

import os
import time
import sys
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

application_path = os.path.dirname(__file__)
chromedrv_path = application_path+"\chromedriver.exe"

# FUNCTIONS
def GiveInfo():
    print("CENTRALE: \n" + central_planned + "\n") 

    # Format the cabinets data    
    try:
        lines = cabinets_planned.splitlines()
        lines.remove('torna alla lista delle centrali')
        lines.remove('Clicca qui per scoprire')
        lines.remove('come identificare l\'armadio')    
        lines.remove('torna alla lista delle centrali')  
        for item in lines:
            if item:
                print(item)
    except:
        print("\nNon ci sono armadi pianificati. Spiacente!")

    print("\n" + lastUpdate + "\n")

print ("Inserisci la città per la quale verificare la copertura FTTC: ")
city = input()

if not city:
    print("Città default: Melegnano\nIn lavorazione...\n")
    city = "Melegnano"
else:
    print("Città scelta: " + city + "\nIn lavorazione...\n")

driver = webdriver.Chrome(chromedrv_path)  
driver.set_window_position(-5000, 0)
driver.get('https://fibra.click/');

time.sleep(1) # Pausa di 1 secondo prima del prossimo comando

search_box = driver.find_element_by_class_name('input_home')
search_box.send_keys(city)
search_box.send_keys(Keys.RETURN)

time.sleep(3) # # Pausa di 3 secondi prima del prossimo comando

try:
    planned = driver.find_element_by_xpath('//*[@id="risultati_centrali"]/table/tbody/tr/td[2]')        
    central_planned = planned.text  #get the planned data for central
    planned.click()     #click on the central to get the cabinets
    time.sleep(3)       #give some time to load info
except:
    print("Non ho trovato alcuna centrale pianificata per " + city)
    central_planned = "Non pianificata"

# get the cabinets

try:
    cabinets = driver.find_element_by_xpath('//*[@id="risultati_armadi"]')
    cabinets_planned = cabinets.text
except:
    print("Non ho trovato alcun armadio pianificato per " + city)
    cabinets_planned = "Non pianificati"

#get date
try:
    updated = driver.find_element_by_xpath('//*[@id="block2"]/span')
    lastUpdate = updated.text
except:    
    lastUpdate = "Non sono riuscito a trovare la data dell'ultimo aggiornamento."

GiveInfo()

print ("Premi invio per chiudere!")
check = input()

driver.quit()

Spero che questo breve tutorial vi sia stato utile! Happy scraping! 🙂