Andiamo a vedere come realizzare il nostro primo progetto in Scrapy, supponiamo che abbiate già provveduto all’installazione, ma se così non fosse è sufficiente utilizzare il gestore di pacchetti python pip scrivendo nel nostro terminale:
pip install scrapy
Molto semplice, in pochi istanti il nostro sistema sarà pronto per accettare il nostro primo comando con il quale andremo a creare un progetto Scrapy, basta editare:
scrapy startproject tutorial
Questo andrà a creare una directory chiamata tutorial con il seguente contenuto:
tutorial/
scrapy.cfg # file per le configurazioni
tutorial/ # directory dove scriveremo il nostro codice
__init__.py
items.py # file per la definizione degli item
middlewares.py # file per la definizione dei middlewares
pipelines.py # file per la definizione dei pipeline
settings.py # file per la definizione delle impostazioni
spiders/ # directory dove metteremo gli spiders
__init__.py
Il nostro primo Spider
Gli ‘Spiders‘ sono classi che Scrapy utilizza per raccogliere informazioni da un sito Web (o da un gruppo di siti Web). Devono sotto-classare scrapy.Spider e definire le richieste iniziali da effettuare, possiamo anche indicare eventualmente come seguire i collegamenti nelle pagine e come analizzare il contenuto della pagina scaricata per estrarre i dati.
Questo è il codice per il nostro primo Spider. Salvalo in un file chiamato ‘quotes_spider.py‘ nella directory tutorial / spiders nel tuo progetto:
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split("/")[-2]
filename = 'quotes-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('Saved file %s' % filename)
Abbiamo creato una classe QuoteSpider che è una sottoclasse scrapy.Spider e definisce alcuni attributi e metodi:
- name: identifica il nostro Spider. Deve essere univoco all’interno di un progetto, ovvero non è possibile impostare lo stesso nome per Spider diversi.
- start_requests (): deve restituire un iterabile di Requests (puoi restituire un elenco di URLs o scrivere una funzione generatore) da cui Spider inizierà a lavorare. Le richieste successive verranno generate successivamente da queste richieste iniziali.
- parse (): un metodo che verrà chiamato per gestire la risposta scaricata per ciascuna delle richieste fatte. Il parametro response è un’istanza di TextResponse che contiene il contenuto della pagina e ha ulteriori metodi utili per gestirlo. Il metodo parse () di solito analizza la risposta, estraendo i dati scartati come dicts e anche trovando nuovi URL da seguire e creando nuove richieste da essi.
Lanciamo il nostro Spider
Per far funzionare il nostro ragno, saliamo nella directory del progetto ed eseguiamo:
scrapy crawl quotes
Questo comando esegue lo spider chiamato ‘quotes’ che abbiamo appena creato, ed invierà alcune richieste per il dominio quotes.toscrape.com come abbiamo indicato nella nostra funzione start_requests().
Ora controllando i file nella directory corrente. Possiamo notare che sono stati creati due nuovi file: quotes-1.html e quotes-2.html, con il contenuto dei i rispettivi URL, come indicato dal nostro metodo parse().
Scrapy ha pianificato gli oggetti scrapy.Request restituiti dal metodo start_requests del nostro Spider. Alla ricezione di una risposta per ciascuno, crea un’istanza di oggetti Response e chiama il metodo di callback associato alla richiesta (in questo caso, il metodo di parse) passando la risposta come argomento.
Nota: il tutorial appena presentato è stato tratto dal tutorial ufficiale del sito del projetto scrapy.org. Viene presentato tradotto in Italiano per pura divulgazione a scopo educativo.