iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 17
1
AI & Data

Scrapy爬蟲與資料處理30天筆記系列 第 17

[Day 17] Scrapy Item Pipeline 存入資料庫

Day 17
嗨,昨天說明了Item Pipeline的操作:透過Pipeline過濾重複內容、刪除空白(不存在文章)的內容,最後輸出成csv, json檔案。但我們可能會需要存到資料庫,所以今天我們就來介紹如何存入資料庫吧!

MongoDB

先來介紹MongoDB吧!它是屬於非關聯式資料庫,因靈活且易於擴充所以廣泛被應用,缺點是不保證資料一致性。本文章中不會深度探討MongoDB,我們會說明如何透過python操作MongoDB

要透過python存取MongoDB,可以使用pymongo

  • (option) 在開始之前,啟用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)
  • dbtest_database的資料庫物件
db = client.test_database
  • 建立test_collectionCollections
collection = db.test_collection
  • 定義Document
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_scrapyarticlecollection:

Imgur

這樣就完成啦!

好的,知道如何將透過spider將爬到的文章新增到資料庫,基本上我們已經理解整個爬蟲的流程了,明天會繼續介紹關聯式資料庫的應用!

那今天就到這裡!明天見!


上一篇
[Day 16] Scrapy Item Pipeline 應用
下一篇
[Day 18] 實戰:Scrapy爬旅遊新聞文章(1)
系列文
Scrapy爬蟲與資料處理30天筆記30

尚未有邦友留言

立即登入留言