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
的article
collection:這樣就完成啦!
好的,知道如何將透過spider
將爬到的文章新增到資料庫,基本上我們已經理解整個爬蟲的流程了,明天會繼續介紹關聯式資料庫的應用!
那今天就到這裡!明天見!