关于python:什么触发了from_crawler类方法?

What triggers the from_crawler classmethod?

我使用的是Scrapy,我有以下函数管道类:

类dynamicsqllitepipeline(对象):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@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')

在我的蜘蛛里,我有:

1
2
3
4
5
6
custom_settings = {
    'ITEM_PIPELINES': {

        'myproject.pipelines.DynamicSQLlitePipeline': 600,
    }
}

从最近的一个问题中,我被指出了"cls"变量在Python类中的用途是什么?

如果我正确理解以便实例化管道对象(使用in it函数),它需要一个摘要号。只有在from_crawler类方法运行后,摘要号才可用。但是什么触发了"从爬虫"方法。代码又开始工作了。


类方法的调用方必须具有该类的实例。他们可以通过名字访问它,比如:

1
DynamicSQLlitePipeline.from_crawler(crawler)

…或:

1
sqlitepipeline.DynamicSQLlitePipeline.from_crawler(crawler)

或者,您可以将类对象传递给某人,然后他们将其存储并在以后像这样使用:

1
pipelines[i].from_crawler(crawler)

在Scrapy中,根据文档,在框架中注册一组管道的常用方法如下:

1
2
3
4
ITEM_PIPELINES = {
    'myproject.pipelines.PricePipeline': 300,
    'myproject.pipelines.JsonWriterPipeline': 800,
}

(另请参阅《扩展用户指南》,该指南解释了如何将此应用到零碎的项目中。)

假设您在没有向我们展示的代码中做了类似的事情,在该dict中放入了类似于'sqlscraper.pipelines.DynamicSQLlitePipeline'的东西。在某个时刻,scrapy会遍历该dict,按值对其排序,并实例化每个管道。(因为它有类的名称,作为一个字符串,而不是类对象,所以这有点复杂,但是细节在这里并不相关。)