bot scraping
Questo tutorial porta come esempio un programma sviluppato in sottoprogrammi in Xml per programmare il bot nel recuperare informazioni più complesse come i dati estratti da pagine web pubbliche e caricate su eventuali database.
Per convenzione, anche se non necessario, è sempre meglio chiamare una cartella con il nome del programma ed inserire all'interno tutti i programmi e sottoprogrammi relativi ad esso.
Prima di procedere è bene chiarire un concetto finadesso non messo in evidenza, cioè quello di un programma che è possibile spezzettare in sottoprogrammi, come se fossero parti di esso ma che potrebbero anche essere caricati dal bot individualmente. Per capire meglio il concetto bisogna spiegare come funziona nell'esempio riportato a video qui sotto. Nel caso specifico parliamo di un programma nominato check_quotations all'interno dell'omonima cartella che ha la funzione di  estrarre i dati dal web collegandosi ad opportune pagine pubbliche e catalogare questi ultimi all'interno di un database. Passo passo chiariremo i vari concetti che in questo programma più complesso abbiamo messo in evidenza.

Step 1
: Apriamo una cartella del desktop e denominiamola check_quotations.

Step 2
: Per convenzione creiamo un file main.xml identificandolo come il file principale che verrà caricato sul bot.
Quindi bando alle ciance vediamo in dettaglio come proseguire evidenziando il file main.xml in questione riportato qui sotto:


<root>
<program>titolo_fb</program>
<pause time="5"></pause>
<program>titolo_ferrari</program>
<pause time="5"></pause>
<program>titolo_juve</program>
<pause time="600"></pause>
<program>main.xml</program>
</root>


Come si evince dal codice incontriamo il tag <program>.  Questo tag identifica il sotto programma che verrà richiamato all'interno di questo programma che quindi rappresenta il programma principale. Il programma da richiamare viene invocato all'interno dei tag, specificando l'intero path relativo alla cartella dove è presente il programma main, vale a dire se il file si trova allo stesso livello di main.xml ometteremo la cartella di appartenenza se si trova dentro una cartella, il percorso dovra includere la cartella di appartenenza in questo modo: nome_cartella/nome_file_programma

Osservando e scorrendo il codice si osserva che l'ultimo programma che viene invocato non è altro che una chiamata ricorsiva allo stesso programma main.xml, permettendoci di creare un loop ricorsivo. Esiste anche il loop while ed altri per creare dei cicli reiterati, ma faremo degli esempi più avanti, spesso però il loop ricorsivo è la migliore scelta.
Leggendo il codice in modo sincrono si evince che il primo programma che verrà eseguito è rappresentato da titolo_fb che prenderemo come esempio per vedere come questo opera ed analogamente faranno gli altri 2. Si evince anche, dalla lettura del codice, che ogni chiamata di un titolo è separata da 5 secondi ed il ciclo si ripeterà ogni 600 secondi, ossia 10 minuti.

Esaminiamo il sotto programma nominato titolo_fb, riportato di seguito senza l'estensione xml che per convenzione destiniamo ai file che verranno direttamente eseguiti all' avvio del Bot.

<titolo_fb>
<http_request url="https://finanza-mercati.ilsole24ore.com/quotazioni.php?QUOTE=!FB.MI" method="get" type_response="text" save="doc_titolo"></http_request>
<save_variable save="testo_titolo">Facebook</save_variable>
<program>parser_quotation</program>
</titolo_fb>
Come vediamo, in questo caso, il tag root è rappresentato da titolo_fb, anche questo per convenzione, perchè avremmo potuto utilizzare qualsiasi tag, l'importante è che sia inclusivo degli altri, ma per convenzione scegliamo come tag root il nome del sottoprogramma che viene richiamato.
La lettura del codice è a dir poco banale, infatti il primo tag (http_request) rappresenta una richiesta http, cioè il richiamo della pagina indicata nell'url, dove dobbiamo fare estrazione dei dati, in questo caso è una pagina de il sole 24 ore che mette a disposizione il titolo istantaneo. Con l'attributo methodtype_response indichiamo rispettivamente il metodo di richiesta(in questo caso GET) e la tipologia di risposta nella fattispecie un file di testo, la risposta verrà salvata tramite l'attributo save  nella variabile denominata doc_titolo.
il secondo tag save_variable che già abbiamo avuto modo di vedere in altri tutorial, non fa altro che salvare la variabile di nome contenuto nell'attributo save(nel caso specifico titolo testo_titolo) assegnandogli il valore contenbuto tra i tag (nella fattispecie facebook). Scorrendo il codice troviamo il richiamo ad un sottoprogramma denominato parser_quotation che verrà richiamato anche dagli sotto programmi elencati in main.xml, infatti si troverà nidificato anche all'interno di titolo_juve e titolo_ferrari.
Quindi esaminiamo il sottoprogramma parser_quotation che risulta essere il più complesso dell'intera applicazione del caso preso in esame.
<parser_quotation>
<parse type="html" document="$doc_titolo" find="td" element="1" save="diff_titolo"></parse>
<parse type="html" document="$doc_titolo" find="td" element="3" save="value_titolo"></parse>
<operation string="$diff_titolo" arg1="+" op="replace" arg2="" save="diff_titolo"/>
<save_variable save="engine_mysql_db_smartbot">mysql+pymysql://root:@localhost/smartbot</save_variable>
<save_variable load="value_titolo,testo_titolo" save="insert_titolo_quotation" upload_content="insert_record"></save_variable>
<print load="insert_titolo_quotation">$insert_titolo_quotation</print>
<orm create_engine="$engine_mysql_db_smartbot" query="$insert_titolo_quotation"></orm>
<if arg1="$diff_titolo" op="gt" arg2="0" else="trend_negativo">trend_positivo</if>
</parser_quotation>
In questo sottoprogramma riscontriamo immediatamente un tag denominato parse, questo ha la funzione di estrarre il contenuto html salvato in precedenza con il nome doc_titolo ed effettuare il parsing del contenuto andando a cercare il terzo elemento td dove è inserito il valore del differenziale del titolo salvandole in una variabile denominata diff_titolo.
Analogamente nel secondo richiamo al tag parse avremo il salvataggio della variabile value_titolo.
Successivamente incontriamo il tag operation che prevede tre argomenti obbligatori arg1, arg2 e op ed uno non obbligatorio identificato da string. Nel caso specifico questa operazione elimina il simobolo "+" dalla variabile diff_titolo. Infatti l'attributo string  serve ad utilizzare una variabile esistente in questo caso $diff_titolo alla quale verrà sostituito l'elemento inserito in arg1 con l'elemento in arg2,  l'attributo op identifica l'azione da eseguire che nel caso in questione è replace.

