Scrapy管道分隔文件夹/文件-抽象

Mat*_*nja 4 python scrapy scrapy-pipeline

我目前正在完成一个Scrapy项目,但是我的pipelines.py文件很长。

我注意到在我settings.py的管道中显示如下(修剪掉):

ITEM_PIPELINES = {
     'proj.pipelines.MutatorPipeline': 200,
     'proj.pipelines.CalculatorPipeline': 300,
     'proj.pipelines.SaveToFilePipeline': 500,
}
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法来纠正此问题。

1.)我创建了一个新的文件/文件夹,并尝试以相同的方式从管道中引用它。

Folder myPipelines/Test.py的类名为,TestPipeline然后在管道设置中引用为proj.myPipelines.Test.TestPipeline': 100,

这给我带来了错误。

然后我以为我可以导出模块并导入到当前模块中,pipelines.py它将从中获得参考。我__init__.pymyPipelines目录中添加了一个空然后添加,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'.
Run Code Online (Sandbox Code Playgroud)

提前谢谢了!

pau*_*rth 5

当您启动一个scrapy项目时,您将获得如下目录树:

$ scrapy startproject multipipeline
$ tree
.
??? multipipeline
?   ??? __init__.py
?   ??? items.py
?   ??? middlewares.py
?   ??? pipelines.py
?   ??? settings.py
?   ??? spiders
?       ??? example.py
?       ??? __init__.py
??? scrapy.cfg
Run Code Online (Sandbox Code Playgroud)

生成的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
Run Code Online (Sandbox Code Playgroud)

但是,您的项目比较松懈,可以引用任何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
Run Code Online (Sandbox Code Playgroud)

目录中的各个模块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
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关软件包的更多信息

这些__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,
}
Run Code Online (Sandbox Code Playgroud)