2017-06-01 26 views
1

我目前正在最後確定一個Scrapy項目,但我有一個相當長的pipelines.py文件。Scrapy管道分離文件夾/文件 - 抽象

我注意到,在我的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類作爲項目管道。一種選擇是將生成的單個文件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 

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

__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, 
}