Scrapy-item-pipeline
スクレイピー-アイテムパイプライン
説明
- アイテムパイプライン*は、廃棄されたアイテムを処理する方法です。 アイテムがアイテムパイプラインに送信されると、アイテムはスパイダーによってスクレイピングされ、順次実行される複数のコンポーネントを使用して処理されます。
アイテムが受信されるたびに、次のアクションのいずれかを決定します-
- アイテムの処理を続けます。
- パイプラインからドロップします。
- アイテムの処理を停止します。
アイテムのパイプラインは、一般的に次の目的で使用されます-
- スクレイプされたアイテムをデータベースに保存します。
- 受け取ったアイテムが繰り返されると、繰り返されたアイテムがドロップされます。
- アイテムにターゲットフィールドがあるかどうかを確認します。
- HTMLデータを消去します。
構文
あなたは次の方法を使用してアイテムパイプラインを書くことができます-
process_item(self, item, spider)
上記の方法には、次のパラメータが含まれています-
- アイテム(アイテムオブジェクトまたはディクショナリ)-削り取られたアイテムを指定します。 *spider(spider object)-アイテムをこすったクモ。
次の表に示す追加の方法を使用できます-
Sr.No | Method & Description | Parameters |
---|---|---|
1 |
クモが開いているときに選択されます。 |
spider (spider object) − It refers to the spider which was opened. |
2 |
close_spider(self, spider) クモが閉じているときに選択されます。 |
spider (spider object) − It refers to the spider which was closed. |
3 |
from_crawler(cls, crawler) クローラーの助けを借りて、パイプラインはScrapyの信号や設定などのコアコンポーネントにアクセスできます。 |
crawler (Crawler object) − It refers to the crawler that uses this pipeline. |
例
以下は、さまざまな概念で使用されるアイテムパイプラインの例です。
タグのないアイテムのドロップ
次のコードでは、パイプラインは、VATを含まないアイテムの_(price)属性のバランスをとる(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ファイルへのアイテムの書き込み
次のコードは、すべてのスパイダーからのすべてのスクレイプアイテムを単一の 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 item
MongoDBへのアイテムの書き込み
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,
}