Day 17
嗨,昨天說明了Item Pipeline的操作:透過Pipeline過濾重複內容、刪除空白(不存在文章)的內容,最後輸出成csv, json檔案。但我們可能會需要存到資料庫,所以今天我們就來介紹如何存入資料庫吧!
先來介紹MongoDB吧!它是屬於非關聯式資料庫,因靈活且易於擴充所以廣泛被應用,缺點是不保證資料一致性。本文章中不會深度探討MongoDB,我們會說明如何透過python操作MongoDB。
要透過python存取MongoDB,可以使用pymongo:
virtualenv:source path/to/your/virtualenv/bin/activate
若沒有pymongo套件,可用pip安裝:
pip3則將pip改成pip3
pip install pymongo
接下來為pymongo的範例:
MongoDB
from pymongo import MongoClient
client = MongoClient()
client = MongoClient('localhost', 27017)
db為test_database的資料庫物件db = client.test_database
test_collection的Collections
collection = db.test_collection
post = {"author": "Mike", 
        "text": "My first blog post!", 
        "tags": ["mongodb", "python", "pymongo"], "date": datetime.datetime.utcnow()}
Document新增到Collections
insert_data = collection.insert_one(doc).inserted_id
client.close()
mongoDB shell:> db.test_collection.find()
就可以看到新增的資料了!
{ "_id" : ObjectId("5bd42419ef150d251b4500c5"), "author" : "Mike", "text" : "My first blog post!", "tags" : [ "mongodb", "python", "pymongo" ], "date" : ISODate("2018-10-27T08:38:49.489Z") }
查看更多教學可以到 Tutorial — PyMongo 3.7.2 documentation
現在我們上面的程式碼mongodb新增到Item Pipeline內吧!
pipelines.py中新增MongoDBPipeline的類別class MongoDBPipeline:
    ...
open_spider : 開始爬之前先連接MongoDB並設定參數。process_item : 呼叫insert_article。insert_article : 新增資料到MongoDB內。close_spider : 爬取完全部後被呼叫,關閉連接。    def open_spider(self, spider):
        db_uri = spider.settings.get('MONGODB_URI', 'mongodb://localhost:27017')
        db_name = spider.settings.get('MONGODB_DB_NAME', 'ptt_scrapy')
        self.db_client = MongoClient('mongodb://localhost:27017')
        self.db = self.db_client[db_name]
    def process_item(self, item, spider):
        self.insert_article(item)
        return item
    def insert_article(self, item):
        item = dict(item)
        self.db.article.insert_one(item)
    def close_spider(self, spider):
        self.db_clients.close()
spider.settings.get用來取得在settings.py內的參數,所以我們要在settings.py新增參數:MONGODB_URI = 'mongodb://localhost:27017'
MONGODB_DB_NAME = 'ptt_scrapy'
ITEM_PIPELINES
ITEM_PIPELINES = {
   'myFirstScrapyProject.pipelines.MongoDBPipeline': 400,
}
接著可以執行scrapy crawl ptt!
ptt_scrapy的articlecollection:
這樣就完成啦!
好的,知道如何將透過spider將爬到的文章新增到資料庫,基本上我們已經理解整個爬蟲的流程了,明天會繼續介紹關聯式資料庫的應用!
那今天就到這裡!明天見!