Introduzione

Scrapy è un framework open source per web-crawling scritto in Python. Originariamente creato per web scraping può essere anche utilizzato per estrarre dati usando delle API oppure come un web-crawler general-purpose.

Scrapy funziona su Python 3.5 o versioni successive con CPython (implementazione predefinita di Python) e PyPy (a partire da PyPy 5.9).

In questa guida ti mostreremo come creare ed eseguire sul tuo server Ubuntu 20.04 LTS Focal Fossa un web spider con Scrapy per estrapolare informazioni dalle pagine web attraverso l’utilizzo di diverse tecniche.

Se desideri installare Scrapy su un server in remoto continua a leggere, altrimenti salta il primo paragrafo "Connessione al Server" e leggi il successivo.

Connessione al Server

Per accedere al server, è necessario conoscere l'indirizzo IP. Avrai anche bisogno dell'username e della password per l'autenticazione. Per connettersi al server come utente root digitare il seguente comando:

ssh [email protected]_DEL_SERVER

Successivamente sarà necessario inserire la password dell'utente root.

Se non utilizzate l'utente root potete connettervi con un'altro nome utente utilizzando lo stesso comando, quindi modificare root con il vostro nome_utente:

ssh [email protected]_DEL_SERVER

Successivamente vi verrà chiesto di inserire la password del vostro utente.

La porta standard per connettersi tramite ssh è la 22, se il vostro server utilizza una porta diversa, sarà necessario specificarla utilizzando il parametro -p, quindi digitare il seguente comando:

ssh [email protected]_DEL_SERVER -p PORTA

Utilizzare un ambiente virtuale (consigliato)

Consigliamo di installare Scrapy all'interno di un ambiente virtuale su tutte le piattaforme.

I pacchetti Python possono essere installati a livello globale (ovvero a livello di sistema) o nello spazio utente. Non è consigliabile installare il sistema Scrapy a livello.

Invece, ti consigliamo di installare Scrapy in un cosiddetto ambiente virtuale. Gli ambienti virtuali consentono di non entrare in conflitto con i pacchetti di sistema Python già installati (che potrebbero interrompere alcuni degli strumenti e degli script di sistema) e di installare comunque i pacchetti normalmente con pip (senza sudo e simili).

Per maggiori informazioni leggi: Ambienti e pacchetti virtuali.

Installare Scrapy su Ubuntu

Scrapy è attualmente testato con versioni abbastanza recenti di lxml, twisted e pyOpenSSL ed è compatibile con le recenti distribuzioni Ubuntu. Ma dovrebbe supportare anche le versioni precedenti di Ubuntu, come Ubuntu 14.04, sebbene con potenziali problemi con le connessioni TLS.

Non utilizzare il pacchetto python-scrapy fornito da Ubuntu, in genere sono troppo vecchi e lenti per essere aggiornati con Scrapy.

Per installare Scrapy su sistemi Ubuntu (o basati su Ubuntu), è necessario installare queste dipendenze:

sudo apt-get install python3 python3-dev python3-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
  • I pacchetti python3-dev, zlib1g-dev, libxml2-dev e libxslt1-dev sono necessari per lxml.
  • I pacchetti libssl-dev e libffi-dev sono richiesti per cryptography.
All'interno dell'ambiente virtuale, è possibile utilizzare il comando pip anziché pip3 e python invece di python3.
pip3 install scrapy

Installare Scrapy con conda

Se stai usando Anaconda o Miniconda, puoi installare il pacchetto dal canale conda-forge, che ha pacchetti aggiornati per Linux, Windows e macOS.

conda install -c conda-forge scrapy

In alternativa, se hai già familiarità con l'installazione dei pacchetti Python, puoi installare Scrapy e le sue dipendenze da PyPI con:

pip3 install Scrapy
All'interno dell'ambiente virtuale, è possibile utilizzare il comando pip anziché pip3 e python invece di python3.

Creare un nuovo progetto con Scrapy

Vediamo come utilizzare Scrapy, iniziamo creando un nuovo progetto con il seguente comando da terminale:

sudo scrapy startproject esempio

Entrare nella cartella appena creata con il comando cd:

cd esempio

La directory del progetto appena creato avrà la seguente struttura:

esempio/

    scrapy.cfg                # file di configurazione per il deploy

    esempio/                 # module del progetto Python

        __init__.py

        items.py              

        middlewares.py        

        pipelines.py          
    
        settings.py           # Impostazioni del progetto

        spiders/            

            __init__.py

Utilizzare Scrapy

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.

Vediamo un veloce esempio su come catturare l'ultimo articolo di reddit.com:

sudo scrapy shell "reddit.com"

Dovresti ricevere un output simile al seguente:

...
[s] Available Scrapy objects:
[s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s]   crawler    <scrapy.crawler.Crawler object at 0x7fd0494600a0>
[s]   item       {}
[s]   request    <GET http://reddit.com>
[s]   response   <200 https://www.reddit.com/>
[s]   settings   <scrapy.settings.Settings object at 0x7fd04945dd30>
[s]   spider     <DefaultSpider 'default' at 0x7fd048fc91f0>
[s] Useful shortcuts:
[s]   fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s]   fetch(req)                  Fetch a scrapy.Request and update local objects
[s]   shelp()           Shell help (print this help)
[s]   view(response)    View response in a browser
>>>

Per ottenere il titolo del primo post puoi utilizzare il selettore article h3::text:

response.css('article h3::text')[0].get()

Dovresti ottenere come output il titolo dell'ultimo articolo di reddit. Esci quindi dalla shell con il seguente comando:

exit()

Conclusione

In questo tutorial abbiamo visto come installare ed utilizzare il framework Scrapy per web-crawling su Ubuntu 20.04 LTS Focal Fossa.