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'