Per impostazione predefinita, ogni elemento passa attraverso ogni pipeline.
Ad esempio, se produci uno ProfileItem
e uno CommentItem
, entrambi passeranno attraverso tutte le condotte. Se si dispone di una configurazione di pipeline per i tipi di tracce voce, quindi il metodo di process_item
potrebbe assomigliare:
def process_item(self, item, spider):
self.stats.inc_value('typecount/%s' % type(item).__name__)
return item
Quando un ProfileItem
passa attraverso, 'typecount/ProfileItem'
viene incrementato. Quando un CommentItem
passa, 'typecount/CommentItem'
viene incrementato.
Si può avere un manico gasdotto un solo tipo di articolo di richiesta, però, se la manipolazione che tipo di elemento è unico, controllando il tipo di elemento prima di procedere:
def process_item(self, item, spider):
if not isinstance(item, ProfileItem):
return item
# Handle your Profile Item here.
Se tu avessi i due process_item
metodi di cui sopra setup in diverse pipeline, l'articolo passerà attraverso entrambi, essendo tracciati e in fase di elaborazione (o ignorati sul secondo).
Inoltre si potrebbe avere una configurazione gasdotto per gestire tutti gli elementi 'connesse':
def process_item(self, item, spider):
if isinstance(item, ProfileItem):
return self.handleProfile(item, spider)
if isinstance(item, CommentItem):
return self.handleComment(item, spider)
def handleComment(item, spider):
# Handle Comment here, return item
def handleProfile(item, spider):
# Handle profile here, return item
Oppure, si potrebbe rendere ancora più complessa e sviluppare un sistema di tipo delegazione che carica le classi e chiama i metodi gestore predefinito, simile a come Scrapy gestisce middleware/pipeline. Dipende da te quanto sia complesso il tuo bisogno e cosa vuoi fare.