Assegnare un id ad elementi con parser

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
Ho intenzione di scrivere un tool che estragga dati da soccerway.com. Ho intenzione infatti di creare una sorta di storico:

http://it.soccerway.com/national/italy/serie-a/20152016/regular-season/r31554/

come potete vedere i dati sono raggruppati in stagioni calcistiche, quindi ci sarebbe database 2015/2016 - 2016/2017 e così via. Quello che voglio fare è quindi prelevare i dati, inserirli nel database per poi eseguire con una cron job un modulo che vada ad aggiornare tali valori. Il problema è che ogni dato dovrebbe avere una chiave di riconoscimento su cui eseguire l'aggiornamento o qualcosa del genere. Attualmente ho in mente soltanto il funzionamento del parser ma non so proprio come posso creare una procedura di aggiornamento chiave => valore.
Per esempio, prendete la classifica serie A dal link che vi ho fornito, come posso (una volta inseriti i dati), in futuro controllare con la cronjob che ci siano aggiornamenti e sostituire i valori?
So che per vedere se ci sono gli aggiornamenti potrei sfruttare il campo lastUpdate nell'header e salvarlo da qualche parte nel database, per poi con la cronjob andare a controllare questo campo per ogni campionato. Il punto più importante però è riconoscere i valori da aggiornare perché non ho nessun id a cui fare riferimento.

Qualche idea?
 
Ciao, non ho ben capito quale tabella vuoi prelevare comunque potresti aggiornare sempre tutto poi con affected rows al massimo puoi sapere quanti record sono stati effetivamente modificati
 
Ciao, non ho ben capito quale tabella vuoi prelevare comunque potresti aggiornare sempre tutto poi con affected rows al massimo puoi sapere quanti record sono stati effetivamente modificati

Uhm vediamo se riesco a spiegartelo senza fare giri di parole:

Come avrai visto il sito mette a disposizione x Nazioni, ogni nazione a sua volta mette a disposizione x competizioni, in ogni competizione ci sono x tabelle da prelevare.

Per il momento io non ho bisogno di tutte le nazioni ma soltanto di una decina, quindi per esempio io mi salvo nel mio database le nazioni seguenti: Italia, Francia e Inghilterra.
Nello script che viene eseguito dalla cron job ho quindi inizialmente un controllo del genere:

[AVVIO SCRIPT] -> Itero nazioni disponibili nel mio database -> comparo la nazione corrente con quella deserializzata dal link principale it.soccerway.com (che appunto contiene una lista di tutte le nazioni).
Corrisponde? No-> Continua
Si-> Aggiorna la competizione.

Ora prima di aggiornare la competizione corrente devo effettivamente verificare se la competizione esiste (cioè è già stata inserita sul database oppure no). Questo perché ogni anno alcune competizioni potrebbero non essere disponibili. Come ho già detto ogni stagione calcistica avrà un suo database, quindi season2015_2016, season2016_2017 ecc...

Eseguo quindi un'ulteriore controllo, in particolare verifico se la competizione in iterazione è presente sul mio database.
È presente-> ok aggiorna
No? -> Qui c'è il problema, ogni dato che dovrà essere prelevato in seguito dovrà appartenere in primis ad una stagione calcistica, ma se si trova nel database season2015_2016 non è un problema visto che fa già parte di quella stagione; poi dovrà appartenere (io per appartenere intendo riconosciuto), da un codice di competizione (il codice competizione dovrà a sua volta presentare la nazione di appartenenza).
Quello che devo fare è quindi, in qualche modo, assegnare un codice della competizione corrente che non è presente sul database. Ora prendiamo in esempio la competizione "Serie A 2015-2016", che presenta questo link:

http://it.soccerway.com/national/italy/serie-a/20152016/regular-season/r31554/

come puoi vedere c'è un r31554 che molto probabilmente rappresenta una sorta di identificativo, questo stesso codice lo si può trovare nel json appartenente alle tabelle della competizione.

Forse mi sto rispondendo da solo alla domanda, quello che potrei fare a questo punto è prendere questo codice e salvare nella tabella competizioni (del mio database) una struttura tipo questa:

[COMPETIZIONI]