A questo punto registriamo due variabili da richiamare in seguito: una denominata engine_mysql_db_smartbot, che porta le informazioni per la connessione al database(in questo caso mysql) dove vogliamo che le informazioni estratte vengano salvate.
Nel caso la connessione avvenga ad un database mysql le informazioni da inserire saranno nella forma: 
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]

sostitunendo username con il nome reale dell'username, hostname con quello dell'host o dell'indirizzo ip del server mysql,
e db_name con il nome reale del database, nella fattispecie rispettivamente:
username:root; hostname:localhost; password:'' e db_name:smartbot;
E un'altra che è una query che serve ad interrogare il database. Osserviamo anche  la presenza di un nuovo attributo chiamato upload_content. Questo attrributo ha la funzione di richiamare il testo anzichè dallo spazio  tra i tag <save_variable>, dal file nominato insert_record e usarlo come interfaccia di partenza per la sostituzione delle variabili che verranno caricate dall'attributo load che nel caso in questione sono value_titolo, testo_titolo.
In altre parole andando ad esaminare il contenuto della variabile insert_record:

INSERT INTO `titoli` (`id`, `titolo`, `timestamp`, `quotation`) VALUES (NULL, '$testo_titolo', UNIX_TIMESTAMP(), '$value_titolo');
osserviamo che si tratta essenzialmente di una query sql, dove dentro sono inserite due variabili $testo_titolo e $value_titolo che verranno appunto sostituite con il valore reale dopo averle caricate come detto in precedenza con l'attributo load.

Quindi questa query verrà salvata in una variabile nominata insert_titolo_quotation.

Il tag <print> serve a stampare sulla console il contenuto nidificato tra i tag, nel caso specifico è proprio la variabile $insert_titolo_quotation richiamata dall'attributo load.

A questo entrerà il gioco il tag orm che ci permetterà la connessione ai vari database, nel caso specifico a mysql che viene prima interrogato per creare una connessione attraverso l'attributo create_engine, in questo caso fornendo la variabile precendetemente salvata $engine_mysql_db_smartbot, e poi tramite l'attributo query, tramite la query precedentemente salvata con il nome insert_titolo_quotation.

Quindi avremo il caricamento dei dati estratti dal web su un database di tipo mysql. Se vogliamo però capire il genere di valore e avere una risposta in funzione del valore di diff_titolo, quello che dobbiamo fare è l'utilizzo del tag <if> che accetta di obbligo 3 parametri arg1,arg2,op tale che se la condizione arg1 op arg2 è vera verrà eseguito il programma all'interno dei tag, altrimenti il programma inserito nell'attributo else. Nella fattispecie l'operazione sarebbe 
$diff_titolo gt ('grater then' o meglio '>=') 0, ossia se $diff_titolo è maggiore di 0 verrà eseguito il programma trend_positivo, 
altrimenti trend_negativo.

Se andiamo nei dettagli il programma trend_negativo di sotto:

<trend_negativo>
<print load="value_titolo,testo_titolo">Valore Titolo $testo_titolo: $value_titolo</print>
<print load="testo_titolo,diff_titolo">il diff quotidiano del Titolo $testo_titolo è negativo:$diff_titolo</print>
</trend_negativo>
stamperà nella console i valori specificando che si tratta di valore negativo e analogamente trend_positivo specificherà che il differenziale è positivo.

Il Tutorial di sopra mette in luce la semplicità sul come programmare a vari livelli PySmartBot per fare estrazione dati dal web e poterli archiviare all'interno di un database.

Qui di seguito a video viene mostrata l'esecuzione del programma di sopra.
Link Progetto: PySmartBot