Scrapy - Pipeline d'articles

La description

Item Pipelineest une méthode de traitement des articles mis au rebut. Lorsqu'un article est envoyé au pipeline d'articles, il est gratté par une araignée et traité à l'aide de plusieurs composants, qui sont exécutés séquentiellement.

Chaque fois qu'un objet est reçu, il décide de l'une des actions suivantes -

  • Continuez à traiter l'article.
  • Supprimez-le du pipeline.
  • Arrêtez de traiter l'élément.

Les pipelines d'articles sont généralement utilisés aux fins suivantes -

  • Stockage des éléments récupérés dans la base de données.
  • Si l'élément reçu est répété, il supprimera l'élément répété.
  • Il vérifiera si l'élément contient des champs ciblés.
  • Effacement des données HTML.

Syntaxe

Vous pouvez écrire le pipeline d'articles en utilisant la méthode suivante -

process_item(self, item, spider)

La méthode ci-dessus contient les paramètres suivants -

  • Item (objet d'élément ou dictionnaire) - Il spécifie l'élément gratté.
  • spider (objet araignée) - L'araignée qui a gratté l'objet.

Vous pouvez utiliser des méthodes supplémentaires données dans le tableau suivant -

Sr. Non Méthode et description Paramètres
1

open_spider(self, spider)

Il est sélectionné lorsque l'araignée est ouverte.

spider (objet araignée) - Il fait référence à l'araignée qui a été ouverte.

2

close_spider(self, spider)

Il est sélectionné lorsque l'araignée est fermée.

spider (objet araignée) - Il fait référence à l'araignée qui a été fermée.

3

from_crawler(cls, crawler)

Avec l'aide du robot d'exploration, le pipeline peut accéder aux composants de base tels que les signaux et les paramètres de Scrapy.

crawler (objet Crawler) - Il fait référence au robot qui utilise ce pipeline.

Exemple

Voici les exemples de pipeline d'éléments utilisés dans différents concepts.

Déposer des éléments sans étiquette

Dans le code suivant, le pipeline équilibre l' attribut (price) pour les articles qui n'incluent pas la TVA (attribut excludes_vat) et ignore les articles qui n'ont pas d'étiquette de prix -

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)

Ecrire des éléments dans un fichier JSON

Le code suivant stockera tous les éléments récupérés de toutes les araignées dans un seul items.jlfichier, qui contient un élément par ligne sous une forme sérialisée au format JSON. leJsonWriterPipeline La classe est utilisée dans le code pour montrer comment écrire un pipeline d'élément -

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

Ecrire des éléments dans MongoDB

Vous pouvez spécifier l'adresse MongoDB et le nom de la base de données dans les paramètres Scrapy et la collection MongoDB peut être nommée d'après la classe d'élément. Le code suivant décrit comment utiliserfrom_crawler() méthode pour collecter correctement les ressources -

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

Duplication de filtres

Un filtre vérifiera les éléments répétés et supprimera les éléments déjà traités. Dans le code suivant, nous avons utilisé un identifiant unique pour nos éléments, mais spider renvoie de nombreux éléments avec le même identifiant -

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

Activation d'un pipeline d'articles

Vous pouvez activer un composant Pipeline d'élément en ajoutant sa classe au paramètre ITEM_PIPELINES comme indiqué dans le code suivant. Vous pouvez affecter des valeurs entières aux classes dans l'ordre dans lequel elles s'exécutent (l'ordre peut être de valeur inférieure à des classes de valeur plus élevée) et les valeurs seront comprises entre 0 et 1000.

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