[opendatasicilia] Un piccolo esempio di scraping a riga di comando

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

[opendatasicilia] Un piccolo esempio di scraping a riga di comando

Andrea Borruso
Administrator

Ciao,
nell’incontro di Palermo sull’utilizzo della riga di comando per “manipolare” i dati ho fatto dei piccoli esempi a scopo didattico.

Ne aggiungo che è un pezzo di un post che ho scritto, in cui mostravo come estrarre date e dati da una pagina del “Piano Triennale per l’informatica nella Pubblica Amministrazione”.

La pagina è quelle delle azioni. Il primo obiettivo è stato per me quello di trasformare una pagina HTML in un file strutturato (ho scelto un CSV, ma poteva essere mille altre cose.

A riga di comando si può fare così (faccio uso di curl, scrape, xmlstarlet e csvkit):

# scarico la pagina con curl
curl -sL "https://pianotriennale-ict.italia.it/azioni/"  | \
# passo il codice della pagina a scrape e gli dico di estrarre tutto ciò che è contenuto dentro l'elemento con id=panel-0
scrape -be "//*[@id=\"panel-0\"]" | \
# passo l'output di scrape a xmlstarlet con cui estraggo Tempi, Attori, Descrizione e Risultati, via XPATH.
# L'output di xmlstarlet è un CSV separato da "|"
xmlstarlet sel --html -t -m "//*/div/div[2]/span" -v "." -o "|" -v "normalize-space(../../../../h3)" -o "|" \
-v "normalize-space(../../div[4])" -o "|" -v "normalize-space(../../div[6]/div)" -o "|" -v "normalize-space(../../div[8])" -o "|centrali" -n | \
# passo l'output a csvformat per creare un file CSV e gli dico che come separatore ho usato il carattere "|"
csvformat -d "|" > fileoutput.csv

# aggiungo la riga di intestazione al CSV

sed -i '1s/^/Tempi,Azione,Attori,Descrizione,Risultati,Amministrazioni\n/' fileoutput.csv

L’output è questo.

Nel post su medium ho usato una sintassi bash un po’ più complessa. Qui ho condiviso la parte più importante.

Saluti,

a

--
___________________

Andrea Borruso
website: https://medium.com/tantotanto
38° 7' 48" N, 13° 21' 9" E, EPSG:4326
___________________

"cercare e saper riconoscere chi e cosa,
 in mezzo all’inferno, non è inferno, 
e farlo durare, e dargli spazio"

Italo Calvino

--
Sito: http://opendatasicilia.it
Facebook: https://www.facebook.com/groups/opendatasicilia/
twitter: http://twitter.com/opendatasicilia
Slack: http://opendatasicilia.it/slack/
Newsletter http://opendatasicilia.it/newsletter/
---
Hai ricevuto questo messaggio perché sei iscritto al gruppo "opendatasicilia" di Google Gruppi.
Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a [hidden email].
Per postare in questo gruppo, invia un'email a [hidden email].
Visita questo gruppo all'indirizzo https://groups.google.com/group/opendatasicilia.
Per visualizzare questa discussione sul Web, visita https://groups.google.com/d/msgid/opendatasicilia/CAHEdGZMVMEWZLDGQMuJDpj37KCw2A3cD7reOk3fBuyh-NMQckQ%40mail.gmail.com.
Per altre opzioni visita https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: [opendatasicilia] Un piccolo esempio di scraping a riga di comando

Ciro Spataro
Grazie Andrea.
Per i comuni ignoranti e poco smanettoni come me..... È possibile disporre (come output del tuo lavoro prezioso) di un feed RSS in maniera da agganciarci un canale telegram che aggiorna automaticamente sulle azioni del piano triennale ict della PA ?
Grazie 

Il 12 ago 2017 8:25 PM, "andy" <[hidden email]> ha scritto:

Ciao,
nell’incontro di Palermo sull’utilizzo della riga di comando per “manipolare” i dati ho fatto dei piccoli esempi a scopo didattico.

Ne aggiungo che è un pezzo di un post che ho scritto, in cui mostravo come estrarre date e dati da una pagina del “Piano Triennale per l’informatica nella Pubblica Amministrazione”.

La pagina è quelle delle azioni. Il primo obiettivo è stato per me quello di trasformare una pagina HTML in un file strutturato (ho scelto un CSV, ma poteva essere mille altre cose.

A riga di comando si può fare così (faccio uso di curl, scrape, xmlstarlet e csvkit):

# scarico la pagina con curl
curl -sL "https://pianotriennale-ict.italia.it/azioni/"  | \
# passo il codice della pagina a scrape e gli dico di estrarre tutto ciò che è contenuto dentro l'elemento con id=panel-0
scrape -be "//*[@id=\"panel-0\"]" | \
# passo l'output di scrape a xmlstarlet con cui estraggo Tempi, Attori, Descrizione e Risultati, via XPATH.
# L'output di xmlstarlet è un CSV separato da "|"
xmlstarlet sel --html -t -m "//*/div/div[2]/span" -v "." -o "|" -v "normalize-space(../../../../h3)" -o "|" \
-v "normalize-space(../../div[4])" -o "|" -v "normalize-space(../../div[6]/div)" -o "|" -v "normalize-space(../../div[8])" -o "|centrali" -n | \
# passo l'output a csvformat per creare un file CSV e gli dico che come separatore ho usato il carattere "|"
csvformat -d "|" > fileoutput.csv

# aggiungo la riga di intestazione al CSV

sed -i '1s/^/Tempi,Azione,Attori,Descrizione,Risultati,Amministrazioni\n/' fileoutput.csv

L’output è questo.

Nel post su medium ho usato una sintassi bash un po’ più complessa. Qui ho condiviso la parte più importante.

Saluti,

a

--
___________________

Andrea Borruso
website: https://medium.com/tantotanto
38° 7' 48" N, 13° 21' 9" E, EPSG:4326
___________________

"cercare e saper riconoscere chi e cosa,
 in mezzo all’inferno, non è inferno, 
e farlo durare, e dargli spazio"

Italo Calvino

--
Sito: http://opendatasicilia.it
Facebook: https://www.facebook.com/groups/opendatasicilia/
twitter: http://twitter.com/opendatasicilia
Slack: http://opendatasicilia.it/slack/
Newsletter http://opendatasicilia.it/newsletter/
---
Hai ricevuto questo messaggio perché sei iscritto al gruppo "opendatasicilia" di Google Gruppi.
Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a [hidden email].
Per postare in questo gruppo, invia un'email a [hidden email].
Visita questo gruppo all'indirizzo https://groups.google.com/group/opendatasicilia.
Per visualizzare questa discussione sul Web, visita https://groups.google.com/d/msgid/opendatasicilia/CAHEdGZMVMEWZLDGQMuJDpj37KCw2A3cD7reOk3fBuyh-NMQckQ%40mail.gmail.com.
Per altre opzioni visita https://groups.google.com/d/optout.

--
Sito: http://opendatasicilia.it
Facebook: https://www.facebook.com/groups/opendatasicilia/
twitter: http://twitter.com/opendatasicilia
Slack: http://opendatasicilia.it/slack/
Newsletter http://opendatasicilia.it/newsletter/
---
Hai ricevuto questo messaggio perché sei iscritto al gruppo "opendatasicilia" di Google Gruppi.
Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a [hidden email].
Per postare in questo gruppo, invia un'email a [hidden email].
Visita questo gruppo all'indirizzo https://groups.google.com/group/opendatasicilia.
Per visualizzare questa discussione sul Web, visita https://groups.google.com/d/msgid/opendatasicilia/CAJyZuP%2BbJuyreTjh1LXKQd%2BVbH0zhK5exg_FA%3D6TFMcMpxmXSQ%40mail.gmail.com.
Per altre opzioni visita https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: [opendatasicilia] Un piccolo esempio di scraping a riga di comando

Andrea Borruso
Administrator
Ciao Ciro,

2017-08-12 22:35 GMT+02:00 ciro spataro <[hidden email]>:
Grazie Andrea.
Per i comuni ignoranti e poco smanettoni come me..... È possibile disporre (come output del tuo lavoro prezioso) di un feed RSS in maniera da agganciarci un canale telegram che aggiorna automaticamente sulle azioni del piano triennale ict della PA ?
Grazie

non appena il post ha iniziato a girare Gianluca Varisco del team digitale ha fatto intendere che creerà il feed, e immagino verrà fatto nelle prossime settimane.

Inline images 1

In ogni caso, io lo creerò per uso personale. E poi lo girerò anche qui.

Saluti


--
___________________

Andrea Borruso
website: https://medium.com/tantotanto
38° 7' 48" N, 13° 21' 9" E, EPSG:4326
___________________

"cercare e saper riconoscere chi e cosa,
 in mezzo all’inferno, non è inferno, 
e farlo durare, e dargli spazio"

Italo Calvino

--
Sito: http://opendatasicilia.it
Facebook: https://www.facebook.com/groups/opendatasicilia/
twitter: http://twitter.com/opendatasicilia
Slack: http://opendatasicilia.it/slack/
Newsletter http://opendatasicilia.it/newsletter/
---
Hai ricevuto questo messaggio perché sei iscritto al gruppo "opendatasicilia" di Google Gruppi.
Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a [hidden email].
Per postare in questo gruppo, invia un'email a [hidden email].
Visita questo gruppo all'indirizzo https://groups.google.com/group/opendatasicilia.
Per visualizzare questa discussione sul Web, visita https://groups.google.com/d/msgid/opendatasicilia/CAHEdGZParEZDQhA6sQO4ffohhV%2B8ZYf6HD7ABfcd8c77NoUptQ%40mail.gmail.com.
Per altre opzioni visita https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: [opendatasicilia] Un piccolo esempio di scraping a riga di comando

Ciro Spataro
Grazie 
Non avevo seguito quel thread 



Il 13 ago 2017 10:30 AM, "andy" <[hidden email]> ha scritto:
Ciao Ciro,

2017-08-12 22:35 GMT+02:00 ciro spataro <[hidden email]>:
Grazie Andrea.
Per i comuni ignoranti e poco smanettoni come me..... È possibile disporre (come output del tuo lavoro prezioso) di un feed RSS in maniera da agganciarci un canale telegram che aggiorna automaticamente sulle azioni del piano triennale ict della PA ?
Grazie

non appena il post ha iniziato a girare Gianluca Varisco del team digitale ha fatto intendere che creerà il feed, e immagino verrà fatto nelle prossime settimane.

Inline images 1

In ogni caso, io lo creerò per uso personale. E poi lo girerò anche qui.

Saluti


--
___________________

Andrea Borruso
website: https://medium.com/tantotanto
38° 7' 48" N, 13° 21' 9" E, EPSG:4326
___________________

"cercare e saper riconoscere chi e cosa,
 in mezzo all’inferno, non è inferno, 
e farlo durare, e dargli spazio"

Italo Calvino

--
Sito: http://opendatasicilia.it
Facebook: https://www.facebook.com/groups/opendatasicilia/
twitter: http://twitter.com/opendatasicilia
Slack: http://opendatasicilia.it/slack/
Newsletter http://opendatasicilia.it/newsletter/
---
Hai ricevuto questo messaggio perché sei iscritto al gruppo "opendatasicilia" di Google Gruppi.
Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a [hidden email].
Per postare in questo gruppo, invia un'email a [hidden email].
Visita questo gruppo all'indirizzo https://groups.google.com/group/opendatasicilia.
Per visualizzare questa discussione sul Web, visita https://groups.google.com/d/msgid/opendatasicilia/CAHEdGZParEZDQhA6sQO4ffohhV%2B8ZYf6HD7ABfcd8c77NoUptQ%40mail.gmail.com.
Per altre opzioni visita https://groups.google.com/d/optout.

--
Sito: http://opendatasicilia.it
Facebook: https://www.facebook.com/groups/opendatasicilia/
twitter: http://twitter.com/opendatasicilia
Slack: http://opendatasicilia.it/slack/
Newsletter http://opendatasicilia.it/newsletter/
---
Hai ricevuto questo messaggio perché sei iscritto al gruppo "opendatasicilia" di Google Gruppi.
Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a [hidden email].
Per postare in questo gruppo, invia un'email a [hidden email].
Visita questo gruppo all'indirizzo https://groups.google.com/group/opendatasicilia.
Per visualizzare questa discussione sul Web, visita https://groups.google.com/d/msgid/opendatasicilia/CAJyZuPJmQZNKi6KYFeaoZuCg2hzmX5TbZPaQuWdgsh59t3Q5tg%40mail.gmail.com.
Per altre opzioni visita https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

[opendatasicilia] Re: Un piccolo esempio di scraping a riga di comando

Giovan Battista Vitrano
In reply to this post by Andrea Borruso
devo smettere di fare mappe!
Devo dedicarmi alla riga di comando, recuperare dati in questo modo mi fa impazzire :-) :-)

