爬蟲資料儲存--基於MonogoDB
"當然, 並不是所有資料都適合"
在學習爬蟲的過程中, 遇到過不少坑.
今天這個坑可能以後你也會遇到, 隨著爬取資料量的增加, 以及爬取的網站資料欄位的變化, 以往在爬蟲入門時使用的方法侷限性可能會驟增.
怎麼個驟增法?
Intro 引例
在爬蟲入門的時候, 我們爬取豆瓣電影Top250這些資料量並不是很大的網頁時(僅計算文字資料量), 通常無需考慮資料儲存的效率問題, 使用MySQL這些關係型資料庫, 或者用TXT, CSV等文字格式儲存, 都可以很快地儲存完畢, Spider也可以跟著快速關閉. 因此我們感覺不到上述方式的弊端.
起初, 我爬的資料量在幾千條時, 我選擇用MySQL作為資料儲存的資料庫,
爬取結束時, 儲存的時間花了幾秒, 我還沒有太在意.
但是當我爬取的資料量到了200M左右時, 問題非常明顯了. 此時用MySQL儲存, 半小時都無法關閉Spider! 如果新增了查重, 時間將會指數增長.
而使用CSV儲存, 雖然關閉花不了特別多時間, 但是開啟關閉檔案所需的時間同樣不少! Excel直接無法開啟, Sublime和VS Code則要花費十幾秒的時間來開啟.
圖 : 正在開啟CSV的Sublime Text
在後續對CSV中的資料進行基本的格式化後傳送到Django視覺化時, 開啟網頁的處理時間接近1分30秒. 速度感人.
感人的速度讓我意識到要換一種方式來儲存和處理資料, 本文僅對資料儲存部分做過相應測試.
我將眼光瞄準了NoSQL中的MongoDB.
What's NoSQL
關係型資料庫一直是計算機相關專業的必修課, 在過去的很長時間, 佔據了網際網路資料量的很大一部分. 但是隨著大資料時代到來, 關係型資料庫已然滿足不了某些大資料的處理要求.
NoSQL,指的是非關係型的資料庫。NoSQL也稱作Not Only SQL的縮寫,是對不同於傳統的關係型資料庫的資料庫管理系統的統稱。
NoSQL用於超大規模資料的儲存。這些型別的資料儲存不需要固定的模式,無需多餘操作就可以橫向擴充套件。
What's MongoDB
- MongoDB是一種非關係型資料庫, 是一個面向文件儲存的資料庫,操作起來比較簡單和容易.
- 可以通過本地或者網路建立資料映象,這使得MongoDB有更強的擴充套件性.
- MongoDB支援RUBY,Python,Java,C++,PHP,C#等多種語言
- Mongo支援豐富的查詢表示式。查詢指令使用JSON形式的標記,可輕易查詢文件中內嵌的物件及陣列
- 內建支援Map和Reduce函式, 可對資料進行批量和聚合操作.
Why MongoDB
將目光放在MongoDB這樣的文件型NoSQL身上, 是因為爬取的資料
- 對一致性要求不高
- 讀寫的速度要求較高
- 遇到資料欄位發生變化時, 可以更方便的新增欄位, 無需改變以前的資料結構.
How TO
1. Step 1 安裝MongoDB
安裝MongoDB, 參考文件https://docs.mongodb.com/manual/administration/install-community/
安裝pymongo, 如果你使用pip安裝方式, 直接在終端中鍵入pip install pymongo
安裝成功的檢測, 在python的shell中import pymongo
不報錯即可.
2. Step 2 新增專案配置
新增配置資訊
在Scrapy專案的settings.py
中新增以下程式碼
MONGO_HOST = "127.0.0.1" #主機IP
MONGO_PORT = 27017 #埠號
MONGO_DB = "Spider" #庫名
MONGO_COLL = "jobinfo" #collection名
# MONGO_USER = ""
# MONGO_PSW = ""
程式碼片中的埠號為預設埠號, 如果安裝後進行了修改, 以修改後為準, 庫名及Collection名同上.
MongoDB支援動態建立, 因此你並不需要提前建立資料庫和下屬的Collection
3. Step 3 啟用MongoDB儲存Pipeline
在你Scrapy專案的pipelines.py
中新增以下的方法(注意函式要寫在某個Pipeline類中, 並在settings.py
中啟用對應的Pipeline, 如果你已經啟用, 直接新增即可):
# 在Python中使用mongoDB的所需的包
import pymongo
# 配置mongoDB所需的包
from scrapy.conf import settings
def __init__(self):
# connect to db
self.client = pymongo.MongoClient(host=settings['MONGO_HOST'], port=settings['MONGO_PORT'])
# ADD if NEED account and password
# 當需要使用資料庫的使用者名稱和密碼, 取消以下的註釋, MongoDB支援直接查詢, 無需登入
# self.client.admin.authenticate(host=settings['MONGO_USER'], settings['MONGO_PSW'])
# 設定資料庫客戶端型別
self.db = self.client[settings['MONGO_DB']]
# 取得資料庫控制程式碼
self.coll = self.db[settings['MONGO_COLL']]
然後在同個檔案下處理item的函式末尾中新增以下程式碼:
def process_item(self, item, spider):
# .....
postItem = dict(item)
self.coll.insert(postItem)
# 在終端中顯示你的爬取資料
return item
4. Step 4 Enjoy
在終端中執行你的爬蟲, 待資料爬取完畢, Spider迅速關閉, 而資料已經寫入資料庫!
在終端中鍵入
# 切換資料庫
use Spider
# 查詢所有資料, pretty()函式用於格式化資料顯示
# jobinfo為collection名稱
db.jobinfo.find().pretty()
QQ聯絡: 994342122(不閒聊)
郵箱: fesonx@foxmail.com
歡迎關注我的騰訊雲
相關文章
- 【0基礎學爬蟲】爬蟲基礎之資料儲存爬蟲
- 爬蟲系列:使用 MySQL 儲存資料爬蟲MySql
- 併發爬蟲_使用motor儲存資料爬蟲
- Python爬蟲之使用MongoDB儲存資料Python爬蟲MongoDB
- 【0基礎學爬蟲】爬蟲基礎之檔案儲存爬蟲
- Python爬蟲學習筆記(三、儲存資料)Python爬蟲筆記
- 儲存資料到MySql資料庫——我用scrapy寫爬蟲(二)MySql資料庫爬蟲
- 爬蟲學習整理(3)資料儲存——Python對MySql操作爬蟲PythonMySql
- 【Python3網路爬蟲開發實戰】5-資料儲存-2-關係型資料庫儲存-1 MySQL儲存Python爬蟲資料庫MySql
- 【Python3網路爬蟲開發實戰】5-資料儲存-1 檔案儲存-1 TXT文字儲存Python爬蟲
- 【Python3網路爬蟲開發實戰】5-資料儲存-3-非關係型資料庫儲存-1 MongoDB儲存Python爬蟲資料庫MongoDB
- 【Python3網路爬蟲開發實戰】5-資料儲存-3-非關係型資料庫儲存-2 Redis儲存Python爬蟲資料庫Redis
- 【Python3網路爬蟲開發實戰】5-資料儲存-1 檔案儲存-2 JSON檔案儲存Python爬蟲JSON
- Elasticsearch 基於物件儲存使用快照資料遷移Elasticsearch物件
- Python爬蟲教程-14-爬蟲使用filecookiejar儲存cookie檔案(人人網)Python爬蟲CookieJAR
- 大資料元件-Hive部署基於MySQL作為後設資料儲存大資料元件HiveMySql
- 基於python的大資料分析-pandas資料儲存(程式碼實戰)Python大資料
- 基於 go + xpath 爬蟲小案例Go爬蟲
- 基於nodejs編寫小爬蟲NodeJS爬蟲
- 基於java的分散式爬蟲Java分散式爬蟲
- 資料儲存--檔案儲存
- 爬蟲實踐-基於Jsoup爬取Facebook群組成員資訊爬蟲JS
- Esxi 6.7基於已有資料儲存配置虛擬機器(Linux類)間共享儲存(非RDM)虛擬機Linux
- 基於 Lua 寫一個爬蟲程式爬蟲
- 爬蟲雙色球所有的歷史資料並儲存到SQLite爬蟲SQLite
- 關於InnoDB表資料和索引資料的儲存索引
- 資料儲存(1):從資料儲存看人類文明-資料儲存器發展歷程
- python基礎語法 - 資料儲存模型Python模型
- 基於儲存過程的百萬級測試資料自動生成儲存過程
- 爬蟲基礎爬蟲
- 基於python爬蟲技術對於淘寶的資料分析的設計與實現Python爬蟲
- 浪潮儲存基於智慧運維技術,加速儲存自治運維
- 基於nodejs網站爬蟲程式開發NodeJS網站爬蟲
- 基於asyncio、aiohttp、xpath的非同步爬蟲AIHTTP非同步爬蟲
- kunbernetes-基於NFS的儲存NFS
- 爬蟲原理與資料抓取爬蟲
- iOS 資料儲存iOS
- TiDB資料儲存TiDB