Scrapy-アイテムパイプライン
説明
Item Pipeline廃棄されたアイテムを処理する方法です。アイテムがアイテムパイプラインに送信されると、スパイダーによってスクレイピングされ、いくつかのコンポーネントを使用して処理されます。これらのコンポーネントは順番に実行されます。
アイテムを受け取るたびに、次のいずれかのアクションを決定します-
- アイテムの処理を続けます。
- パイプラインからドロップします。
- アイテムの処理を停止します。
アイテムパイプラインは通常、次の目的で使用されます-
- スクレイピングされたアイテムをデータベースに保存します。
- 受信したアイテムが繰り返されると、繰り返されたアイテムはドロップされます。
- アイテムがターゲットフィールドにあるかどうかをチェックします。
- HTMLデータをクリアします。
構文
次の方法を使用してアイテムパイプラインを記述できます-
process_item(self, item, spider)上記のメソッドには、次のパラメータが含まれています-
- アイテム(アイテムオブジェクトまたはディクショナリ)-スクレイピングされたアイテムを指定します。
- スパイダー(スパイダーオブジェクト)-アイテムをこすったスパイダー。
次の表に示す追加の方法を使用できます-
| シニア番号 | 方法と説明 | パラメーター | 
|---|---|---|
| 1 | open_spider(self, spider) スパイダーを開いたときに選択されます。 | spider(スパイダーオブジェクト)-開いたスパイダーを指します。 | 
| 2 | close_spider(self, spider) スパイダーが閉じているときに選択されます。 | spider(スパイダーオブジェクト)-閉じられたスパイダーを指します。 | 
| 3 | from_crawler(cls, crawler) クローラーの助けを借りて、パイプラインは信号やScrapyの設定などのコアコンポーネントにアクセスできます。 | クローラー(クローラーオブジェクト)-このパイプラインを使用するクローラーを指します。 | 
例
以下は、さまざまな概念で使用されるアイテムパイプラインの例です。
タグのないアイテムのドロップ
次のコードでは、パイプラインはVATを含まないアイテムの(価格)属性(excludes_vat属性)のバランスを取り、値札を持たないアイテムを無視します-
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)JSONファイルへのアイテムの書き込み
次のコードは、すべてのスパイダーから削られたすべてのアイテムを1つに保存します items.jlファイル。JSON形式のシリアル化された形式で1行に1つのアイテムが含まれています。ザ・JsonWriterPipeline クラスは、アイテムパイプラインの記述方法を示すためにコードで使用されます-
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 itemMongoDBへのアイテムの書き込み
Scrapy設定でMongoDBアドレスとデータベース名を指定でき、MongoDBコレクションにはアイテムクラスにちなんで名前を付けることができます。次のコードは、使用方法を説明していますfrom_crawler() リソースを適切に収集する方法-
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フィルタの複製
フィルタは繰り返されるアイテムをチェックし、すでに処理されたアイテムを削除します。次のコードでは、アイテムに一意のIDを使用していますが、スパイダーは同じ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アイテムパイプラインのアクティブ化
次のコードに示すように、そのクラスをITEM_PIPELINES設定に追加することにより、アイテムパイプラインコンポーネントをアクティブ化できます。整数値は、実行される順序でクラスに割り当てることができ(順序は低い値から高い値のクラスになります)、値は0〜1000の範囲になります。
ITEM_PIPELINES = {
   'myproject.pipelines.PricePipeline': 100,
   'myproject.pipelines.JsonWriterPipeline': 600,
}