NOME | CODICE | LINK
Serie A r31554 http://it.soccerway.com/national/italy/serie-a/20152016/regular-season/r31554/

Il link non so ancora se mi serve o meno. Comunque lo inserisco.
A questo punto una volta inserita la competizione passo ad aggiornare i relativi dati di tutte le competizioni che ho nella mia tabella.
Siamo già in iterazione delle competizioni, quindi una volta aggiunta la competizione devo controllare se i dati di essa sono disponibili. Ovviamente no se è stata appena aggiunta. Ora per semplificare il codice in termini di performance potrei creare due funzioni una first_population e un altra update_competition. La prima viene eseguita solo se la competizione è stata appena aggiunta e l'altra invece viene utilizzata solo se la competizione è stata trovata sul database.

Prevedo già smadonnamenti davanti alla tastiera per realizzare un sistema del genere ._.

Comunque supponiamo che invece di questi due metodi io faccia tutto in uno, eseguirei prima una ricerca del codice della competizione quindi r31554, se esiste allora significa che io devo aggiornare i valori. Se non esiste nessuna riga con questo codice allora i valori devono essere inseriti.
Nel caso in cui esiste io non voglio eliminare i dati disponibili sul database, per poi reinserirli ma voglio aggiornarli riga per riga per evitare fault poi sulle rest api che realizzerò in caso di aggiornamento corrente. Ma questo è un altro discorso, cioè metti caso che io invii la richiesta per prelevare la classifica di serie a, però lo script della cron job sta aggiornando e allora non ci sono dati perché sono stati nel frattempo eliminati e poco dopo inseriti, questa cosa non deve portare inceppamenti.

Quindi tieni in memoria che io quindi vado ad aggiornare i dati, come faccio? Ho in mente di iterare su tutte le righe con il codice r31554 (cavolo quanti foreach haha), prima dell'iterazione però mi deserializzo il json della classifica di seria a, in particolare questo

Il link della classifica ho notato che viene assemblato da javascript, probabilmente quelli del sito avranno voluto contrastare lo scraping. Ma per me non è un problema, perché mi basta assemblarlo, visto che il link presenta una base e i parametri della competizione. Quindi una volta assemblato il link, deserializzo il json che ritorna ed itero sui valori.

Ogni valore che corrisponde a r31554 deve essere comparato con quelli presenti sul database, come già detto. Quindi che so è in iterazione Inter (database) == Inter (json) ? Aggiorno la riga corrispondente con i valori del json. Eventualmente mi salvo pure un file di log così vedo quali nazioni sono state aggiornate o meno. Se il valore non è presente viene inserito.

Per ottimizzare la procedura io vorrei evitare (visto che si parla di cron job) di aggiornare i valori quando non ce n'è il bisogno, ho notato che il json ritornato è simile a questo: http://pastebin.com/UMuxLebN
inserendo il contenuto qui: http://json.parser.online.fr/ come si può vedere c'è un campo del json con "

Codice:
timestamp":"Thu, 10 Mar 2016 18:42:07 +0100"

Penso che si riferisca alla data di ultimo aggiornamento, quindi quando vado ad aggiornare mi salvo questo campo sulla tabella competizioni che quindi diventa:

NOME | CODICE | LINK | lastUpdated
Serie A r31554 ... Thu, 10 Mar 2016 18:42:07 +0100

In modo da evitare l'aggiornamento quando non necessario e passare ad un altra competizione.

Vedi un po' se il fumo gira e fammi sapere. Ti/vi chiedo scusa per questo sproloquio ma almeno ho chiarito un bel po' della mia idea di codice. Prima di realizzarla però, è bene analizzarla e cercare eventuali casistiche che potrebbero crearmi problemi. Inoltre chiedo se qualcuno è interessato a volermi dare una mano, sarebbe utile in questo contesto. Anche se ho realizzato codici molto più complessi. Non è una questione di difficoltà ma anche di tempo, in modo da velocizzare il tutto, come si dice? Due mani in più fanno sempre comodo.

Dimmi cosa ne pensi o se hai domande su alcuni punti, in particolare se sono stato poco chiaro su alcune cose. Se hai altro da chiedermi and so on.
 
Ultima modifica:

Discussioni simili