根据项目类型在mongodb中使用不同的集合

时间:2013-10-29 09:14:25

标签: mongodb scrapy

我正在使用Scrapy抓取并抓取网站,并使用MongoDB中的项目管道将项目保存到scrapy-mongodb。这样做如何将不同类型的项目保存到不同的集合中?像例如类型PersonItem到集合persons以及类型BookItem到项目集books的项目?如果使用项目管道无法做到这一点你能想到另一种解决方案吗?

2 个答案:

答案 0 :(得分:0)

当然可以在(子类)MongoDBPipeline管道中使用。

以下未经过测试,但有一个选项是将self.collection更改为集合的dict,将项目类型映射到Mongo集合。

class CustomMongoDBPipeleine(MongoDBPipeline):

  def __init__(self, settings):
    ...
    mapping = {
        PersonItem: 'persons',
        BookItem: 'books',
    }
    self.collection = {}
    for itype, collection_name in mapping.items():
        self.collection[itype] = database[collection_name]

映射可以来自配置,并直接使用项类型类名而不是项类。

使用类似的东西:

    insert_item(self, item, spider):
        ...
        self.collection.get(type(item)).insert(item, continue_on_error=True)
        ...

答案 1 :(得分:0)

您还可以为每种类型创建两个不同的管道: 在pipelines.py

class PersonPipeline(object):
    def __init__(self):
        connection = pymongo.Connection(settings['MONGODB_SERVER'], settings['MONGODB_PORT'])
        db = connection[settings['MONGODB_DB']]
        self.collection = db[settings['MONGODB_PERSON_COLLECTION']] # use the person collection

    def process_item(self, item, spider):
        if not isinstance(item,PersonItem):
            return item # return the item to let other pipeline to handle it
        self.collection.insert(dict(item))

class BookPipeline(object):
    def __init__(self):
        connection = pymongo.Connection(settings['MONGODB_SERVER'], settings['MONGODB_PORT'])
        db = connection[settings['MONGODB_DB']]
        self.collection = db[settings['MONGODB_BOOK_COLLECTION']] # use the book collection

    def process_item(self, item, spider):
        if not isinstance(item,PersonItem):
            return item # return the item to let other pipeline to handle it
        self.collection.insert(dict(item))
settings.py中的

ITEM_PIPELINES = { # declare the handle sequence
    'myproject.pipelines.PersonPipeline':100,
    'myproject.pipelines.BookPipeline':200,
}
MONGODB_SERVER = "localhost"
MONGODB_PORT = 27017
MONGODB_DB = "MyDB" # db name
MONGODB_PLACE_COLLECTION = "persons" # collection name
MONGODB_LIST_COLLECTION = "books"

当一个项目返回时,PersonPipeline将首先处理它。如果该项不是PersonItem类型,则它将返回到下一个管道,在这种情况下是BookPipeline