Scrapy è un framework open source sviluppato in Python che permette di realizzare web spider o crawler per estrarre informazioni dai siti web in maniera semplice e veloce.
In questa guida ti mostreremo come creare ed eseguire sul tuo server un web spider con Scrapy per estrapolare informazioni dalle pagine web attraverso l’utilizzo di diverse tecniche.
Per prima cosa dovrai connetterti al tuo server tramite una connessione SSH. Se non l’hai ancora fatto, ti consigliamo di seguire la nostra guida per connetterti in sicurezza con il protocollo SSH. In caso di server locale puoi passare al punto successivo e aprire il terminale del tuo server.
Creare l'ambiente virtuale
Prima di avviare l’installazione vera e propria procedi effettuando un aggiornamento dei pacchetti di sistema:
Continua installando alcune dipendenze necessarie al funzionamento:
$ sudo apt-get install python-dev python-pip libxml2-dev zlib1g-dev libxslt1-dev libffi-dev libssl-dev
Una volta completata l'installazione, puoi iniziare a configurare virtualenv, un pacchetto Python che ti permette di installare pacchetti Python in maniera isolata, senza compromettere altri software presenti. Questo passaggio è opzionale, ma viene fortemente consigliato dagli sviluppatori di Scrapy:
$ sudo pip install virtualenv
Prepara quindi una directory dove installare l’ambiente di Scrapy:
$ sudo mkdir /var/scrapy
$ cd /var/scrapy
E inizializza un ambiente virtuale:
$ sudo virtualenv /var/scrapy
New python executable in /var/scrapy/bin/python
Installing setuptools, pip, wheel...
done.
Per poter attivare l’ambiente virtuale ti basta lanciare il seguente comando:
$ sudo source /var/scrapy/bin/activate
Puoi uscire in qualunque momento attraverso il comando “deactivate”.
Installare Scrapy
Procedi ora a installare Scrapy e crea un nuovo progetto:
$ sudo pip install Scrapy
$ sudo scrapy startproject example
$ cd example
All’interno della directory di progetto “example” appena creata avrai la seguente struttura di file:
example/
scrapy.cfg # file di configurazione per il deploy
example/ # module del progetto Python
__init__.py
items.py
middlewares.py
pipelines.py
settings.py # Impostazioni del progetto
spiders/
__init__.py
Utilizzare la shell a scopo di testing
Scrapy ti permette di scaricare il contenuto HTML di pagine web ed estrapolare informazioni dalle stesse attraverso l’utilizzo di diverse tecniche, come ad esempio selettori css. Per facilitare questo processo, Scrapy mette a disposizione una “shell“ in modo da testare in tempo reale l’estrapolazione delle informazioni.
In questo tutorial, vedrai come catturare il primo post presente nella pagina principale del famoso social Reddit:

Prima di procedere alla stesura del sorgente, prova ad estrarre il titolo attraverso la shell:
$ sudo scrapy shell "reddit.com"
Entro qualche secondo, Scrapy avrà scaricato la pagina principale e potrai inserire comandi utilizzando l’oggetto “response”. In questo esempio, per ottenere il titolo del primo post puoi utilizzare il selettore “article h3::text”:
>>> response.css('article h3::text')[0].get()
Se il selettore funziona correttamente, visualizzerai il titolo. Esci quindi dalla shell:
Per creare un nuovo spider, crea un nuovo file Python nella directory di progetto example/spiders/reddit.py:
import scrapy
class RedditSpider(scrapy.Spider):
name = "reddit"
def start_requests(self):
yield scrapy.Request(url="https://www.reddit.com/", callback=self.parseHome)
def parseHome(self, response):
headline = response.css('article h3::text')[0].get()
with open( 'popular.list', 'ab' ) as popular_file:
popular_file.write( headline + "\n" )
Tutti gli spider devono ereditare la classe Spider del modulo Scrapy, e avviare le richieste utilizzando il metodo start_requests:
yield scrapy.Request(url="https://www.reddit.com/", callback=self.parseHome)
Quando Scrapy avrà completato il caricamento della pagina, chiamerà la funzione callback (self.parseHome).
Avendo l’oggetto response, puoi prendere il contenuto che ti interessa:
headline = response.css('article h3::text')[0].get()
E, a scopo dimostrativo, salvarlo in un file “popular.list”.
Puoi avviare lo spider appena creato utilizzando il comando:
$ sudo scrapy crawl reddit
Una volta completato, troverai l’ultimo titolo estratto nel file popular.list:
Schedulare Scrapyd
Per schedulare l’esecuzione dei tuoi spider puoi utilizzare il servizio offerto da Scrapy “Scrapy Cloud” (vedi https://scrapinghub.com/scrapy-cloud) oppure installare il demone open source direttamente sul tuo server.
Assicurati di trovarti nell’ambiente virtuale precedentemente creato e installa il pacchetto scrapyd attraverso pip:
$ cd /var/scrapy/
$ sudo source /var/scrapy/bin/activate
$ sudo pip install scrapyd
Completata l’installazione puoi preparare un servizio creando il file /etc/systemd/system/scrapyd.service con il seguente contenuto:
[Unit]
Description=Scrapy Daemon
[Service]
ExecStart=/var/scrapy/bin/scrapyd
Salva il file appena creato e avvia il servizio tramite:
$ sudo systemctl start scrapyd
Adesso il demone è configurato e pronto per accettare nuovi spider.
Per effettuare il deploy del tuo spider di esempio, devi utilizzare un tool fornito da Scrapy chiamato scrapyd-client. Procedi alla sua installazione tramite pip:
$ sudo pip install scrapyd-client
Continua modificando il file scrapy.cfg e impostando i dati di deploy:
[settings]
default = example.settings
[deploy]
url = http://localhost:6800/
project = example
Ora puoi effettuare il deploy semplicemente eseguendo il comando:
Per schedulare l’esecuzione dello spider ti basta richiamare le API di scrapyd :
$ sudo curl http://localhost:6800/schedule.json -d project=example -d spider=reddit