2017-06-01 10 views
1

私は現在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にインポートできたと思っていました。私は私のmyPipelinesディレクトリに空__init__.pyを添加し、次いで、from myPipelines.Test import TestPipelineを追加しましたが、scrapyはまだ事前に

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'. 

感謝...のエラーがスローされます!

答えて

1

あなたは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モジュールを、サブモジュールを持つ独自のディレクトリ内のパッケージに変換することです。 お知らせpipelines/ディレクトリ内のファイル__init__.py

$ 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 

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 

あなたはmore about packages hereを読むことができます。

ファイルは、Pythonが ディレクトリをパッケージを含むものとして扱うために必要です。これは、文字列などの共通名を持つ ディレクトリが意図せずに、モジュール検索パス上にある有効なモジュールを隠すのを防ぐために行われます。 最も単純なケースでは、__init__.pyは空のファイルでもかまいませんが、 もパッケージの初期化コードを実行したり、後で説明する__all__ 変数を設定することができます。

そして、あなたのsettings.py次のようなものが含まれます:

ITEM_PIPELINES = { 
    'multipipeline.pipelines.one.MyPipelineOne': 100, 
    'multipipeline.pipelines.two.MyPipelineTwo': 200, 
    'multipipeline.pipelines.three.MyPipelineThree': 300, 
} 
関連する問題