爬虫笔记(8)scrapy存数据进Mongodb

scrapy存入数据库的问题是个简单的问题,官方例子代码如下:

#pipelines.py
class MongoPipeline(object):

    collection_name = 'scrapy_items'

    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
        )

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def close_spider(self, spider):
        self.client.close()

    def process_item(self, item, spider):
        self.db[self.collection_name].insert(dict(item))
        return item

在scrapy执行完爬虫代码中的parse函数之后就会调用pipelines.py中的内容,这里调用的函数是process_item。如果parse返回Item或者dict就会被存入数据库中,Item这里还没有提到。当然可能还有疑问pipelines.py可能有多个类,到底选哪一个呢?这个需要去settings.py进行注册:

ITEM_PIPELINES = {
   'dy2018.pipelines.MongoPipeline': 300,
}

代码中需要解释的地方:

  • 1.@classmethod这个注解(java中是annotation),放在函数上面表明这个函数不需要实例化就能调用,这里的cls参数代表的类本身,所以cls(...)中的意思就很明白了,它会返回一个新的对象。还有这个类需要实例化的参数从哪来?还是从settings中来。
MONGO_URI = 'mongodb://localhost/'
#MONGO_DATABASE没有在设置文件中体现,而是直接就是'item'

你可能感兴趣的:(爬虫笔记(8)scrapy存数据进Mongodb)