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,
}