Il giorno sabato 12 agosto 2017 20:25:50 UTC+2, Andrea Borruso ha scritto:

Ciao,
nell’incontro di Palermo sull’utilizzo della riga di comando per “manipolare” i dati ho fatto dei piccoli esempi a scopo didattico.

Ne aggiungo che è un pezzo di un <a href="https://medium.com/@aborruso/a-caccia-di-date-nel-piano-triennale-per-linformatica-nella-pubblica-amministrazione-2b355ce5cbd0" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fmedium.com%2F%40aborruso%2Fa-caccia-di-date-nel-piano-triennale-per-linformatica-nella-pubblica-amministrazione-2b355ce5cbd0\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFsN1kPDWvm_kEaFNpbYryiqb-r1g&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fmedium.com%2F%40aborruso%2Fa-caccia-di-date-nel-piano-triennale-per-linformatica-nella-pubblica-amministrazione-2b355ce5cbd0\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFsN1kPDWvm_kEaFNpbYryiqb-r1g&#39;;return true;">post che ho scritto, in cui mostravo come estrarre date e dati da una pagina del “Piano Triennale per l’informatica nella Pubblica Amministrazione”.

La pagina è quelle delle <a href="https://pianotriennale-ict.italia.it/azioni/" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fpianotriennale-ict.italia.it%2Fazioni%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGn_7x-qPyC4q_oINS917HRViGKsQ&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fpianotriennale-ict.italia.it%2Fazioni%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGn_7x-qPyC4q_oINS917HRViGKsQ&#39;;return true;">azioni. Il primo obiettivo è stato per me quello di trasformare una pagina HTML in un file strutturato (ho scelto un CSV, ma poteva essere mille altre cose.

