爬虫类方法的工作?

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

我不知道如何在我的课堂中使用这些类方法中的两个

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

从我对类方法的理解中,python类中的几个类方法应该没问题。 这取决于调用者需要哪一个。 但是,直到现在,我在scrapy管道中才看到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
    

    当然,这取决于你需要的东西。

    链接地址: http://www.djcxy.com/p/54287.html

    上一篇: crawler class methods work?

    下一篇: Using raw input inside of a class (python 2.7)