Scrapy プロジェクトを開始すると、次のようなディレクトリ ツリーが表示されます。
$ scrapy startproject multipipeline
$ tree
.
├── multipipeline
│ ├── __init__.py
│ ├── items.py
│ ├── middlewares.py
│ ├── pipelines.py
│ ├── settings.py
│ └── spiders
│ ├── example.py
│ └── __init__.py
└── scrapy.cfg
そして、生成されたpipelines.py
ものは次のようになります。
$ cat multipipeline/pipelines.py
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
class MultipipelinePipeline(object):
def process_item(self, item, spider):
return item
ただし、scrapy プロジェクトは任意の Python クラスをアイテム パイプラインとして参照できます。1 つのオプションは、生成された 1 つのファイルのpipelines
モジュールを、サブモジュールを含む独自のディレクトリ内のパッケージに変換することです。__init__.py
ディレクトリ内のファイルに注目してくださいpipelines/
。
$ tree
.
├── multipipeline
│ ├── __init__.py
│ ├── items.py
│ ├── middlewares.py
│ ├── pipelines
│ │ ├── __init__.py
│ │ ├── one.py
│ │ ├── three.py
│ │ └── two.py
│ ├── settings.py
│ └── spiders
│ ├── example.py
│ └── __init__.py
└── scrapy.cfg
dir内の個々のモジュールは次のpipelines/
ようになります。
$ cat multipipeline/pipelines/two.py
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
import logging
logger = logging.getLogger(__name__)
class MyPipelineTwo(object):
def process_item(self, item, spider):
logger.debug(self.__class__.__name__)
return item
パッケージの詳細については、こちらをご覧ください。
これらの__init__.py
ファイルは、Python がディレクトリをパッケージを含むものとして扱うために必要です。これは、文字列などの共通名を持つディレクトリが、モジュール検索パスで後で発生する有効なモジュールを意図せず隠してしまうのを防ぐために行われます。最も単純なケースで__init__.py
は、空のファイルにすることもできますが、パッケージの初期化コードを実行したり__all__
、後で説明する変数を設定したりすることもできます。
そして、あなたsettings.py
には次のようなものが含まれます:
ITEM_PIPELINES = {
'multipipeline.pipelines.one.MyPipelineOne': 100,
'multipipeline.pipelines.two.MyPipelineTwo': 200,
'multipipeline.pipelines.three.MyPipelineThree': 300,
}