Cesco
Cesco

Il mio blog personale

Francesco
Author

Share


Tags


I primi rudimenti di Scrapy

FrancescoFrancesco

Oggi ho imparato i primi rudimenti di Scrapy, una libreria per Python che permette di creare web spiders da utilizzare per raccogliere dati e informazioni dai siti internet automaticamente.

Scrapy raccoglie i dati di una pagina, dopodichè per estrarre i dati che ci interessano dal file HTML scaricato, dobbiamo utilizzare una sintassi chiamata xpath.

Ecco ad esempio come estrarre gli ultimi numeri del superenalotto da superenalotto.com

Innanzitutto comincio lanciando la shell di Scrapy da terminale, così:

$ scrapy shell -s USER_AGENT="Mozilla/5.0" http://www.superenalotto.com/

Quindi una volta che la shell si è caricata e Scrapy ha avuto modo di scaricare la pagina index.html dal sito www.superenalotto.com, posso iniziare ad analizzare quello che ha scaricato.

Posso aiutarmi con Chrome a scoprire la struttura del sito e farmi dire automaticamente il percorso XPath a uno o più elemento, visualizzando il pannello degli strumenti per gli sviluppatori, scegliendo il nodo interessato e con il pulsante destro seleziono la voce Copy -> Copy XPath.

Il sito memorizza la data dell'estrazione ed il numero del concorso in due span che contengono le classi redBoxLeft e redBoxRight, mentre i numeri estratti sono all'interno di una div che contiene la classe results, dentro dei span annidati che contengono la classe ball.

Data dell'estrazione:

Prendo il primo elemento che trovo che contiene come classe 'redBoxLeft'

response.xpath("//*[contains(@class, 'redBoxLeft')]/text()")[0].extract()  

Questo restituisce la stringa:

>>> 'sabato 16 luglio 2016'

Numero del concorso:

Prendo il primo elemento che trovo che contiene come classe 'redBoxRight'

response.xpath("//*[contains(@class, 'redBoxRight')]/text()")[0].extract()  

Questo restituisce la stringa:

>>> 'concorso n. 85'

Oppure, se preferisco ottenere solo il numero del concorso posso fare affidamento ad un'espressione regolare, che posso concatenare all'output di scrapy:

response.xpath("//*[contains(@class, 'redBoxRight')]/text()")[0].re("[0-9]+")  

Questo restituisce la stringa contenente il numero del concorso:

>>> '85'

Numeri estratti:

All'interno del primo elemento che contiene la classe 'results' Prendo ogni elemento che trovo che contenga una classe fra 'ball', 'jolly', 'superstar', ma che non contenga la classe 'ballName'.

response.xpath("//*[@class='results']//*[(contains(@class, 'ball') or contains(@class, 'jolly') or contains(@class, 'superstar')) and not(contains(@class, 'ballName'))]/text()").extract()  

questo restituisce un'array con dei numeri che rappresentano i sei estratti più il jolly ed il numero superstar:

>>> ['26', '37', '43', '67', '75', '78', '10', '67']

Risultato complessivo:

>>> 'sabato 16 luglio 2016'
>>> 'concorso n. 85'
>>> ['26', '37', '43', '67', '75', '78', '10', '67']
Francesco
Author

Francesco

Comments