【发布时间】:2018-09-11 05:54:27
【问题描述】:
我正在使用 scrapy,并且我有以下功能管道类:
类 DynamicSQLlitePipeline(object):
@classmethod
def from_crawler(cls, crawler):
# Here, you get whatever value was passed through the "table" parameter
docket = getattr(crawler.spider, "docket")
return cls(docket)
def __init__(self,docket):
try:
db_path = "sqlite:///"+settings.SETTINGS_PATH+"\\data.db"
db = dataset.connect(db_path)
table_name = docket[0:3] # FIRST 3 LETTERS
self.my_table = db[table_name]
except Exception:
# traceback.exec_print()
pass
def process_item(self, item, spider):
try:
test = dict(item)
self.my_table.insert(test)
print('INSERTED')
except IntegrityError:
print('THIS IS A DUP')
在我的蜘蛛中,我有:
custom_settings = {
'ITEM_PIPELINES': {
'myproject.pipelines.DynamicSQLlitePipeline': 600,
}
}
从最近的一个问题中,我被指向What is the 'cls' variable used for in Python classes?
如果我理解正确以便实例化管道对象(使用 init 函数),它需要一个案卷编号。只有在运行 from_crawler 类方法后,案卷编号才可用。但是是什么触发了 from_crawler 方法。代码再次运行。
【问题讨论】:
-
new_pipeline = DynamicSQLlitePipeline.from_crawler(crawler) -
您没有向我们展示的其他一些代码正在调用它,方法是执行
DynamicSQLlitePipeline.from_crawler(crawler)之类的操作。或者,也许,您将名称DynamicSQLlitePipeline传递给爬虫,它将其存储为pipeline_type,然后调用pipeline_type.from_crawler(crawler)。 -
@abarnert 添加了整个管道类。
-
不在管道类中。实际的调用代码在 Scrapy 内部,但是您需要一些代码来告诉它要构造哪些类以及将它们连接起来的顺序,而这就是您没有向我们展示的代码。我写了一个答案,试图用一般术语解释发生了什么,但如果你给我们minimal reproducible example,你会更容易理解。