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 root@IP_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 nome_utente@IP_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 nome_utente@IP_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
elibxslt1-dev
sono necessari perlxml
. - I pacchetti
libssl-dev
elibffi-dev
sono richiesti percryptography
.
All'interno dell'ambiente virtuale, è possibile utilizzare il comandopip
anzichépip3
epython
invece dipython3
.
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 comandopip
anzichépip3
epython
invece dipython3
.
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.