4

現在、Scrapy プロジェクトを完成させていますが、非常に長いpipelines.pyファイルがあります。

settings.pyのパイプラインでは、次のように表示されていることに気付きました(トリミングされています):

ITEM_PIPELINES = {
     'proj.pipelines.MutatorPipeline': 200,
     'proj.pipelines.CalculatorPipeline': 300,
     'proj.pipelines.SaveToFilePipeline': 500,
}

これを修正するために、次の方法を試しました。

1.) 新しいファイル/フォルダーを作成し、同じ方法でパイプラインから参照しようとしました。

フォルダーにはmyPipelines/Test.pyクラス名がありTestPipeline、パイプライン設定で として参照されていましproj.myPipelines.Test.TestPipeline': 100,た。

これは私にエラーを投げました。

次に、モジュールをエクスポートして現在のモジュールにインポートするpipelines.pyと、そこから参照が取得されると考えました。ディレクトリに空を追加して__init__.pyから追加しましたが、スクレイピーはまだエラーをスローします...myPipelinesfrom myPipelines.Test import TestPipeline

Raise NameError("Module '%s' doesn't define any object named '%s'" % (module, name))
exceptions.NameError: Module 'proj.pipelines' doesn't define any object named 'TestPipeline'.

よろしくお願いします!

4

1 に答える 1

10

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,
}
于 2017-06-01T09:06:14.170 に答える