爬蟲筆記(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'
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容