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__.py在myPipelines目录中添加了一个空然后添加,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)
提前谢谢了!
当您启动一个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)