A riga di comando si può fare così (faccio uso di curl, <a href="https://github.com/pigreco/OpenData-da-riga-di-comando/issues/10" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fpigreco%2FOpenData-da-riga-di-comando%2Fissues%2F10\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNH7NVs6EqNXGXotnUI6shukm1g4uQ&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fpigreco%2FOpenData-da-riga-di-comando%2Fissues%2F10\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNH7NVs6EqNXGXotnUI6shukm1g4uQ&#39;;return true;">scrape, <a href="https://github.com/pigreco/OpenData-da-riga-di-comando/issues/4" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fpigreco%2FOpenData-da-riga-di-comando%2Fissues%2F4\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNF1mHg1tMKD0LIG8YNQqHY9NrWO7Q&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fpigreco%2FOpenData-da-riga-di-comando%2Fissues%2F4\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNF1mHg1tMKD0LIG8YNQqHY9NrWO7Q&#39;;return true;">xmlstarlet e <a href="https://github.com/pigreco/OpenData-da-riga-di-comando/issues/1" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fpigreco%2FOpenData-da-riga-di-comando%2Fissues%2F1\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEBd6wZWZwTC9Iu-soqeviox_8z8w&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgithub.com%2Fpigreco%2FOpenData-da-riga-di-comando%2Fissues%2F1\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNEBd6wZWZwTC9Iu-soqeviox_8z8w&#39;;return true;">csvkit):

# scarico la pagina con curl
curl -sL "<a href="https://pianotriennale-ict.italia.it/azioni/" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fpianotriennale-ict.italia.it%2Fazioni%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGn_7x-qPyC4q_oINS917HRViGKsQ&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fpianotriennale-ict.italia.it%2Fazioni%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGn_7x-qPyC4q_oINS917HRViGKsQ&#39;;return true;">https://pianotriennale-ict.italia.it/azioni/"  | \
# passo il codice della pagina a scrape e gli dico di estrarre tutto ciò che è contenuto dentro l'elemento con id=panel-0
scrape -be "//*[@id=\"panel-0\"]" | \
# passo l'output di scrape a xmlstarlet con cui estraggo Tempi, Attori, Descrizione e Risultati, via XPATH.
# L'output di xmlstarlet è un CSV separato da "|"
xmlstarlet sel --html -t -m "//*/div/div[2]/span" -v "." -o "|" -v "normalize-space(../../../../h3)" -o "|" \
-v "normalize-space(../../div[4])" -o "|" -v "normalize-space(../../div[6]/div)" -o "|" -v "normalize-space(../../div[8])" -o "|centrali" -n | \
# passo l'output a csvformat per creare un file CSV e gli dico che come separatore ho usato il carattere "|"
csvformat -d "|" > fileoutput.csv

# aggiungo la riga di intestazione al CSV

sed -i '1s/^/Tempi,Azione,Attori,Descrizione,Risultati,Amministrazioni\n/' fileoutput.csv

L’output è <a href="https://gist.github.com/aborruso/81a47ee874ebcd9371a20cd278fad99f" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgist.github.com%2Faborruso%2F81a47ee874ebcd9371a20cd278fad99f\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHnkSf0GkK73IW1PZQFscj96wfODA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fgist.github.com%2Faborruso%2F81a47ee874ebcd9371a20cd278fad99f\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHnkSf0GkK73IW1PZQFscj96wfODA&#39;;return true;">questo.

Nel post su medium ho usato una sintassi bash un po’ più complessa. Qui ho condiviso la parte più importante.

Saluti,

a

--
___________________

Andrea Borruso
website: <a href="https://medium.com/tantotanto" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fmedium.com%2Ftantotanto\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGZVxcQ3b_26Tt_tclvazQirNPHSA&#39;;return true;" onclick="this.href=&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fmedium.com%2Ftantotanto\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNGZVxcQ3b_26Tt_tclvazQirNPHSA&#39;;return true;">https://medium.com/tantotanto
38° 7' 48" N, 13° 21' 9" E, EPSG:4326
___________________

"cercare e saper riconoscere chi e cosa,
 in mezzo all’inferno, non è inferno, 
e farlo durare, e dargli spazio"

Italo Calvino

--
Sito: http://opendatasicilia.it
Facebook: https://www.facebook.com/groups/opendatasicilia/
twitter: http://twitter.com/opendatasicilia
Slack: http://opendatasicilia.it/slack/
Newsletter http://opendatasicilia.it/newsletter/
---
Hai ricevuto questo messaggio perché sei iscritto al gruppo "opendatasicilia" di Google Gruppi.
Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a [hidden email].
Per postare in questo gruppo, invia un'email a [hidden email].
Visita questo gruppo all'indirizzo https://groups.google.com/group/opendatasicilia.
Per visualizzare questa discussione sul Web, visita https://groups.google.com/d/msgid/opendatasicilia/6822bfbe-2779-49a8-97fb-71e365e2b283%40googlegroups.com.
Per altre opzioni visita https://groups.google.com/d/optout.