Tutorial > Creare Web Spiders con Scrapy

Creare Web Spiders con Scrapy

Pubblicato il: 04 ottobre 2019

Scrapy Sviluppo Ubuntu Web Spiders

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:

$ sudo  apt-get update

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:

image1.png

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:

>>> exit()

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:

$ cat 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:

$ sudo scrapyd-deploy

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