Scrapy from_settings和from_crawler类方法如何工作?

时间:2014-07-31 15:34:52

标签: scrapy class-method

我需要将以下类方法添加到现有管道中 http://doc.scrapy.org/en/latest/faq.html#i-m-getting-an-error-cannot-import-name-crawler

我不知道如何在我的班级中使用其中2个类方法

from twisted.enterprise import adbapi
import MySQLdb.cursors

class MySQLStorePipeline(object):
    """A pipeline to store the item in a MySQL database.
    This implementation uses Twisted's asynchronous database API.
    """
    def __init__(self, dbpool):
        self.dbpool = dbpool

    @classmethod
    def from_settings(cls, settings):
        dbargs = dict(
            host= settings['DB_HOST'],
            db= settings['DB_NAME'],
            user= settings['DB_USER'],
            passwd= settings['DB_PASSWD'],
            charset='utf8',
            use_unicode=True,
        )
        dbpool = adbapi.ConnectionPool('MySQLdb', **dbargs)
        return cls(dbpool)

    def process_item(self, item, spider):
        pass

1 个答案:

答案 0 :(得分:4)

根据我对class methods的理解,python类中的几个类方法应该只是fine。它只取决于呼叫者需要哪一个。但是,直到现在in scrapy pipelines我才看到from_crawler。从那里,您可以通过crawler.settings

访问设置

您确定需要from_settings吗?我没有检查所有出现,但在middleware.py优先级似乎适用:如果crawler对象可用且存在from_crawler方法,则执行此操作。否则,如果存在from_settings方法,则采用该方法。否则,将采用原始构造函数。

if crawler and hasattr(mwcls, 'from_crawler'):                  
    mw = mwcls.from_crawler(crawler)                            
elif hasattr(mwcls, 'from_settings'):                           
    mw = mwcls.from_settings(settings)                          
else:                                                           
    mw = mwcls()

我承认,我不知道这是否也是管道创建的地方(我猜不是,但没有pipelines.py),但实现似乎非常合理。

所以,我只是:

  • 将整个方法重新实现为from_crawler并仅使用该方法
  • 添加方法from_crawler并同时使用

新方法可能如下所示(尽可能少复制代码):

@classmethod
def from_crawler(cls, crawler):
    obj = cls.from_settings(crawler.settings)
    obj.do_something_on_me_with_crawler(crawler)
    return obj

当然这取决于你需要什么。