Scrapy - Item Pipeline

Descrizione

Item Pipelineè un metodo in cui vengono elaborati gli articoli scartati. Quando un articolo viene inviato alla pipeline degli articoli, viene raschiato da uno spider ed elaborato utilizzando diversi componenti, che vengono eseguiti in sequenza.

Ogni volta che viene ricevuto un articolo, decide una delle seguenti azioni:

  • Continua a elaborare l'oggetto.
  • Rilascialo dalla pipeline.
  • Interrompi l'elaborazione dell'articolo.

Le pipeline degli articoli vengono generalmente utilizzate per i seguenti scopi:

  • Archiviazione degli elementi raschiati nel database.
  • Se l'elemento ricevuto viene ripetuto, verrà rilasciato l'elemento ripetuto.
  • Controllerà se l'elemento è con campi mirati.
  • Cancellazione dei dati HTML.

Sintassi

È possibile scrivere la pipeline degli articoli utilizzando il metodo seguente:

process_item(self, item, spider)

Il metodo sopra contiene i seguenti parametri:

  • Articolo (oggetto oggetto o dizionario): specifica l'elemento raschiato.
  • ragno (oggetto ragno) - Il ragno che ha raschiato l'oggetto.

È possibile utilizzare metodi aggiuntivi indicati nella tabella seguente:

Suor n Metodo e descrizione Parametri
1

open_spider(self, spider)

Viene selezionato all'apertura del ragno.

ragno (oggetto ragno) - Si riferisce al ragno che è stato aperto.

2

close_spider(self, spider)

Viene selezionato quando il ragno è chiuso.

ragno (oggetto ragno) - Si riferisce al ragno che era chiuso.

3

from_crawler(cls, crawler)

Con l'aiuto del crawler, la pipeline può accedere ai componenti principali come segnali e impostazioni di Scrapy.

crawler (oggetto Crawler): si riferisce al crawler che utilizza questa pipeline.

Esempio

Di seguito sono riportati gli esempi di pipeline di elementi utilizzati in diversi concetti.

Eliminazione di elementi senza tag

Nel codice seguente, la pipeline bilancia l' attributo (prezzo) per quegli articoli che non includono l'IVA (attributo excles_vat) e ignora gli articoli che non hanno un cartellino del prezzo -

from Scrapy.exceptions import DropItem  
class PricePipeline(object): 
   vat = 2.25 

   def process_item(self, item, spider): 
      if item['price']: 
         if item['excludes_vat']: 
            item['price'] = item['price'] * self.vat 
            return item 
         else: 
            raise DropItem("Missing price in %s" % item)

Scrittura di elementi in un file JSON

Il codice seguente memorizzerà tutti gli elementi raschiati da tutti i ragni in un unico file items.jlfile, che contiene un elemento per riga in un formato serializzato in formato JSON. IlJsonWriterPipeline class viene utilizzata nel codice per mostrare come scrivere la pipeline di elementi -

import json  

class JsonWriterPipeline(object): 
   def __init__(self): 
      self.file = open('items.jl', 'wb') 

   def process_item(self, item, spider): 
      line = json.dumps(dict(item)) + "\n" 
      self.file.write(line) 
      return item

Scrittura di elementi in MongoDB

È possibile specificare l'indirizzo MongoDB e il nome del database nelle impostazioni di Scrapy e la raccolta MongoDB può essere denominata in base alla classe dell'elemento. Il codice seguente descrive come usarefrom_crawler() metodo per raccogliere correttamente le risorse -

import pymongo  

class MongoPipeline(object):  
   collection_name = 'Scrapy_list' 

   def __init__(self, mongo_uri, mongo_db): 
      self.mongo_uri = mongo_uri 
      self.mongo_db = mongo_db 

   @classmethod 
   def from_crawler(cls, crawler): 
      return cls( 
         mongo_uri = crawler.settings.get('MONGO_URI'), 
         mongo_db = crawler.settings.get('MONGO_DB', 'lists') 
      ) 
  
   def open_spider(self, spider): 
      self.client = pymongo.MongoClient(self.mongo_uri) 
      self.db = self.client[self.mongo_db] 

   def close_spider(self, spider): 
      self.client.close() 

   def process_item(self, item, spider): 
      self.db[self.collection_name].insert(dict(item)) 
      return item

Filtri di duplicazione

Un filtro controllerà gli elementi ripetuti e rimuoverà gli elementi già elaborati. Nel codice seguente, abbiamo utilizzato un ID univoco per i nostri articoli, ma spider restituisce molti articoli con lo stesso ID -

from scrapy.exceptions import DropItem  

class DuplicatesPipeline(object):  
   def __init__(self): 
      self.ids_seen = set() 

   def process_item(self, item, spider): 
      if item['id'] in self.ids_seen: 
         raise DropItem("Repeated items found: %s" % item) 
      else: 
         self.ids_seen.add(item['id']) 
         return item

Attivazione di una pipeline di articoli

È possibile attivare un componente Item Pipeline aggiungendo la sua classe all'impostazione ITEM_PIPELINES come mostrato nel codice seguente. È possibile assegnare valori interi alle classi nell'ordine in cui vengono eseguite (l'ordine può essere di valore inferiore a classi di valore superiore) e i valori saranno compresi nell'intervallo 0-1000.

ITEM_PIPELINES = {
   'myproject.pipelines.PricePipeline': 100,
   'myproject.pipelines.JsonWriterPipeline': 600,
}