爬虫類(2):Pipeline
Item Pipeline
SpeiderでItemが収集されると、Item Piplineに転送され、一部のコンポーネントは一定の順序でItemの処理を実行します.
各item pipelineコンポーネントは簡単な方法を実現したPythonクラスである.彼らはItemを受け入れ、それによっていくつかの行為を実行し、このitemがpipelineを通過し続けるか、または処理を行わずに廃棄されるかを決定します.
以下はitem piplineの典型的な応用です. HTMLデータをクリーンアップ 取得データの検証(itemに特定のフィールドが含まれていることを確認) 重量検査(廃棄) 取得結果をデータベースに保存する 自分のitem pipelineを書く
各item piplineコンポーネントは独立したPythonクラスであり、以下の方法を実装する必要があります.
各item piplineコンポーネントは、このメソッドを呼び出す必要があります.この方法は、データを持つdictオブジェクトまたはItemオブジェクト、またはDropItem例外を放出する必要があります.破棄されたitemは、その後のpipelineコンポーネントによって処理されません.
また、以下の方法も実現できます.
spiderがオンになると、この方法が呼び出されます.
パラメータ:spider(spiderオブジェクト)-開いているspider
spiderが閉じられると、このメソッドが呼び出されます.
パラメータ:spider(spiderオブジェクト)-閉じられたspider
この方法はcrawlerからpipelineの新しいオブジェクトを作成し、CrawlerはScrapyコアコンポーネント(settings、signalsなど)向けのすべての接続を提供し、これはpipelineが彼らを接続し、彼らの機能をScrapyに接続する重要な道である.
パラメータ:cralwer(clawlerオブジェクト)-このpipelineのcralwerを使用します.
Item pipelineサンプル
価格を検証し、価格のないitemを破棄
機能:税金(price_excludes_vatプロパティ)を含まないitemにpriceプロパティを調整し、価格のないitemを破棄します.
itemをJSONに書き込む
以下のpipelineは、すべての(すべてのspiderから)登ったitemを、JSON形式にシーケンス化されたitemに格納します.
itemsをMongoDBに書き込む
この例ではpymongoを使用してpymongoにitemsを書き、MongoDBのアドレスとデータベース名はScrapy settingsにあります.MongoDBコレクションはitemclassの後に命名されます.この例の主なポイントはfromの使い方を示すことですcrawler()メソッドと、リソースを正しくクリーンアップする方法.
重さを落とす
重さを除去するためのフィルタで、処理されたitemを廃棄します.私たちのitemには唯一のidがあると仮定しますが、spiderが返す複数のitemには同じidが含まれています.
Item Pipelineコンポーネントの有効化
Item Pipelineコンポーネントを有効にするには、そのクラスをITEM_に追加する必要があります.PIPELINES構成.
各クラスに割り当てられた整数値は、実行順序を決定し、itemは数値が低い順から高い順にpipelineを介して、通常、これらの数値を0-1000の範囲内に定義します.
SpeiderでItemが収集されると、Item Piplineに転送され、一部のコンポーネントは一定の順序でItemの処理を実行します.
各item pipelineコンポーネントは簡単な方法を実現したPythonクラスである.彼らはItemを受け入れ、それによっていくつかの行為を実行し、このitemがpipelineを通過し続けるか、または処理を行わずに廃棄されるかを決定します.
以下はitem piplineの典型的な応用です.
各item piplineコンポーネントは独立したPythonクラスであり、以下の方法を実装する必要があります.
process_item(self,item,spider)
各item piplineコンポーネントは、このメソッドを呼び出す必要があります.この方法は、データを持つdictオブジェクトまたはItemオブジェクト、またはDropItem例外を放出する必要があります.破棄されたitemは、その後のpipelineコンポーネントによって処理されません.
item(item dict)- item
spider(spider )- item spider
また、以下の方法も実現できます.
open_spider(self,spider)
spiderがオンになると、この方法が呼び出されます.
パラメータ:spider(spiderオブジェクト)-開いているspider
close_spider(self,spider)
spiderが閉じられると、このメソッドが呼び出されます.
パラメータ:spider(spiderオブジェクト)-閉じられたspider
from_crawler(cls,crawler)
この方法はcrawlerからpipelineの新しいオブジェクトを作成し、CrawlerはScrapyコアコンポーネント(settings、signalsなど)向けのすべての接続を提供し、これはpipelineが彼らを接続し、彼らの機能をScrapyに接続する重要な道である.
パラメータ:cralwer(clawlerオブジェクト)-このpipelineのcralwerを使用します.
Item pipelineサンプル
価格を検証し、価格のないitemを破棄
機能:税金(price_excludes_vatプロパティ)を含まないitemにpriceプロパティを調整し、価格のないitemを破棄します.
from scrapy.exception import DropItem
class PricePipeline(object):
var_factor=1.15
def process_item(self,item,spider):
if item['price']:
if item['price_excludes_vat']:
item['price']=item['price']*self.vat_factor
return item
else:
raise DropItem("Missing price in %s" %item )
itemをJSONに書き込む
以下のpipelineは、すべての(すべてのspiderから)登ったitemを、JSON形式にシーケンス化されたitemに格納します.
import json
class JsonWriterPipeline(object):
def__init__(self):
self.file=open('items.jl','wb')
def process_item(self,item,spider):
line=json.dump(dict(item))+"
"
self.file.writer(line)
return item
itemsをMongoDBに書き込む
この例ではpymongoを使用してpymongoにitemsを書き、MongoDBのアドレスとデータベース名はScrapy settingsにあります.MongoDBコレクションはitemclassの後に命名されます.この例の主なポイントはfromの使い方を示すことですcrawler()メソッドと、リソースを正しくクリーンアップする方法.
import pymongo
class MongoPipeline(object):
collection_name='scrapy_items'
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_DATABASE','items'
)
def open_spider(self,spider):
self.client=pymongo.MongoClient(self.mongo_uri)
self.db=self.client[self.mogo_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
重さを落とす
重さを除去するためのフィルタで、処理されたitemを廃棄します.私たちのitemには唯一のidがあると仮定しますが、spiderが返す複数のitemには同じidが含まれています.
from scrapy.exception import DropItem
class DuplicatePipeline(object):
def __init__(self):
self.ids_seen=set()
def process_item(self,item,spider):
if item['id'] in self.ids_seen:
raise DropItem("Duplicate item found: %s" %item)
else:
self.ids_seen.add(item['id'])
return item
Item Pipelineコンポーネントの有効化
Item Pipelineコンポーネントを有効にするには、そのクラスをITEM_に追加する必要があります.PIPELINES構成.
ITEM_PIPELINES={
'myproject.pipelines.PricePipeline':300,
'myproject.pipeline.JsonWriterPipeline':800,
}
各クラスに割り当てられた整数値は、実行順序を決定し、itemは数値が低い順から高い順にpipelineを介して、通常、これらの数値を0-1000の範囲内に定義します.